第11講 嵌入式MINIGUI編程_第1頁
第11講 嵌入式MINIGUI編程_第2頁
第11講 嵌入式MINIGUI編程_第3頁
第11講 嵌入式MINIGUI編程_第4頁
第11講 嵌入式MINIGUI編程_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、2 新建工程目錄samples 在新建目錄下,再新建子目錄src3 在新建工程目錄下拷貝如下內(nèi)容: cp /PCminigui/modified/configure.in ./ cp /PCminigui/modified/autogen.sh ./ cp /PCminigui/modified/setup.sh ./ cp /PCminigui/modified/Makefile.am ./4在新建工程目錄的src目錄下拷貝如下內(nèi)容: cp /PCminigui/modified/src/Makefile.am ./ cp /目標(biāo)目錄/*.c *.h ./src mv *.c name.c

2、mv *.h name.h并根據(jù)需要修改Makefile.am文件。5工程編譯第一步:./autogen.sh運行autogen.sh腳本,從而生成configure腳本。工程編譯第二步:./setup.sh運行setup.sh腳本,從而生成Makefile文件。工程編譯第三步:make此步將生成可執(zhí)行程序name6 新建工程目錄samples 在新建目錄下,再新建子目錄src7 在新建工程目錄下拷貝如下內(nèi)容: cp /minigui/modified/configure.in ./ cp /minigui/modified/autogen.sh ./ cp /minigui/modified

3、/setup.sh ./ cp /minigui/modified/Makefile.am ./8在新建工程目錄的src目錄下拷貝如下內(nèi)容: cp /minigui/modified/src/Makefile.am ./ cp /目標(biāo)目錄/*.c *.h ./src mv *.c name.c mv *.h name.h并根據(jù)需要修改Makefile.am文件。9工程編譯第一步:./autogen.sh運行autogen.sh腳本,從而生成configure腳本。工程編譯第二步:vi configure修改configuer腳本,從而生成用于交叉編譯的Makefile文件。加入以下工具鏈制定:

4、 CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc CPP=/usr/local/arm/3.4.1/bin/arm-linux-cpp LD=/usr/local/arm/3.4.1/bin/arm-linux-ld AR=/usr/local/arm/3.4.1/bin/arm-linux-ar RANLIB=/usr/local/arm/3.4.1/bin/arm-linux-ranlib STRIP=/usr/local/arm/3.4.1/bin/arm-linux-stri10工程編譯第三步:./setup.sh運行setup.sh腳本,從而生成M

5、akefile文件。工程編譯第四步:make此步將生成可執(zhí)行程序name11 主要功能分析 1、登錄界面 1.1、用戶名密碼輸入欄(edit控件) 1.2、兩個edit控件輸入內(nèi)容的驗證功能 (該功能需在回調(diào)函數(shù)中實現(xiàn)) 1.3、輸入密碼所用軟鍵盤控件 1.4、確認(rèn)登錄和取消登錄按鈕控件12 主要功能分析 2、登錄成功界面 2.1、彈出子窗口(對話框控件) 2.2、子窗口對話框中需有edit控件 2.3、子窗口對話框中需有軟鍵盤控件 2.4、子窗口對話框控件中需有發(fā)送按鈕13 主要功能分析 3、登錄失敗界面 3.1、彈出子窗口(對話框控件) 3.2、子窗口對話框中需有退出按鈕控件 3.3、子窗

6、口對話框中需有錯誤密碼提示控件14 主要功能分析 4、網(wǎng)絡(luò)通信功能 4.1、建立套接字鏈接 4.2、點擊發(fā)送按鈕后將消息發(fā)送到目標(biāo)機,可在目標(biāo)機上顯示。 此部分內(nèi)容將在后續(xù)課程“嵌入式Linux網(wǎng)絡(luò)編程”中詳細講解15MINIGUI消息映射機制MINIGUI窗口控件MINIGUI回調(diào)函數(shù)MINIGUI的notification函數(shù)16 MINIGUI程序的三大組成部分: 主窗口定義 控件定義 回調(diào)函數(shù)兩者之間的聯(lián)系(對應(yīng))只在開發(fā)主窗口的下級(子窗口)時需注意17 理解MiniGUI 基本編程方法的最快途徑就是分析一個簡單程序的結(jié)構(gòu)。 #include #include #include #i

7、nclude #include 18 static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) HDC hdc; switch (message) case MSG_PAINT: hdc = BeginPaint (hWnd); TextOut (hdc, 100, 100, Hello world!); EndPaint (hWnd, hdc); return 0; case MSG_CLOSE: DestroyMainWindow (hWnd); PostQuitMessage (hWnd);

8、 return 0; return DefaultMainWinProc(hWnd, message, wParam, lParam);19int MiniGUIMain (int argc, const char* argv)MSG Msg;HWND hMainWnd;MAINWINCREATE CreateInfo;#ifdef _LITE_VERSIONSetDesktopRect(0, 0, 800, 600);#endifCreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;CreateInfo.dwExStyle = WS

9、_EX_NONE;CreateInfo.spCaption = HelloWorld;CreateInfo.hMenu = 0;CreateInfo.hCursor = GetSystemCursor(0);CreateInfo.hIcon = 0;CreateInfo.MainWindowProc = HelloWinProc;CreateInfo.lx = 0;CreateInfo.ty = 0;CreateInfo.rx = 320;CreateInfo.by = 240;20CreateInfo.iBkColor = COLOR_lightwhite;CreateInfo.dwAddD

10、ata = 0;CreateInfo.hHosting = HWND_DESKTOP;hMainWnd = CreateMainWindow (&CreateInfo);if (hMainWnd = HWND_INVALID)return -1;ShowWindow(hMainWnd, SW_SHOWNORMAL);while (GetMessage(&Msg, hMainWnd) TranslateMessage(&Msg);DispatchMessage(&Msg);MainWindowThreadCleanup (hMainWnd);return 0;#i

11、fndef _LITE_VERSION#include #endif21 該程序在屏幕上創(chuàng)建一個大小為320 x240 像素的應(yīng)用程序窗口,并在窗口客戶區(qū)的中部顯示“Hello world!”22頭文件 helloworld.c 的開始所包括的四個頭文件、 和 是所有的MiniGUI 應(yīng)用程序都必須包括的頭文件: common.h 包括MiniGUI 常用的宏以及數(shù)據(jù)類型的定義; minigui.h 包含了全局的和通用的接口函數(shù)以及某些雜項函數(shù)的定義; gdi.h 包含了 MiniGUI 繪圖函數(shù)的接口定義; window.h 包含了窗口有關(guān)的宏、數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)定義以及函數(shù)接口聲明。 使用

12、預(yù)定義控件的MiniGUI 應(yīng)用程序還必須包括另外一個頭文件 : control.h 包含了 libminigui 中所有內(nèi)建控件的接口定義。23入口點 一個C 程序的入口點為main 函數(shù),而一個MiniGUI 程序的入口點為MiniGUIMain,該函數(shù)原型如下: int MiniGUIMain (int argc, const char* argv) main 函數(shù)已經(jīng)在MiniGUI 的函數(shù)庫中定義了,該函數(shù)在進行一些MiniGUI 的初始化工作之后調(diào)用MiniGUIMain 函數(shù)。所以,每個MiniGUI 應(yīng)用程序的入口點均為MiniGUIMain 函數(shù)。參數(shù)argc 和argv 與

13、C 程序main函數(shù)的參數(shù)argc 和argv 的含義是一樣的,分別為命令行參數(shù)個數(shù)和參數(shù)字符串?dāng)?shù)組指針。24創(chuàng)建和顯示主窗口 每個MiniGUI 應(yīng)用程序的初始界面都是一個主窗口, 可以通過調(diào)用CreateMainWindow 函數(shù)來創(chuàng)建一個主窗口,其參數(shù)是一個指向MAINWINCREATE 結(jié)構(gòu)的指針,本例中就是CreateInfo,返回值為所創(chuàng)建主窗口的句柄。MAINWINCREATE 結(jié)構(gòu)描述一個主窗口的屬性,在使用CreateInfo 創(chuàng)建主窗口之前,需要設(shè)置它的各項屬性。 hMainWnd = CreateMainWindow (&CreateInfo); CreateIn

14、fo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; 設(shè)置主窗口風(fēng)格,這里把窗口設(shè)為初始可見的,并具有邊框和標(biāo)題欄。25創(chuàng)建和顯示主窗口 設(shè)置主窗口的擴展風(fēng)格,該窗口沒有擴展風(fēng)格。 CreateInfo.dwExStyle = WS_EX_NONE; 設(shè)置主窗口的標(biāo)題為“HelloWorld”。 CreateInfo.spCaption = HelloWorld; 設(shè)置主窗口的主菜單,該窗口沒有主菜單。 CreateInfo.hMenu = 0; 設(shè)置主窗口的光標(biāo)為系統(tǒng)缺省光標(biāo)。 CreateInfo.hCursor = GetSystemCurs

15、or(0); 設(shè)置主窗口的圖標(biāo),該窗口沒有圖標(biāo)。 CreateInfo.hIcon = 0; 設(shè)置主窗口的窗口過程函數(shù)為HelloWinProc,所有發(fā)往該窗口的消息由該函數(shù)處理。 CreateInfo.MainWindowProc = HelloWinProc;26創(chuàng)建和顯示主窗口 設(shè)置主窗口在屏幕上的位置,該窗口左上角位于(0, 0),右下角位于(320, 240)。 CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = 320; CreateInfo.by = 240; 設(shè)置主窗口的背景色為白色,PIXEL_lightwhite 是M

16、iniGUI 預(yù)定義的象素值。 CreateInfo.iBkColor = PIXEL_lightwhite; 設(shè)置主窗口的附加數(shù)據(jù),該窗口沒有附加數(shù)據(jù)。 CreateInfo.dwAddData = 0;設(shè)置主窗口的托管窗口為桌面窗口。 CreateInfo.hHosting = HWND_DESKTOP;27創(chuàng)建和顯示主窗口 創(chuàng)建完主窗口之后,還需要調(diào)用ShowWindow 函數(shù)才能把所創(chuàng)建的窗口顯示在屏幕上。 ShowWindow 的第一個參數(shù)為所要顯示的窗口句柄,第二個參數(shù)指明顯示窗口的方式(顯示還是隱藏),SW_SHOWNORMAL 說明要顯示主窗口,并把它置為頂層窗口。 ShowW

17、indow(hMainWnd, SW_SHOWNORMAL);28進入消息循環(huán) 在調(diào)用ShowWindow 函數(shù)之后,主窗口就會顯示在屏幕上。和其它GUI 一樣,現(xiàn)在是進入消息循環(huán)的時候了。MiniGUI 為每一個MiniGUI 程序維護一個消息隊列。在發(fā)生事件之后,MiniGUI 將事件轉(zhuǎn)換為一個消息,并將消息放入目標(biāo)程序的消息隊列之中。應(yīng)用程序現(xiàn)在的任務(wù)就是執(zhí)行如下的消息循環(huán)代碼,不斷地從消息隊列中取出消息,進行處理:29進入消息循環(huán) while (GetMessage(&Msg, hMainWnd) TranslateMessage(&Msg); DispatchMess

18、age(&Msg); 30進入消息循環(huán) Msg 變量是類型為MSG 的結(jié)構(gòu),MSG 結(jié)構(gòu)在window.h 中定義如下: typedef struct _MSG HWND hwnd; int message; WPARAM wParam; LPARAM lParam; unsigned int time; #ifndef _LITE_VERSION void* pAdd; #endif MSG; typedef MSG* PMSG;31進入消息循環(huán) hwnd 消息發(fā)往的窗口的句柄。在helloworld.c 程序中,該值與hMainWnd 相同。 message 消息標(biāo)識符。這是一個用

19、于標(biāo)識消息的整數(shù)值。每一個消息均有一個對應(yīng)的預(yù)定義標(biāo)識符,這些標(biāo)識符定義在window.h 頭文件中,以前綴MSG 開頭。 wParam 一個32 位的消息參數(shù),其含義和值根據(jù)消息的不同而不同。 lParam 一個32 位的消息參數(shù),其含義和值取決于消息的類型。 time 消息放入消息隊列中的時間。32進入消息循環(huán) hwnd 消息發(fā)往的窗口的句柄。在helloworld.c 程序中,該值與hMainWnd 相同。 message 消息標(biāo)識符。這是一個用于標(biāo)識消息的整數(shù)值。每一個消息均有一個對應(yīng)的預(yù)定義標(biāo)識符,這些標(biāo)識符定義在window.h 頭文件中,以前綴MSG 開頭。 wParam 一個3

20、2 位的消息參數(shù),其含義和值根據(jù)消息的不同而不同。 lParam 一個32 位的消息參數(shù),其含義和值取決于消息的類型。 time 消息放入消息隊列中的時間。33進入消息循環(huán) GetMessage 函數(shù)調(diào)用從應(yīng)用程序的消息隊列中取出一個消息: GetMessage( &Msg, hMainWnd) 只要從消息隊列中取出的消息不為MSG_QUIT,GetMessage 就返回一個非0 值,消息循環(huán)將持續(xù)下去。MSG_QUIT 消息使GetMessage 返回0,導(dǎo)致消息循環(huán)的終止。34進入消息循環(huán) TranslateMessage 函數(shù)把擊鍵消息轉(zhuǎn)換為MSG_CHAR 消息,然后直接發(fā)送到

21、窗口過程函數(shù)。 TranslateMessage (&Msg); DispatchMessage (&Msg);35進入消息循環(huán) DispatchMessage 函數(shù)最終將把消息發(fā)往該消息的目標(biāo)窗口的窗口過程,讓它進行處理,本例中,該窗口過程就是HelloWinProc。也就是說,MiniGUI 在DispatchMessage函數(shù)中調(diào)用主窗口的窗口過程函數(shù)(回調(diào)函數(shù))對發(fā)往該主窗口的消息進行處理。處理完消息之后,應(yīng)用程序的窗口過程函數(shù)將返回DispatchMessage 函數(shù)中,而DispatchMessage函數(shù)最后又將返回到應(yīng)用程序代碼中,應(yīng)用程序又從下一個GetMess

22、age 函數(shù)調(diào)用開始消息循環(huán)。36窗口過程函數(shù)(回調(diào)函數(shù)) 窗口過程函數(shù)是MiniGUI 程序的主體部分,應(yīng)用程序?qū)嶋H所做的工作大部分都發(fā)生在窗口過程函數(shù)中,因為GUI 程序的主要任務(wù)就是接收和處理窗口收到的各種消息。 在helloworld.c 程序中,窗口過程是名為HelloWinProc 的函數(shù)。窗口過程函數(shù)可以由程序員任意命名,CreateMainWindow 函數(shù)根據(jù)MAINWINCREATE 結(jié)構(gòu)類型的參數(shù)中指定的窗口過程創(chuàng)建主窗口。37窗口過程函數(shù)(回調(diào)函數(shù)) 窗口過程函數(shù)總是定義為如下形式: static int HelloWinProc (HWND hWnd, int mes

23、sage, WPARAM wParam, LPARAM lParam) 窗口過程的4 個參數(shù)與MSG 結(jié)構(gòu)的前四個域是相同的。第一個參數(shù)hWnd 是接收消息的窗口的句柄,它與CreateMainWindow 函數(shù)的返回值相同,該值標(biāo)識了接收該消息的特定窗口。第二個參數(shù)與MSG 結(jié)構(gòu)中的message 域相同,它是一個標(biāo)識窗口所收到消息的整數(shù)值。最后兩個參數(shù)都是32 位的消息參數(shù),它提供和消息相關(guān)的特定信息。38屏幕輸出 程序在響應(yīng)MSG_PAINT 消息時進行屏幕輸出。應(yīng)用程序應(yīng)首先通過調(diào)用BeginPaint函數(shù)來獲得設(shè)備上下文句柄,并用它調(diào)用GDI 函數(shù)來執(zhí)行繪制操作。這里,程序使用Tex

24、tOut文本輸出函數(shù)在客戶區(qū)的中部顯示了一個“Hello world!”字符串。繪制結(jié)束之后,應(yīng)用程序應(yīng)調(diào)用EndPaint 函數(shù)釋放設(shè)備上下文句柄。39程序的退出 用戶單擊窗口右上角的關(guān)閉按鈕時窗口過程函數(shù)將收到一個MSG_CLOSE 消息。 helloworld 程序在收到MSG_CLOSE 消息時調(diào)用DestroyMainWindow 函數(shù)銷毀主窗口,并調(diào)用PostQuitMessage 函數(shù)在消息隊列中投入一個MSG_QUIT 消息。當(dāng)GetMessage函數(shù)取出MSG_QUIT 消息時將返回0,最終導(dǎo)致程序退出消息循環(huán)。40MiniGUI 控件編程靜態(tài)框 靜態(tài)框用來在窗口的特定位置顯

25、示文字、數(shù)字等信息,還可以用來顯示一些靜態(tài)的圖片信息,比如公司徽標(biāo)、產(chǎn)品商標(biāo)等等。就像其名稱暗示的那樣,靜態(tài)框的行為不能對用戶的輸入進行動態(tài)的響應(yīng),它的存在基本上就是為了展示一些信息,而不會接收任何鍵盤或鼠標(biāo)輸入。下圖給出了靜態(tài)框控件的典型用途:在對話框中作為其他控件的標(biāo)簽。41MiniGUI 控件編程靜態(tài)框 以 CTRL_STATIC 為控件類名調(diào)用CreateWindow 函數(shù),即可創(chuàng)建靜態(tài)框控件。 CreateWindow (CTRL_STATIC, This is a simple static control., WS_CHILD | SS_NOTIFY | SS_SIMPLE(單行

26、) | WS_VISIBLE(可視化) | WS_BORDER(邊界), IDC_STATIC1,(句柄) 10, 10, 180, 20, hWnd, 0);42MiniGUI 控件編程靜態(tài)框 除上述靜態(tài)框類型之外,還有如下幾種不常見的靜態(tài)框類型: SS_WHITERECT:以白色填充靜態(tài)框矩形。 SS_GRAYRECT:以灰色填充靜態(tài)框矩形。 SS_BLACKRECT:以黑色填充靜態(tài)框矩形。 SS_GRAYFRAME:灰色邊框。 SS_WHITEFRAME:白色邊框。 SS_BLACKFRAME:黑色邊框。43MiniGUI 控件編程靜態(tài)框 除上述靜態(tài)框類型之外,還有如下幾種不常見的靜態(tài)框

27、類型:44MiniGUI 控件編程靜態(tài)框 靜態(tài)框消息 當(dāng)靜態(tài)框類型為位圖型時,可通過如下消息獲得或者修改靜態(tài)框的位圖: STM_GETIMAGE:該消息返回位圖的指針或者圖標(biāo)句柄。 STM_SETIMAGE:通過 wParam 參數(shù)重新設(shè)置位圖指針或者圖標(biāo)句柄,并且返回原來的指針。45MiniGUI 控件編程靜態(tài)框 靜態(tài)框通知碼 當(dāng)靜態(tài)框風(fēng)格中包含 SS_NOTIFY 時,靜態(tài)框會產(chǎn)生如下兩個通知消息: STN_DBLCLK:表示用戶在靜態(tài)框內(nèi)雙擊了鼠標(biāo)左鍵。 STN_CLICKED:表示用戶在靜態(tài)框內(nèi)單擊了鼠標(biāo)左鍵。46MiniGUI 控件編程靜態(tài)框 創(chuàng)建了一個位圖型靜態(tài)框,并在用戶雙擊該靜

28、態(tài)框時修改自身的文本。該程序的完整源代碼可見程序包 mg-samples 中的 static.c 文件。下圖是該程序的運行效果。47MiniGUI 控件編程按鈕 按鈕是除靜態(tài)框之外使用最為頻繁的一種控件。按鈕通常用來為用戶提供開關(guān)選擇。 MiniGUI 的按鈕可劃分為普通按鈕、復(fù)選框和單選鈕等幾種類型。用戶可以通過鍵盤或者鼠標(biāo)來選擇或者切換按鈕的狀態(tài)。用戶的輸入將使按鈕產(chǎn)生通知消息,應(yīng)用程序也可以向按鈕發(fā)送消息以改變按鈕的狀態(tài)。48MiniGUI 控件編程按鈕 以 CTRL_BUTTON 為控件類名調(diào)用 CreateWindow 函數(shù),即可創(chuàng)建按鈕控件。 下面的程序段創(chuàng)建了兩個普通按鈕: Cr

29、eateWindow (CTRL_BUTTON, Push Button, WS_CHILD | BS_PUSHBUTTON | BS_CHECKED | WS_VISIBLE, IDC_BUTTON(身份證號), 10, 10, 80, 30, hWnd, 0);49MiniGUI 控件編程按鈕 以 CTRL_BUTTON 為控件類名調(diào)用 CreateWindow 函數(shù),即可創(chuàng)建按鈕控件。 下面的程序段創(chuàng)建了兩個普通按鈕: CreateWindow (CTRL_BUTTON, Multiple Lines Push Button, WS_CHILD | BS_PUSHBUTTON | BS_

30、MULTLINE | WS_VISIBLE, IDC_BUTTON + 1, 100, 10, 80, 40, hWnd, 0);50MiniGUI 控件編程按鈕 按鈕控件主要用來觸發(fā)一個立即回應(yīng)的動作,并且不會長久保持開關(guān)信息。這種形態(tài)的按鈕控件有兩種窗口風(fēng)格, 分別叫做BS PUSHBUTTON 和BS_DEFPUSHBUTTON。 BS_DEFPUSHBUTTON 中的“DEF”代表“默認(rèn)”。當(dāng)用來設(shè)計對話框時,BS_PUSHBUTTON風(fēng)格和BS_DEFPUSHBUTTON 風(fēng)格的作用不同,具有 BS_DEFPUSHBUTTON 的按鈕將 是默認(rèn)接收 ENTER 鍵輸入的按鈕,而不管當(dāng)

31、前的輸入焦點處于哪個控件上。但是當(dāng)用作普通主窗口的控件時,兩種型態(tài)的按鈕作用相同,只是具有 BS_DEFPUSHBUTTON 風(fēng)格的按鈕的邊框要粗一些。51MiniGUI 控件編程按鈕 當(dāng)鼠標(biāo)光標(biāo)處在按鈕中時,按下鼠標(biāo)左鍵將使按鈕用三維陰影重畫自己,就好像真的被按下一樣。放開鼠標(biāo)按鍵時,就恢復(fù)按鈕的原貌,并向父窗口發(fā)送一個MSG_COMMAND消息和BN_CLICKED 通知碼,當(dāng)按鈕擁有輸入焦點時,在文字的周圍就有虛線,按下及釋放空格鍵與按下及釋放鼠標(biāo)按鍵具有相同的效果。52MiniGUI 控件編程按鈕 另外,也可以在普通按鈕上顯示位圖或圖標(biāo),這時要使用 BS_BITMAP 或者 BS_IC

32、ON風(fēng)格,并通過 CreateWindow 函數(shù)的 dwAddData 參數(shù)傳遞位圖對象的指針或圖標(biāo)句柄。 默認(rèn)情況下位圖或圖標(biāo)會縮放顯示以充滿整個按鈕窗口范圍,使用 BS_REALSIZEIMAGE風(fēng)格將使位圖或圖標(biāo)顯示在控件中部,不作任何縮放。下面的代碼段建立了一個帶位圖的按鈕,其實現(xiàn)代碼和效果見下圖。53MiniGUI 控件編程按鈕 其實現(xiàn)代碼為: hwnd = CreateWindow (CTRL_BUTTON, Close, WS_CHILD | BS_PUSHBUTTON | BS_BITMAP |BS_REALSIZEIMAGE | BS_NOTIFY | WS_VISIBLE,

33、 IDC_BUTTON + 4, 10, 300, 60, 30, hWnd, (DWORD) GetSystemBitmap (SYSBMP_CLOSE);54MiniGUI 控件編程按鈕 按鈕通知碼 具有 BS_NOTIFY 風(fēng)格的按鈕可產(chǎn)生的通知碼主要有: BN_CLICKED:表明用戶單擊此按鈕。該通知碼的值為 0,因此,如果要在按鈕的父窗口中處理該按鈕發(fā)送過來的 BN_CLICKED 通知消息, 只需判斷MSG_COMMAND 消息的 wParam 參數(shù)是否等于按鈕的標(biāo)識符即可。該通知的產(chǎn)生是默認(rèn)的,將忽略按鈕控件的 BS_NOTIFY 風(fēng)格。55MiniGUI 控件編程按鈕 按鈕通

34、知碼: BN_PUSHED:表明用戶將此按鈕按下。 BN_UNPUSHED:表明用戶將此按鈕釋放。 BN_DBLCLK:表明用戶在此按鈕上進行了鼠標(biāo)左鍵的雙擊操作。 BN_SETFOCUS:表明按鈕獲得了輸入焦點。 BN_KILLFOCUS:表明按鈕失去了輸入焦點。56MiniGUI 控件編程按鈕 給出了一個按鈕控件的綜合性使用范例。該程序使用一個對話框來詢問用戶的口味,通過分組單選框來選擇喜歡的小吃類型,并通過復(fù)選框來選擇用戶的一些特殊口味。該程序的完整源代碼請見本程序包 mg-samples 中的 button.c文件,其運行效果見下圖 。57 在MiniGUI中,對話框是一類特殊的主窗口

35、,這種主窗口只關(guān)注與用戶的交互向用戶提供輸出信息,但更多的是用于用戶輸入。對話框可以理解為子類化之后的主窗口類。它針對對話框的特殊性(即用戶交互)進行了特殊設(shè)計。比如用戶可以使用TAB鍵遍歷控件、可以利用ENTER鍵表示默認(rèn)輸入等等。在MiniGUI當(dāng)中,在建立對話框之前,首先需要定義一個對話框模板,該模板中定義了對話框本身的一些屬性,比如位置和大小等等,同時定義了對話框中所有控件的初始信息,包括位置、大小、風(fēng)格等等。58MiniGUI 控件編程對話框 對話框控件(模板初始化) static DLGTEMPLATE DlgInitProgress = WS_BORDER | WS_CAPTIO

36、N, WS_EX_NONE, 120, 150, 400, 130, VAM-CNC 正在進行初始化, 0, 0, 3(所擁有的控件個數(shù)), NULL, 0 ;59MiniGUI 控件編程對話框 對話框控件(控件初始化) static CTRLDATA CtrlInitProgress = static, WS_VISIBLE | SS_SIMPLE, 10, 10, 380, 16, IDC_PROMPTINFO, 正在., 0 60MiniGUI 控件編程對話框 對話框回調(diào)函數(shù) 在定義了對話框模板數(shù)據(jù)之后, 需要定義對話框的回調(diào)函數(shù), 并調(diào)用DialogBoxIndirectParam 函

37、數(shù)建立對話框,所建立的對話框運行效果如 圖所示。該程序的完整源代碼請見程序包mg-samples 中的 dialogbox.c 文件。61MiniGUI 控件編程對話框static int InitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)switch (message) case MSG_INITDIALOG:return 1;case MSG_COMMAND:switch (wParam) case IDOK:case IDCANCEL:EndDialog (hDlg, wParam);break

38、;break;return DefaultDialogProc (hDlg, message, wParam, lParam);62MiniGUI 控件編程對話框 static void InitDialogBox (HWND hWnd) /* 將對話框模板結(jié)構(gòu)和控件結(jié)構(gòu)數(shù)組關(guān)聯(lián)起來 */ DlgInitProgress.controls = CtrlInitProgress; DialogBoxIndirectParam (&DlgInitProgress, hWnd, InitDialogBoxProc, 0L); 63MiniGUI 控件編程對話框 利用對話框?qū)崿F(xiàn)子窗口設(shè)計 修改

39、對話框模板初始化函數(shù) static DLGTEMPLATE DlgInitProgress = WS_BORDER | WS_CAPTION, WS_EX_NONE, 120, 150, 400, 130, VAM-CNC 正在進行初始化, 0, 0, 3, NULL, 0 ;64 模態(tài)對話框就是顯示之后,用戶不能再切換到其他主窗口進行工作的對話框,而只能在關(guān)閉之后,才能使用其他的主窗口。MiniGUI中,使用DialogBoxIndirectParam()函數(shù)建立的對話框就是模態(tài)對話框。 在MiniGUI中,非模態(tài)的對話框?qū)嶋H上就是利用對話框模板建立的普通的主窗口??梢酝ㄟ^CreateMai

40、nWindowIndirect()函數(shù)來建立一個非模態(tài)的對話框。65MiniGUI 控件編程皮膚窗口 皮膚窗口是指包含皮膚的MiniGUI 窗口,可以是非模態(tài)主窗口、模態(tài)主窗口和子窗口(控件)。 皮膚主窗口和普通的MiniGUI 主窗口的主要區(qū)別是外觀(皮膚主窗口沒有標(biāo)題欄、邊框和系統(tǒng)菜單),皮膚主窗口的事件及消息回調(diào)函數(shù)和普通主窗口的窗口回調(diào)函數(shù)的概念類似,用法上有點區(qū)別。皮膚子窗口也是一個MiniGUI 子窗口(控件),和皮膚主窗口一樣,皮膚子窗口可以提供皮膚事件回調(diào)函數(shù)和MiniGUI 消息回調(diào)函數(shù)。66MiniGUI 控件編程皮膚窗口 MiniGUI 中皮膚窗口的使用是比較靈活的,普通

41、MiniGUI 窗口中可以包含皮膚子窗口,皮膚窗口中也可以包含普通MiniGUI 子窗口或者皮膚子窗口。也就是說,皮膚窗口是可以嵌套使用的。67MiniGUI 控件編程皮膚窗口 MiniGUI 提供了如下用于創(chuàng)建和銷毀皮膚窗口的函數(shù): HWND create_skin_main_window (skin_head_t* skin, HWND hosting, int x, int y, int w, int h, B OOL modal); HWND create_skin_control (skin_head_t* skin, HWND parent, int id, int x, int

42、y, int w, int h); void destroy_skin_window (HWND hwnd);68MiniGUI 控件編程皮膚窗口 create_skin_main_window 函數(shù)用于創(chuàng)建具有皮膚界面的主窗口,該主窗口沒有標(biāo)題欄、邊框和系統(tǒng)菜單。create_skin_main_window 函數(shù)的hosting 參數(shù)指定了皮膚窗口的宿主窗口;x,y,w,和h 參數(shù)指定皮膚主窗口的位置和大??;skin 參數(shù)指定主窗口所包含的皮膚,它是一個指向skin_head_t 類型結(jié)構(gòu)的指針,skin_head_t 結(jié)構(gòu)定義了一個皮膚對象的相關(guān)數(shù)據(jù),該皮膚對象應(yīng)該是使用skin_ini

43、t 函數(shù)初始化好的;如果modal 參數(shù)為TRUE則創(chuàng)建一個模態(tài)主窗口,否則創(chuàng)建一個非模態(tài)主窗口。69MiniGUI 控件編程皮膚窗口 create_skin_control 函數(shù)用于創(chuàng)建具有皮膚界面的子窗口,或者說,皮膚控件。parent參數(shù)指定了皮膚控件的父窗口;id 為控件標(biāo)志符;x,y,w,h 參數(shù)指定皮膚控件在其父窗口中的位置和大小。 destroy_skin_window 函數(shù)用來銷毀由create_skin_main_window 或create_skin_control 創(chuàng)建的皮膚主窗口或子窗口。需要注意的是,銷毀一個皮膚窗口并不會銷毀它所包含的皮膚對象。70MiniGUI 控

44、件編程皮膚窗口 回調(diào)函數(shù)的使用 和窗口過程函數(shù)的作用類似,回調(diào)函數(shù)用來處理皮膚及皮膚窗口的皮膚事件和窗口消息。當(dāng)用戶在皮膚窗口上移動或點擊鼠標(biāo)時,例如點擊一個按鈕皮膚元素,系統(tǒng)將把相應(yīng)的皮膚事件發(fā)送到事件回調(diào)函數(shù),把窗口消息發(fā)送到消息回調(diào)函數(shù)。 皮膚的事件回調(diào)函數(shù)和消息回調(diào)函數(shù)是在調(diào)用skin_create_main_window 和skin_create_control 函數(shù)創(chuàng)建皮膚窗口時通過event_cb 和msg_cb 參數(shù)指定的。皮膚的這兩個回調(diào)函數(shù)還可以通過skin_set_event_cb 和skin_set_msg_cb 函數(shù)來重新設(shè)置。71MiniGUI 控件編程皮膚窗口 回

45、調(diào)函數(shù)的使用 skin_event_cb_t skin_set_event_cb (skin_head_t* skin, skin_event_cb_t event_cb); skin_msg_cb_t skin_set_msg_cb (skin_head_t* skin, skin_msg_cb_t msg_cb);72MiniGUI 控件編程皮膚窗口 回調(diào)函數(shù)的使用 skin_event_cb_t 為事件回調(diào)函數(shù)類型,定義如下:typedef int (* skin_event_cb_t) (HWND hwnd, skin_item_t* item, int event, void* da

46、ta); hwnd 參數(shù)為發(fā)生事件的皮膚窗口句柄;item 為發(fā)生事件的皮膚元素;event 為事件類型,data 為事件相關(guān)數(shù)據(jù)。一般情況下,我們可以在事件回調(diào)函數(shù)中通過item 所指皮膚元素的id 和event 的值來判斷哪個皮膚元素發(fā)生了什么類型的事件。73MiniGUI 控件編程皮膚窗口 回調(diào)函數(shù)的使用 目前定義的事件類型有: SIE_BUTTON_CLICKED:點擊按鈕 SIE_SLIDER_CHANGED:滑條的滑塊位置變化 SIE_GAIN_FOCUS:皮膚元素獲取焦點(鼠標(biāo)移動到其上) SIE_LOST_FOCUS:皮膚元素失去焦點(鼠標(biāo)移走)74MiniGUI 控件編程皮膚

47、窗口 回調(diào)函數(shù)的使用 skin_msg_cb_t 為消息回調(diào)函數(shù)類型,定義如下: typedef int (* skin_msg_cb_t) (HWND hwnd, int message, WPARAM wparam, LPARAM lparam, int* result); hwnd 參數(shù)為發(fā)生消息的皮膚窗口句柄,message 為消息定義,wparam 和lparam 為消息參數(shù),result 用來返回消息相關(guān)的結(jié)果。75MiniGUI 控件編程皮膚窗口 回調(diào)函數(shù)的使用 如果應(yīng)用程序定義了皮膚窗口的消息回調(diào)函數(shù)的話,皮膚窗口的窗口過程函數(shù)將在處理消息之前先調(diào)用皮膚的消息回調(diào)函數(shù)對該消息進

48、行處理,然后根據(jù)消息回調(diào)函數(shù)的返回值判斷是否繼續(xù)處理該消息。76MiniGUI 控件編程皮膚窗口 回調(diào)函數(shù)的使用 消息回調(diào)函數(shù)的返回值包括: MSG_CB_GOON:皮膚窗口過程函數(shù)將繼續(xù)處理該消息,result 值被忽略。 MSG_CB_DEF_GOON:消息將由MiniGUI 缺省窗口過程函數(shù)進行處理,result 值被忽略。 MSG_CB_STOP:消息的處理將停止,皮膚窗口過程函數(shù)返回result 所指向的值。77MiniGUI 控件編程皮膚窗口 皮膚操作函數(shù) 我們可以通過皮膚操作函數(shù)對皮膚或皮膚元素進行一系列通用的操作。 set_window_skin 函數(shù)可以改變皮膚窗口所包含的皮

49、膚,我們可以通過該函數(shù)實現(xiàn)應(yīng)用程序窗口的換膚功能。78MiniGUI 控件編程皮膚窗口 回調(diào)函數(shù)的使用 skin_head_t* set_window_skin (HWND hwnd, skin_head_t *new_skin); hwnd 為皮膚窗口的窗口句柄,普通窗口不適用。new_skin 為新的皮膚對象,該皮膚必須是已經(jīng)使用skin_init 函數(shù)初始化好的。set_window_skin 函數(shù)返回老的皮膚對象,需要注意的是,該函數(shù)并不銷毀老的皮膚對象。79MiniGUI 控件編程皮膚窗口 get_window_skin 函數(shù)用來獲取皮膚窗口所包含的皮膚。 skin_head_t*

50、get_window_skin (HWND hwnd); skin_get_item 函數(shù)可以由皮膚元素的id 來獲取它的皮膚元素對象。 skin_item_t* skin_get_item (skin_head_t* skin, int id);80MiniGUI 控件編程皮膚窗口 skin_get_item_status 函數(shù)獲取皮膚元素的通用狀態(tài)。通用狀態(tài)包括可見、禁用和高亮。 DWORD skin_get_item_status (skin_head_t* skin, int id); skin_get_hilited_item 函數(shù)用來獲取當(dāng)前高亮的皮膚元素。 skin_item_t

51、* skin_get_hilited_item (skin_head_t* skin);81MiniGUI 控件編程皮膚窗口 skin_set_hilited_item 函數(shù)用來設(shè)置當(dāng)前高亮的皮膚元素。 skin_item_t* skin_set_hilited_item (skin_head_t* skin, int id); skin_show_item 函數(shù)用來顯示或隱藏一個皮膚元素。 DWORD skin_show_item (skin_head_t* skin, int id, BOOL show);82MiniGUI 控件編程皮膚窗口 skin_enable_item 函數(shù)用來禁用

52、或啟用一個皮膚元素。 DWORD skin_enable_item (skin_head_t* skin, int id, BOOL enable);83MiniGUI 控件編程皮膚窗口 圖片標(biāo)簽 圖片標(biāo)簽是指使用圖片來顯示文字或其它字符內(nèi)容的標(biāo)簽。我們使用skin_item_t 結(jié)構(gòu)定義一個圖片標(biāo)簽元素時,style 項應(yīng)具有SI_TYPE_BMPLABEL 風(fēng)格;type_data 項指向一個si_bmplabel_t 類型的結(jié)構(gòu),該結(jié)構(gòu)定義了一個圖片標(biāo)簽的屬性:84MiniGUI 控件編程皮膚窗口 圖片標(biāo)簽 /* Bitmap label item info structure */ t

53、ypedef struct si_bmplabel_s /* 標(biāo)簽文字 */ char* label; /* 標(biāo)簽預(yù)定義文字集 */ const char* label_chars; si_bmplabel_t;85MiniGUI 控件編程皮膚窗口 label 字符串為該圖片標(biāo)簽所要顯示的文字內(nèi)容; label_chars 字符串中包含了圖片標(biāo)簽的所有可選文字。 圖片標(biāo)簽的文字都是用圖片來表示的,這些文字的圖片都存儲在skin_item_t 結(jié)構(gòu)的bmp_index 項所指的位圖對象中。該位圖對象所代表的文字圖片需符合如下的要求: 1)、文字圖片中的文字等距離水平排列,可有多行,但每行不能超過20 個字符 2)、文字圖片中的文字要和label_chars 所規(guī)定的可選文字完全相符86MiniGUI 控件編程皮膚窗口 舉一個簡單的例子。如要使用一個內(nèi)容為“21:30”的數(shù)碼管風(fēng)格的數(shù)字圖片標(biāo)簽,圖片來自于一個數(shù)碼管風(fēng)格的數(shù)字及字符圖片,如下圖所示。 那么

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論