如何實現乙個UI系統

2021-09-05 17:57:33 字數 2169 閱讀 7450

如何為我的遊戲實現乙個ui系統,這個問題我想了很久,不過我現在可不像開始的時候那樣一點思路也沒有。如果你也被這個問題所困擾,我十分樂意與你分享這幾天來的學習成果。嘿嘿,我是不是有點得意忘形了?

在開始之前,我要提醒你,學而不思則惘。在看這篇文章的時候,請時刻保持頭腦清醒,如果有什麼不太明白的話,請停下一兩分鐘,好好想想,這篇文章可不是囫圇吞棗就能看懂的哦!此外這篇文章是建立在部分例項和猜測的基礎上的,可能存在著大量的不科學的想法和嚴重的錯誤,如果你在實踐的過程中出現了問題歡迎提問,如果你發現了其中的錯誤請你指出來,如果將來你發現被誤導了(當然我會盡力減小這種可能),請不要埋怨,因為是否繼續往下看是你自己的決定。

1、視窗

ui系統的表現形式是什麼?在開始前我們有必要弄清這個問題。

我們需要對話方塊、按鈕、單選按鈕、複選按鈕、滾動條、下拉列表……好了好了,想不到你一口氣竟能說出這麼多種視窗。是的,這些都是不同形式的視窗,ui系統正是靠著形形色色的視窗展示自己,請記住這一點。如果你還是不明白,就看一看msdn中的hierarchy chart。

2、理解windows的ui系統

windows這樣一套經典的圖形作業系統,我如果不拿它做例子,實在是有點兒對不住比爾大叔啊。

視窗都是矩形的,不要跟我說不規則視窗,其實那也是乙個矩形的,只不過有些地方沒有畫而已。既然是矩形,只要知道它的長和寬(width,height,有點兒不一樣是吧?windows裡叫寬和高),它就確定了。然後,你把它放在某個位置上,所以它又有了座標(xpos,ypos)。你的ui系統至少也要有這些資料,不然就沒法畫了。

然後是各式各樣的事件,當滑鼠經過的時候,按鈕變亮了;當你按下alt+f的時候,彈出了乙個選單。不管在windows裡是哪個裝置驅動把這些資訊告訴了ui系統,我們的確需要它,不是嗎?

乙個選單被按下然後乙個對話方塊彈了出來,是誰的結果?是滑鼠嗎?怎麼可能!當然是ui系統幹的。ui系統不僅要接受各種輸入裝置的資訊改變相應的外觀,它還要根據不同的操作產生訊息。選單按下時,windows會主動地往訊息佇列裡傳送乙個wm_command訊息。至於對話方塊是否會彈出來,就要看你是否對這個訊息進行處理了。

還有別的什麼嗎?

當然有啦,只是我也不很清楚,畢竟才研究了三四天嘛。不過我可以告訴你是什麼:那麼多不同型別的視窗,windows是怎麼區分的?這個問題很關鍵啦,窗體如何繪製,事件如何激發全都需要判斷的。比如說乙個普通按鈕和乙個單選按鈕,乙個按下之後要彈起來,另乙個要有乙個圓點,明顯的不同。既然都是視窗,windows是怎麼做到的呢?我在winuser.h裡面看到了大量關於style的巨集,我猜是用了case判斷,可是為每乙個視窗都作判斷也太麻煩了吧,還在研究中。。。

4、訊息對映及命令繞行

和封裝視窗類一樣,這也只是乙個輔助性的工作。這也是mfc的做法,如果你的遊戲不需要如此複雜的方法,或是你對此方法有成見的話就不要做了。也許,我真的有點偏離我的初衷,不像是在給我的遊戲實現乙個ui系統了。如果你想為類似dos的系統新增乙個gui的話,嘿嘿,x-window那樣子的。按本文的ui系統做也許會有點小用。

對於訊息對映和命令繞行,我說不好,看了兩天《深入淺出mfc》,才稍微有點明白,建議你自己去看。我只說一點不同之處,遊戲中mfc的方法不是完全適用的。mfc是乙個應用程式框架,mfc命令繞行的過程控制的是程式的全部,而遊戲的ui系統只是乙個輔助部分,不是全部,甚至可以去掉(我是說做到遊戲裡去,我猜95仙劍的選單就是和遊戲一體的)。ui系統要根據滑鼠鍵盤做出不同的反應,繪製不同的介面,它又不是程式的全部,所以你需要把每乙個可用(有用)的訊息都傳給ui系統。(不一定是全部的訊息,比如說我的ui只使用滑鼠操作,那就只傳遞wm_lbuttondown、wm_lbuttonup、wm_mousemove、wm_lbuttondblclk等等)

while(1)

// 在這裡新增你向ui系統傳遞訊息的**

ui_deciphermessage(&msg);

}else

}然後,做乙個僅使用在ui系統內部的訊息對映和命令繞行,它處理的是ui系統自己產生的訊息,或是改變一些視窗的顯示與關閉,或是向遊戲主要邏輯做出如使用物品、退出遊戲之類的訊號。是的,ui系統需要自己產生很多訊息,不要指望windows會主動因為你的控制項被按下而向訊息佇列裡傳送wm_command訊息,你得自己做這些,使用postmessage函式就可以了。有時候工作會更多,因為你面對的是windows的訊息佇列和ui系統自身的訊息佇列。

5、乙個例子

hohov5中的ui系統作為這篇文章的例子再合適不過了,可以說我的思路可能是被它干擾了。

自已實現乙個UI庫

2014年寫乙個ui庫時寫的幾個文章,發布出來 幾年前的乙個嵌入式的ui開發,使自己有機會接觸到了ui的一些底層知識,雖然之前也開發過很多windows下的資訊應用系統,也做很多的介面開發,但一直卻對ui的一些運作卻不了解。boss決定使用ucgui做為ui的基本庫來開發ui介面的一些應用。用ucg...

自已實現乙個UI庫 實現Windows的乙個模擬器

實現windows的乙個模擬器 接上一節的實現的介面,在windows裡面寫乙個簡單的模擬器,在上面能操作上一節裡面的介面動作。開啟vs,建立乙個解決方案,把ui的 作了乙個單獨的lib庫,再建立乙個帶窗體的工程,ui的畫圖就畫在乙個窗體的客戶區dc中.首先定義乙個對dc的畫圖操作,對應上一節的ui...

如何實現乙個檔案系統(六)

1 1 請參見 operation systems internals and design principles 一書第12章 2 2 扇區是磁碟的最小定址單元,而檔案塊是核心操作檔案的最小單位,乙個塊可以包含乙個或數個扇區。這些磁碟塊被讀入記憶體後即刻被存入緩衝中,同樣,檔案塊被寫出也要通過緩衝...