1. 程式人生 > >實現你自己的UI系統-模擬篇

實現你自己的UI系統-模擬篇

 這幾天的心情不好,在猜測研究windows介面系統工作機理的時候總是會發現自己知識上這樣那樣的不足。有時候思路挺清楚的,可敲了半天就是寫不出合適的程式碼來。這時才恍然大悟,我所缺少的不是遊戲的理論,而是對語法本身的認知度啊。無奈,基本語法書都落在了學校裡。。。

吃過午飯,截了幾張圖,總算是把模擬篇的例項修補出來了。此文也許只能算是這個程式的導讀,所以趕快下下原始碼來編譯一下吧。http://dl2.csdn.net/down4/20070801/01172507614.rar

效果是不是像個記事本,就是不能移動,哈哈。問號可以開啟關於對話方塊,叉叉可以退出程式。全是用圖片實現的,UI系統中最基本的三種顯示方式是幾何圖形、圖片、文字,當然是我選擇的圖片方式最為簡單,但用圖片的缺點就是變化少,適用於不太需要複雜UI介面的遊戲。

在開始前,我認為有必要複習一下windows建立視窗應用程式的過程。首先要定義一個視窗類,然後註冊這個視窗類,接著就可以用CreateWindow()建立視窗了。其中最重要的兩個值是視窗類的樣式和CreateWindow()中的視窗樣式引數,它們直接決定了建立的視窗的外觀。

這個例項的目的只是簡單的模仿windows的介面系統,很多地方都簡化掉了。簡化的有視窗類、視窗樣式的型別、視窗的操作等等。

我想windows應該是基於C和彙編的,而不是像java那樣寫程式就要建立各式各樣的物件,所以我使用結構體連結串列儲存了整個UI系統的關係。

struct JWnd{
 int xPos;
 int yPos;
 int Width;
 int Height;
 JWnd *Parent;
 JWnd *ChildList;
 JWnd *Next;
 unsigned long Style; // 這是簡化的樣式,把視窗類都省了,1、一個矩形的視窗用圖片填充 2、一個圖片按鈕 3、靜態文字
 unsigned long ID;  // 留著傳訊息用呢!
 char *text;
 LP_BITMAPX picture; // 所有情況的圖片都在這裡了
// unsigned short TextColor;
 PIXEL TextColor;
// unsigned short BGColor;
 PIXEL BGColor;
 bool Visible;
};
這裡我使用了指標代表一個視窗,而windows中使用的是控制代碼,我沒有去研究控制代碼到底包含了哪些資訊,功能肯定更多,既然是簡化模擬我用指標代替也說得過去。

對應CreateWindow()函式我寫了JCreateWindow()來向UI系統新增視窗,使用方法類似。函式內部程式碼也比較簡單,主要是對連結串列的操作和視窗屬性的設定,返回只是指向新生成的視窗的指標,windows返回的是個控制代碼,很像吧。

使用JSendMessage()向UI系統傳訊息,對滑鼠事件的響應也是在這裡處理的。因為是簡化的,所以程式碼不多,一個是修改全域性的滑鼠座標變數的值,一個是用PostMessage傳送訊息,滑鼠點選的響應就是靠它向訊息佇列裡傳送訊息呢,為了簡化這裡用的是windows的訊息佇列。

使用JShow()畫影象。
因為視窗中存放的是自己與父視窗的相對座標,所以在出現視窗的多層巢狀的時候就需要把相對座標轉化絕對座標,或者犧牲空間多儲存一個絕對座標。我不建議使用後者,除了空間的因素外,建立時的計算量也加大了。至於如何進行座標的轉化,我在JShow中使用的是遞迴的方法。

仔細的看過我的程式碼,你不難發現,我沒有回收記憶體。是的,由於時間的原因,我省略了那部分程式碼。

這個例子是為了給那些對上一篇文章不太明白的朋友一個形象的說明,功能和程式碼都不十分完善,下一次我將使用C++的方法重寫這個程式。如果你有興趣,可以試著用MFC的方法對上面的函式進行封裝。提示:MFC基本沒有涉及到圖形繪製的問題,MFC在內部就是呼叫SDK的函式完成諸如建立各種視窗的工作的。