② 窗口的風格:
WS_MAINWND——應(yīng)用程序主窗口。關(guān)閉主窗口將自動關(guān)閉應(yīng)用程序。
WS_POPUP——彈出式窗口。單擊非窗口區(qū)域?qū)⒆詣雨P(guān)閉該窗口。該屬性不能和WS_MAINWND同時出現(xiàn)。
WS_NOBORDER——無邊框窗口。
WS_NOSTATEBAR——無狀態(tài)條控件的窗口。一般窗口均有一個在窗口底部的狀態(tài)條,提供彈出該窗口的命令菜單、顯示窗口標題、關(guān)閉窗口、打開選擇輸入法、顯示系統(tǒng)日期和時間等功能。
、 WS_POPUP類窗口的屏幕活動區(qū)和窗口活動區(qū)的ID。
、 窗口當前的光標位置。
⑤ 窗口中控件的列表。
、 窗口保存其覆蓋區(qū)域的內(nèi)存指針。
、 前一個窗口的指針。用以在關(guān)閉窗口時重設(shè)應(yīng)用程序的頂層窗口。
、 窗口的缺省輸入法類型和打開的輸入法控件的句柄。
、 窗口的焦點控件的句柄。焦點控件將最先處理字符輸入的消息。
⑩ 窗口的消息處理函數(shù)指針。
3.2 窗口的創(chuàng)建和操作函數(shù)介紹
、 HWND CreateWindow(WNDCLASS &wndCls);
WNDCLASS結(jié)構(gòu)定義窗口的基本屬性,如位置、大小、標題、風格等,見上面所述。該函數(shù)為窗口運行時的結(jié)構(gòu)分配內(nèi)存,初始化屬性,并返回窗口結(jié)構(gòu)的指針。
② BOOL ShowWindow(HWND hWnd);
顯示一個窗口。其工作包括:掛起以前的活動區(qū);保存窗口的覆蓋區(qū)域的圖形;如果是有WS_POPUP屬性的窗口,須設(shè)定屏幕和窗口的活動區(qū);向該窗口的消息處理函數(shù)傳遞WM_ONSHOW消息(事實上是直接調(diào)用該函數(shù)),以提供編程人員在窗口上繪制控件以外的圖形的機會;如果是沒有WS_NOSTATEBAR的窗口,添加Statebar控件;依次調(diào)用窗口中各控件的繪制函數(shù)以顯示控件;設(shè)第一個有焦點控件為窗口當前的焦點控件。
、 BOOL CloseWindow(HWND hWnd);
關(guān)閉一個窗口。其工作包括:向該窗口的事件處理函數(shù)發(fā)送WM_CLOSE消息,如果返回FALSE則退出本函數(shù),如果返回TRUE則繼續(xù)以下工作 ——恢復(fù)窗口覆蓋區(qū)圖形;釋放POPUP類窗口的屏幕活動區(qū)和窗口活動區(qū); 依次釋放該窗口包含的控件;隱藏光標;釋放該窗口結(jié)構(gòu)占用的內(nèi)存;向上層窗口發(fā)送WM_TOPWNDCLOSE的消息,該消息用于下層窗口更新需要自動變化的界面,如股票實時大盤數(shù)據(jù)表;設(shè)置該窗口的前一層窗口為應(yīng)用程序的頂層窗口。
、 WNDPROC函數(shù)指針類型。
typedef BOOL (*WNDEVENTHANDLE)
(HWND hWnd, U16 msgType, U32 id,P_U32 data, U32 size);
⑤ DefWndProc(HWND hWnd, U16 msgType, U32 id,P_U32 data, U32 size);
處理如POPUP窗口區(qū)外的點擊自動關(guān)閉窗口之類的消息和行為。
⑥U32 WndAddCommand(HWND hWnd, P_S8 cmdName, U16 cmdLen, P_U8 cmdIcon);
向有狀態(tài)條控件的窗口增加應(yīng)用程序定義的命令。命令出現(xiàn)在狀態(tài)條的彈出菜單中。該函數(shù)返回一個唯一的命令I(lǐng)D,用于窗口處理WM_COMMAND消息時區(qū)分命令。
、 BOOL WndDelCommand(HWND hWnd, HCMD cmdId);
刪除一條命令。
⑧ U32 WndSetCommand(HWND, U32 cmdId, P_S8 newCaption);
修改一條命令。
、 其它函數(shù)。因篇幅原因,不能完全列出和解釋所有的窗口操作函數(shù)。
3.3 控件的實現(xiàn)
。1) 控件的基本結(jié)構(gòu)
我們使用控件的基本結(jié)構(gòu)定義各類控件的公共屬性。具體的控件結(jié)構(gòu)在此基礎(chǔ)上擴展,以包含其它屬性。以下論述控件的基本屬性。
首先,在窗口的顯示過程中,各控件的外觀由自己繪制,因而各種控件需要一個繪制函數(shù)。該函數(shù)在定義具體控件時定義,在控件結(jié)構(gòu)中保留該類函數(shù)的指針。其次,各種控件需要各自的消息處理函數(shù),該函數(shù)的指針也保存在結(jié)構(gòu)中。最后,一些控件可能會動態(tài)分配內(nèi)存空間以保存自身的數(shù)據(jù)?丶枰诒会尫艜r釋放這樣的內(nèi)存,因而控件結(jié)構(gòu)中也保存控件釋放函數(shù)的指針。
控件是窗口上的一個可操作區(qū)域,主要由筆輸入來操作,因而控件需要響應(yīng)筆操作的活動區(qū)。各種控件的活動區(qū)數(shù)量不同,因而在控件結(jié)構(gòu)中需要保存一個可增長的活動區(qū)列表;但控件的屏幕區(qū)域可能覆蓋部分窗口中的其它活動區(qū)(如其它控件),從而造成控件操作的混亂,因此需要一個控件占用區(qū)域的活動區(qū),以屏蔽其它可能造成干擾的活動區(qū)。
由于我們需要各種控件能在定義新控件時使用,即作為新控件的子控件,在控件的結(jié)構(gòu)中,須保存子控件列表。各類控件的繪圖、消息處理和釋放函數(shù),必須為控件系統(tǒng)定義的相應(yīng)的缺省處理函數(shù)。這些缺省處理函數(shù)根據(jù)控件的子控件列表,首先調(diào)用子控件的相應(yīng)函數(shù)。
。2) 具體控件定義的方法
、 一個具體的控件對應(yīng)一個特定的結(jié)構(gòu)。該結(jié)構(gòu)首先包含控件的基本結(jié)構(gòu),其次定義該控件所需要的其它屬性。如按鍵控件,需要有按鍵的類型、顯示的文本或圖形、筆操作所需的活動區(qū)ID和按下狀態(tài)等屬性。
、 定義控件的繪制、消息處理和釋放函數(shù)。
、 定義該控件的創(chuàng)建函數(shù),如CreateButton()。在該函數(shù)的參數(shù)中包含該控件所需的初始屬性、參數(shù)中標準的部分是控件的位置和大小。該函數(shù)初始化該控件結(jié)構(gòu)的屬性,包括初始化在基本控件結(jié)構(gòu)中的控件繪制、消息處理和釋放函數(shù)指針,使之指向相應(yīng)的函數(shù)。
、 定義操作控件、存取控件中數(shù)據(jù)所需的其它函數(shù)。
(3)系統(tǒng)預(yù)定義的控件
在系統(tǒng)中,已經(jīng)使用這種定義方式定義了一些常用的控件。它們有:
、 按鍵:Button。文本或圖形按鍵,Check方式按鍵。
、 標簽:Label。
、 復(fù)選框:CheckBox。
、 單選框:RadioBox。
⑤ 組合框:CombBox。
、 滾動條:ScrollBar。水平或垂直,簡單類型滾動條可作為Spin使用。
⑦ 編輯框:TextBox。單行或多行,可編輯或不可編輯,有選塊功能。
、 列表框:ListBox。單列或多列,選項可帶有圖標。
、 狀態(tài)條:StateBar。含有命令菜單彈出按鍵、窗口關(guān)閉按鍵(在窗口關(guān)閉按鍵上顯示窗口標題)、輸入法按鍵、輸入法選擇按鍵、日期和時間顯示區(qū)。
日歷控件:Canlendar。顯示任意年月的日期,可切換公歷和農(nóng)歷。
組合日歷控件:Date。單行顯示日期,有彈出日歷的按鍵。
電子表格:Excel。顯示數(shù)據(jù)庫的記錄,可按每列對應(yīng)的字段排序。
組控件:Group。用于控件分組。
3.4 菜單系統(tǒng)
菜單是通過在POPUP窗口中加入ListBox控件實現(xiàn)的。菜單窗口的消息處理函數(shù)在用戶選擇列表框項目后自動關(guān)閉,并向應(yīng)用程序發(fā)送WM_ MENUCLICK消息。該消息帶有選項的序號。
使用PopupMenu()函數(shù)彈出菜單。PopupMenu()函數(shù)根據(jù)列表的項目數(shù)和列表文本的最大寬度,確定窗口的大小,創(chuàng)建窗口并添加列表框控件,在指定的位置顯示。
參考文獻
1 Motorola公司. PPSM程序員指南(PPSM Programmer’s Manual V3.1). http://apspg.motorola.com/products/dragonballez/dragonball.html#ppsm





