?? 基于 linux 和 minigui 的嵌入式系統軟件開發指南(三).htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0053)http://www.pocketix.com/documents/tech/2001081001.htm -->
<HTML><HEAD><TITLE>基于 Linux 和 MiniGUI 的嵌入式系統軟件開發指南(三)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=en-us>
<META content="MSHTML 6.00.2719.2200" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId><!--使鼠標指向鏈接顯示紅色和加上下劃線-->
<STYLE type=text/css>TD {
FONT-SIZE: 10pt; LINE-HEIGHT: 19px; FONT-FAMILY: 宋體
}
P {
FONT-SIZE: 10pt; FONT-FAMILY: 宋體
}
A:visited {
FONT-SIZE: 10pt; FONT-FAMILY: 宋體; TEXT-DECORATION: none
}
A:link {
FONT-SIZE: 10pt; FONT-FAMILY: 宋體; TEXT-DECORATION: none
}
A:hover {
FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: "宋體"; TEXT-DECORATION: underline
}
</STYLE>
</HEAD>
<BODY leftMargin=6 topMargin=5>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=690
borderColorLight=#000000 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left><IMG height=60 alt=logo
src="基于 Linux 和 MiniGUI 的嵌入式系統軟件開發指南(三).files/pocketix_com_logo.gif"
width=220 border=0></TD>
<TD vAlign=center align=middle width=468>
<SCRIPT language=JavaScript
src="基于 Linux 和 MiniGUI 的嵌入式系統軟件開發指南(三).files/demo_1_banner.js"></SCRIPT>
</TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=center>
<CENTER>
<TABLE height=15 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%" background=""
height=15></TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=left>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR height=20>
<TD width="100%"></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="100%">
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD align=middle width="100%"><FONT size=3>基于 Linux 和 MiniGUI
的嵌入式系統軟件開發指南(三)<BR>對話框和控件編程 <BR></FONT><FONT
color=#999999>2001-08-10 嵌入式Linux 報道</FONT></TD></TR>
<TR>
<TD vAlign=top align=middle width="100%">
<HR SIZE=1>
</TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%"><FONT face=宋體> 本文講述 MiniGUI
中的對話框和控件編程。首先講解 MiniGUI 中的控件類和控件實例的關系,并舉例說明控件子類化的概念及應用;其次講解 MiniGUI
對話框的編程技術,包括對話框模板的定義和對話框回調函數的編程;最后解釋模態對話框和非模態對話框之間的區別。</FONT>
<P><FONT face=宋體> <A name=1><SPAN class=atitle2>1
引言</SPAN></A></FONT></P>
<P><FONT face=宋體>
對話框編程是一個快速構建用戶界面的技術。通常,我們編寫簡單的圖形用戶界面時,可以通過調用 CreateWindow
函數直接創建所有需要的子窗口,即控件。但在圖形用戶界面比較復雜的情況下,每建立一個控件就調用一次 CreateWindow
函數,并傳遞許多復雜參數的方法很不可取。主要原因之一,就是程序代碼和用來建立控件的數據混在一起,不利于維護。為此,一般的 GUI
系統都會提供一種機制,利用這種機制,通過指定一個模板,GUI 系統就可以根據此模板建立相應的主窗口和控件。MiniGUI
也提供這種方法,通過建立對話框模板,就可以建立模態或者非模態的對話框。</FONT></P>
<P><FONT face=宋體>
本文首先講解組成對話框的基礎,即控件的基本概念,然后講解對話模板的定義,并說明模態和非模態對話框之間的區別以及編程技術。</FONT></P>
<P><FONT face=宋體> <A name=2><SPAN class=atitle2>2
控件和控件類</SPAN></A></FONT></P>
<P><FONT face=宋體>
許多人對控件(或者部件,widget)的概念已經相當熟悉了。控件可以理解為主窗口中的子窗口。這些子窗口的行為和主窗口一樣,即能夠接收鍵盤和鼠標等外部輸入,也可以在自己的區域內進行輸出――只是它們的所有活動被限制在主窗口中。MiniGUI
也支持子窗口,并且可以在子窗口中嵌套建立子窗口。我們將 MiniGUI 中的所有子窗口均稱為控件。</FONT></P>
<P><FONT face=宋體> 在 Windows 或 X Window
中,系統會預先定義一些控件類,當利用某個控件類創建控件之后,所有屬于這個控件類的控件均會具有相同的行為和顯示。利用這些技術,可以確保一致的人機操作界面,而對程序員來講,可以像搭積木一樣地組建圖形用戶界面。MiniGUI
使用了控件類和控件的概念,并且可以方便地對已有控件進行重載,使得其有一些特殊效果。比如,需要建立一個只允許輸入數字的編輯框時,就可以通過重載已有編輯框而實現,而不需要重新編寫一個新的控件類。</FONT></P>
<P><FONT face=宋體> 如果讀者曾經編寫過 Windows
應用程序的話,應該記得在建立一個窗口之前,必須確保系統中存在新窗口所對應的窗口類。在 Windows
中,程序所建立的每個窗口,都對應著某種窗口類。這一概念和面向對象編程中的類、對象的關系類似。借用面向對象的術語,Windows
中的每個窗口實際都是某個窗口類的一個實例。在 X Window 編程中,也有類似的概念,比如我們建立的每一個 Widget,實際都是某個
Widget 類的實例。</FONT></P>
<P><FONT face=宋體>
這樣,如果程序需要建立一個窗口,就首先要確保選擇正確的窗口類,因為每個窗口類決定了對應窗口實例的表象和行為。這里的表象指窗口的外觀,比如窗口邊框寬度,是否有標題欄等等,行為指窗口對用戶輸入的響應。每一個
GUI
系統都會預定義一些窗口類,常見的有按鈕、列表框、滾動條、編輯框等等。如果程序要建立的窗口很特殊,就需要首先注冊一個窗口類,然后建立這個窗口類一個實例。這樣就大大提高了代碼的可重用性。</FONT></P>
<P><FONT face=宋體> 在 MiniGUI
中,我們認為主窗口通常是一種比較特殊的窗口。因為主窗口代碼的可重用性一般很低,如果按照通常的方式為每個主窗口注冊一個窗口類的話,則會導致額外不必要的存儲空間,所以我們并沒有在主窗口提供窗口類支持。但主窗口中的所有子窗口,即控件,均支持窗口類(控件類)的概念。MiniGUI
提供了常用的預定義控件類,包括按鈕(包括單選鈕、復選鈕)、靜態框、列表框、進度條、滑塊、編輯框等等。程序也可以定制自己的控件類,注冊后再創建對應的實例。表
1 給出了 MiniGUI 預先定義的控件類和相應類名稱定義。</FONT></P>
<P><FONT face=宋體> 表 1 MiniGUI
預定義的控件類和對應類名稱</FONT></P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=1>
<TBODY>
<TR>
<TD><FONT face=宋體>控件類</FONT></TD>
<TD><FONT face=宋體>類名稱</FONT></TD>
<TD><FONT face=宋體>宏定義</FONT></TD>
<TD><FONT face=宋體>備注</FONT></TD></TR>
<TR>
<TD><FONT face=宋體>靜態框</FONT></TD>
<TD><FONT face=宋體>"static"</FONT></TD>
<TD><FONT face=宋體>CTRL_STATIC</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>按鈕</FONT></TD>
<TD><FONT face=宋體>"button"</FONT></TD>
<TD><FONT face=宋體>CTRL_BUTTON</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>列表框</FONT></TD>
<TD><FONT face=宋體>"listbox"</FONT></TD>
<TD><FONT face=宋體>CTRL_LISTBOX</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>進度條</FONT></TD>
<TD><FONT face=宋體>"progressbar"</FONT></TD>
<TD><FONT face=宋體>CTRL_PRORESSBAR</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>滑塊</FONT></TD>
<TD><FONT face=宋體>"trackbar"</FONT></TD>
<TD><FONT face=宋體>CTRL_TRACKBAR</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>單行編輯框</FONT></TD>
<TD><FONT face=宋體>"edit"、"sledit"</FONT></TD>
<TD><FONT face=宋體>CTRL_EDIT、CTRL_SLEDIT</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>多行編輯框</FONT></TD>
<TD><FONT face=宋體>"medit"、"mledit"</FONT></TD>
<TD><FONT face=宋體>CTRL_MEDIT、CTRL_MLEDIT</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>工具條</FONT></TD>
<TD><FONT face=宋體>"toolbar"</FONT></TD>
<TD><FONT face=宋體>CTRL_TOOLBAR</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>菜單按鈕</FONT></TD>
<TD><FONT face=宋體>"menubutton"</FONT></TD>
<TD><FONT face=宋體>CTRL_MENUBUTTON</FONT></TD>
<TD><FONT face=宋體> </FONT></TD></TR>
<TR>
<TD><FONT face=宋體>樹型控件</FONT></TD>
<TD><FONT face=宋體>"treeview"</FONT></TD>
<TD><FONT face=宋體>CTRL_TREEVIEW</FONT></TD>
<TD><FONT face=宋體>包含在 mgext 庫,即MiniGUI 擴展庫中。</FONT></TD></TR>
<TR>
<TD><FONT face=宋體>月歷控件</FONT></TD>
<TD><FONT face=宋體>"monthcalendar"</FONT></TD>
<TD><FONT face=宋體>CTRL_MONTHCALENDAR</FONT></TD>
<TD><FONT face=宋體>同上</FONT></TD></TR>
<TR>
<TD><FONT face=宋體>旋鈕控件</FONT></TD>
<TD><FONT face=宋體>"spinbox"</FONT></TD>
<TD><FONT face=宋體>CTRL_SPINBOX</FONT></TD>
<TD><FONT face=宋體>同上</FONT></TD></TR></TBODY></TABLE>
<P><FONT face=宋體> 在 MiniGUI 中,通過調用 CreateWindow
函數,可以建立某個控件類的一個實例。控件類既可以是表 1 中預定義 MiniGUI 控件類,也可以是用戶自定義的控件類。與
CreateWindow 函數相關的幾個函數的原型如下(include/window.h):</FONT>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE><FONT face=宋體>
904 HWND GUIAPI CreateWindowEx (const char* spClassName, const char* spCaption,
905 DWORD dwStyle, DWORD dwExStyle, int id,
906 int x, int y, int w, int h, HWND hParentWnd, DWORD dwAddData);
907 BOOL GUIAPI DestroyWindow (HWND hWnd);
908
909 #define CreateWindow(class_name, caption, style, id, x, y, w, h, parent, add_data) \
910 CreateWindowEx(class_name, caption, style, 0, id, x, y, w, h, parent, add_data)
</FONT></CODE></PRE></TD></TR></TBODY></TABLE>
<P><FONT face=宋體> CreateWindow
函數建立一個子窗口,即控件。它指定了控件類、控件標題、控件風格,以及窗口的初始位置和大小。該函數同時指定子窗口的父窗口。CreateWindowEx
函數的功能和 CreateWindow 函數一致,不過,可以通過 CreateWindowEx
函數指定控件的擴展風格。DestroyWindow 函數用來銷毀用上述兩個函數建立的控件或者子窗口。</FONT> </P>
<P><FONT face=宋體> 清單 1
中的程序,利用預定義控件類創建控件。其中hStaticWnd1 是建立在主窗口 hWnd
中的靜態框;hButton1、hButton2、hEdit1、hStaticWnd2則是建立在 hStaicWnd1
內部的幾個控件,并作為 hStaticWnd1 的子控件而存在,建立了兩個按鈕、一個編輯框和一個靜態按鈕;而 hEdit2 是
hStaicWnd2 的子控件,是 hStaticWnd1 的子子控件。</FONT> </P>
<P><FONT face=宋體> 清單1 利用預定義控件類創建控件</FONT>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE><FONT face=宋體>
#define IDC_STATIC1 100
#define IDC_STATIC2 150
#define IDC_BUTTON1 110
#define IDC_BUTTON2 120
#define IDC_EDIT1 130
#define IDC_EDIT2 140
int ControlTestWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
static HWND hStaticWnd1, hStaticWnd2, hButton1, hButton2, hEdit1, hEdit2;
switch (message) {
case MSG_CREATE:
{
hStaticWnd1 = CreateWindow (CTRL_STATIC,
"This is a static control",
WS_CHILD | SS_NOTIFY | SS_SIMPLE | WS_VISIBLE | WS_BORDER,
IDC_STATIC1,
10, 10, 180, 300, hWnd, 0);
hButton1 = CreateWindow (CTRL_BUTTON,
"Button1",
WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
IDC_BUTTON1,
20, 20, 80, 20, hStaticWnd1, 0);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -