OPEN第5章MiniGUI程序設(shè)計.ppt_第1頁
OPEN第5章MiniGUI程序設(shè)計.ppt_第2頁
OPEN第5章MiniGUI程序設(shè)計.ppt_第3頁
OPEN第5章MiniGUI程序設(shè)計.ppt_第4頁
OPEN第5章MiniGUI程序設(shè)計.ppt_第5頁
已閱讀5頁,還剩139頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目 錄,1.第一章 嵌入式系統(tǒng)基本概念 2.第二章 Linux基礎(chǔ) 5.第三章 嵌入式交叉編譯環(huán)境 5.第四章 嵌入式開發(fā)環(huán)境的搭建 5.第五章 MiniGUI程序設(shè)計 6.第六章 嵌入式數(shù)據(jù)庫,第5章 嵌入式開發(fā)環(huán)境的搭建,嵌入式GUI概述 MiniGUI DEMO MiniGUI的編譯和安裝 MiniGUI程序框架 MiniGUI編程基礎(chǔ),GUI(Graphics User Interface),圖形用戶界面,借助菜單、按鈕等標準界面元素和鼠標進行操作,幫助用戶方便地向計算機系統(tǒng)發(fā)出指令,并將系統(tǒng)運行的結(jié)果同樣以圖形方式顯示給用戶。 嵌入式GUI:輕型、占用資源少、高性能、高可靠性、可配置,5.1嵌入式GUI概述,5.2 常用嵌入式GUI介紹,MicroWindows MiniGUI 其他圖形平臺:Qt/Embedded等,5.3 MiniGUI概述,MiniGUI()原是由魏永明主持和開發(fā)的一個自由軟件項目,現(xiàn)由北京飛漫軟件技術(shù)有限公司維護并開展后續(xù)開發(fā)。 遵循GPL 條款 支持操作系統(tǒng)Linux、uClinux、VxWorks、eCos、uC/OS-II、pSOS、ThreadX 等 MiniGUI 為應(yīng)用程序定義了一組輕量級的窗口和圖形設(shè)備接口。,手機/PDA,MiniGUI 典型應(yīng)用,數(shù)字媒體/機頂盒,MiniGUI 典型應(yīng)用,工控儀表,MiniGUI 典型應(yīng)用,其他,MiniGUI 典型應(yīng)用,miniGUI系統(tǒng)架構(gòu),程序架構(gòu)分析:,結(jié)構(gòu)體初始化,創(chuàng)建窗口,顯示窗口,消息循環(huán),清理資源,MSG_CREATE,MSG_PAINT,MSG_CLOSE,消息處理函數(shù),本機執(zhí)行環(huán)境,內(nèi)核:2.6.22 桌面:KDE 底層圖形接口:framebuffer 調(diào)試接口qvfb 1.0 miniGUI版本 1.6,2.Hello miniGUI,DEMO,1) 頭文件(前四個為必須) #include #include #include #include #include common.h 包括 MiniGUI常用的宏及數(shù)據(jù)類型的定義。 minigui.h 包含了全局的和通用的接口函數(shù)以及某些雜項函數(shù)的定義。 gdi.h包含了繪圖函數(shù)的接口的定義 。 window.h 包含了窗口有關(guān)的宏、數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)的定義以及函數(shù)接口聲明。 control.h 包含了 所有內(nèi)建控件的接口定義。,程序架構(gòu)分析:,2) MiniGUI程序入口點 int MiniGUIMain (int argc, const char* argv) 函數(shù)原形: int MiniGUIMain (int argc, const char* argv) 參數(shù)argc 和argv 與C 程序main 函數(shù)的參數(shù)argc 和argv 的含義是一樣的,分別為命令行參數(shù)個數(shù)和參數(shù)字符串數(shù)組指針。 main 函數(shù)已經(jīng)在 MiniGUI的函數(shù)庫中定義了,該函數(shù)在進行一些 MiniGUI的初始化工作之后調(diào)用 MiniGUIMain函數(shù)。,程序架構(gòu)分析:,3) 設(shè)置主窗口屬性 MAINWINCREATE 結(jié)構(gòu)描述 /窗口信息 CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; /風格 CreateInfo.dwExStyle = WS_EX_NONE; CreateInfo.spCaption = “Hello, world!“; /標題名 CreateInfo.hMenu = 0; /無菜單 CreateInfo.hCursor = GetSystemCursor(0); CreateInfo.hIcon = 0; CreateInfo.MainWindowProc = HelloWinProc; /消息處理過程函數(shù) CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = 320; CreateInfo.by = 240; CreateInfo.iBkColor = COLOR_lightwhite; CreateInfo.dwAddData = 0; CreateInfo.hHosting = HWND_DESKTOP; /托管窗口,程序架構(gòu)分析:,3) 設(shè)置主窗口屬性 MAINWINCREATE 結(jié)構(gòu)描述 CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; 設(shè)置主窗口風格,這里把窗口設(shè)為初始可見的,并具有邊框和標題欄。 CreateInfo.deExStyle = WS_EX_NONE; 設(shè)置主窗口的擴展風格,該窗口沒有擴展風格。 CreateInfo.spCaption = “HelloWorld” 設(shè)置主窗口的標題為”HelloWorld”。,程序架構(gòu)分析:,3) 設(shè)置主窗口屬性 MAINWINCREATE 結(jié)構(gòu)描述 CreateInfo.hMenu = 0; 設(shè)置主窗口的主菜單,該窗口沒有主菜單。 CreateInfo.hCursor = GetSystemCursor(0); 設(shè)置主窗口的光標為系統(tǒng)缺省光標。 CreateInfo.hIcon = 0; 設(shè)置主窗口的圖標,該窗口沒有圖標。,程序架構(gòu)分析:,3) 設(shè)置主窗口屬性 MAINWINCREATE 結(jié)構(gòu)描述 CreateInfo.iBkColor = PIXEL_lightwhite; 設(shè)置主窗口的背景色為白色,PIXEL_lightwhite 是 MiniGUI預(yù)定義的象素值。 CreateInfo.dwAddData = 0; 設(shè)置主窗口的附加數(shù)據(jù),該窗口沒有附加數(shù)據(jù)。 CreateInfo.hHosting = HWND_DESKTOP; 設(shè)置主窗口的托管窗口為桌面窗口。,程序架構(gòu)分析:,3) 設(shè)置主窗口屬性 MAINWINCREATE 結(jié)構(gòu)描述 CreateInfo.MainWindowProc = HelloWinProc; 設(shè)置主窗口的窗口過程函數(shù)為 HelloWinProc,所有發(fā)往該窗口的消息由該函數(shù)處理。 CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = 320; CreaetInfo.by=240; 設(shè)置主窗口在屏幕上的位置,該窗口左上角位于(0, 0),右下角位于(320, 240)。,程序架構(gòu)分析:,4) 創(chuàng)建和顯示主窗口 /創(chuàng)建主窗口 hMainWnd = CreateMainWindow ( 顯示窗口在屏幕上。,程序架構(gòu)分析:,5) 進入消息循環(huán) MiniGUI 對 MiniGUI程序維護一種名叫消息隊列的數(shù)據(jù)結(jié)構(gòu)。在發(fā)生事件之后,MiniGUI 將事件轉(zhuǎn)換為一個消息,并將消息放入目標程序的消息隊列之中。應(yīng)用程序現(xiàn)在的任務(wù)就是執(zhí)行消息循環(huán)代碼,不斷地從消息隊列中取出消息,進行處理。 /消息循環(huán) while (GetMessage( ,程序架構(gòu)分析:,6) 窗口過程函數(shù) static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) HDC hdc; RECT rc; char msg_text30; switch (message) /創(chuàng)建時發(fā)送的消息,用來做初始化處理,這里是初始化字符串內(nèi)容 case MSG_CREATE: break; /窗口繪畫時發(fā)送的消息,用來在界面繪圖或者輸出文字 /注意這里的return 0 表明不需要進入默認處理函數(shù)中。 case MSG_PAINT: printf (“BeginPaint.n“); hdc = BeginPaint (hWnd); TextOut (hdc, 10, 50, ,“Hello, world!“); EndPaint (hWnd, hdc); printf (“EndPaint.n“); return 0; /結(jié)束時一些處理函數(shù),主要是銷毀主窗口和發(fā)送quit消息以退出消息循環(huán)。 case MSG_CLOSE: DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; return DefaultMainWinProc(hWnd, message, wParam, lParam); ,程序架構(gòu)分析:,6) 窗口過程函數(shù) 在 helloworld.c程序中,窗口過程是HelloWinProc。 CreateMainWindow 函數(shù)根據(jù) MAINWINCREATE 結(jié)構(gòu)類型的參數(shù)中指定的窗口過程創(chuàng)建主窗口。 窗口過程函數(shù)由 MiniGUI進行調(diào)用。 窗口過程函數(shù)不予處理的消息應(yīng)該傳給 DefaultMainWinProc 函數(shù)進行缺省處理。,程序架構(gòu)分析:,SendMessage MSG_CREATE,CREATEMAINWINDOW,MSG_PAINT,hWnd,SHOWWINDOW,PostMessage MSG_PAINT,GetMessage,WndProc,主窗口創(chuàng)建時消息動作過程:,程序架構(gòu)分析:,MSG_CLOSE,hWnd,MSG_Derstroy,hWnd,GetMessage,WndProc,底層事件響應(yīng) 用戶單擊關(guān)閉按鈕,DestroyMainWindow PostQuitWindow,hWnd,MSG_QUIT,QUIT 退出,主窗口銷毀時消息動作過程:,程序架構(gòu)分析:,7) 屏幕輸出 MSG_PAINT消息-進行屏幕輸出。 case MSG_PAINT: hdc = BeginPaint (hWnd); TextOut (hdc, 60, 60, “Hello world!“); EndPaint (hWnd, hdc); return 0;,程序架構(gòu)分析:,8) 程序的退出 單擊窗口右上角關(guān)閉按鈕,發(fā)送 MSG_CLOSE 消息。 case MSG_CLOSE: DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0;,程序架構(gòu)分析:,9) 程序編譯 MiniGUI-Threads 模式: $ gcc o helloworld helloworld.c lpthread lminigui pthread 線程庫 minigui minigui支持庫,程序架構(gòu)分析:,10) 程序執(zhí)行 ./helloworld,程序架構(gòu)分析:,MiniGUI函數(shù)庫組成,libminigui:核心庫,標準控件 libmgext :擴展庫,一些有用的控件 libvcongui:虛擬控制臺窗口,MiniGUI運行模式,MiniGUI-Threads MiniGUI-Lite MiniGUI-Standalone 注意: 以下講述基于MiniGUI1.6; MiniGUI 2.0.x 中Lite模式升級為Processes 模式。 默認模式是MiniGUI-Threads。,1) 提供了完備的多窗口機制和消息傳遞機制。 2) 提供常用的控件類。 3) 對話框和消息框支持。 4) 其它 GUI 元素,包括菜單、加速鍵、插入符、定時器等。 5) 界面皮膚支持。,MiniGUI V1.6.x 的主要特征(1/4):,6) 支持低端顯示設(shè)備(比如單色 LCD)和高端顯示設(shè)備(比如彩色顯示器。 7) Windows 的資源文件支持,如位圖、圖標、光標等。 8) 各種流行圖像文件的支持。 9) 多字符集和多字體支持。 10) 多種鍵盤布局的支持。,MiniGUI V1.6.x 的主要特征(2/4):,11) 漢字(GB2312)輸入法支持。 12) 針對嵌入式系統(tǒng)的特殊支持,包括一般性的 I/O 流操作,字節(jié)序相關(guān)函數(shù)等。 13) 層的支持。 (MiniGUI-Lite 版本)。 14) 提供快速和增強的位塊操作,視頻加速支持以及 Alpha 混合等功能。,MiniGUI V1.6.x 的主要特征(3/4):,15) 增強的新 GDI 函數(shù)。 16) 圖形抽象層(GAL)以及輸入抽象層(IAL)。,MiniGUI V1.6.x 的主要特征(4/4):,輕型、占用資源少 高性能 高可靠性 可伸縮性強 跨操作系統(tǒng)支持 可配置,MiniGUI 優(yōu)勢:,MiniGUI編程指南 V1.6 MiniGUI API Reference Manual V1.6 其他資源 /api_ref/1.6.10/globals_0x65.html#index_d,MiniGUI 參考手冊:,5.4 MiniGUI編譯安裝,北京飛漫軟件技術(shù)有限公司 MiniGUI 免費版,獲取MiniGUI:,libminigui-1.6.x.tar.gz:MiniGUI 函數(shù)庫源代碼,其中包括libminigui、libmgext 和 libvcongui。 minigui-res-1.6.tar.gz:MiniGUI 所使用的資源, 包括基本字體、圖標、位圖和鼠標光標。 mde-1.6.x.tar.gz:MiniGUI 的綜合演示程序。 mg-smaples-1.6.x.tar.gz:MiniGUI 編程指南的配套示例程序。,源代碼及資源包,基于VESA FrameBuffer的圖形引擎。 支持 FrameBuffer的Linux內(nèi)核相關(guān)選項:,MiniGUI圖形引擎,修改/boot/grub/menu.lst 文件,kernel 打頭的一行添加 vga=0x0317 1024*768*16bpp 必須重新啟動才能生效 Linux 引導(dǎo)時,會在屏幕的左上方顯示一個可愛的小企鵝或者發(fā)行版廠商的 LOGO 圖片,FrameBuffer,vga=0x0317,FrameBuffer:,分辨率:,FrameBuffer分辨率:,libminigui-1.6.0-linux.tar.bz2軟件包/usr/local/lib $tar xjvf libminigui-1.6.0-linux.tar.bz2 $ cd libminigui-1.6.0-linux $ mv libminigui-1.6.0-linux libminigui-1.6.0-linux-host $ ./configure $ make $ make install,本地安裝庫,修改 /etc/ld.so.conf 文件 共享庫搜索目錄 /usr/lib /usr/X11R6/lib /usr/i486-linux-libc5/lib /usr/local/lib 運行l(wèi)dconfig 命令刷新系統(tǒng)的共享庫搜索緩存: $ su -c /sbin/ldconfig,本地安裝更新庫搜索路徑:,安裝 MiniGUI 的資源res.tar.bz2軟件包:圖標、光標等 $ tar jxvf res-host.tar.bz2 $ cd res $ make install 默認的安裝腳本會把 MiniGUI 資源文件安裝到/usr/local/lib/minigui/res/ 目錄下。,本地安裝資源:,編譯應(yīng)用程序例子sample.tar.bz2 $ tar jxvf mg-sample-1.6.0.tar.bz2 $ mv mg-sample-1.6.0 mg-sample-1.6.0-host $ cd mg-sample-1.6.0-host $ ./configure $ make,本地安裝代碼編譯:,PC 上MiniGUI 的運行 注意:必須要在控制臺模式才能運行MiniGUI。要啟動控制臺,按住CtrlAlt 的同時,按F1F6 中的任意一個均可,然后登錄系統(tǒng),進入mg-sample-1.6.0-host/src 目錄,直接運行即可(./helloworld)。 按住CtrlAlt 的同時,按7 可返回,本地運行:,交叉編譯libminigui $ tar jxvf libminigui-1.6.0-linux.tar.bz2 $ cd libminigui-1.6.0-linux-target $ ./build/buildlib-uparm2410-TFT $ make $ make install (make需要持續(xù)幾分鐘) 默認的安裝腳本會把 庫文件安裝到/opt/host/armv4l/armv4l-unknown/linux/lib/ 目錄下,交叉安裝庫:,安裝 MiniGUI 的資源res.tar.bz2軟件包:圖標、光標等 $ tar jxvf res-target.tar.bz2 $ cd res-target $ make install 默認的安裝腳本會把 MiniGUI 資源文件安裝到/opt/host/armv4l/armv4l-unknown/linux/lib/minigui/res/ 目錄下,交叉安裝資源:,編譯應(yīng)用程序例子 mg-sample-1.6.0.tar.bz2 $ tar jxvf mg-sample-1.6.0.tar.bz2, $ mv mg-sample-1.6.0 mg-sample-1.6.0-target $ mg-sample-1.6.0 $ ./build-upnet2410-4000 $ make,交叉安裝代碼編譯:,將應(yīng)用程序拷貝到/arm2410/目錄下 minicom通訊終端,連接好開發(fā)板和主機,打開電源 mount t nfs 192.168.0.xx:/arm2410 /host ln s /dev/fb/0 /dev/fb0 建立符號連接 mknod /dev/tty0 c 4 0 建立/dev/tty0 設(shè)備 執(zhí)行MiniGUI 應(yīng)用程序,在目標板上運行:,5.5 MiniGUI程序架構(gòu),分析 MiniGUI應(yīng)用程序 helloworld 源代碼在src目錄下 helloworld 程序運行結(jié)果,5.6 MiniGUI編程基礎(chǔ),本節(jié)內(nèi)容 MiniGUI窗口 MiniGUI消息及消息隊列 MiniGUI對話框 MiniGUI菜單 MiniGUI基本控件 按鈕 靜態(tài)框 編輯框,窗口,窗口是屏幕上的一個矩形區(qū)域。應(yīng)用程序的可視部分由一個或多個窗口構(gòu)成。窗口系統(tǒng)控制窗口的位置、大小、和可見區(qū)域。 一個應(yīng)用程序窗口一般包括如下部分: 一個可視的邊界 一個窗口ID,客戶程序使用該ID操作窗口, “窗口句柄” 一些其它特性:高、寬、背景色等 可能有菜單和滾動條等附加窗口元素,窗口,屏幕上的重疊窗口通常具有如下的關(guān)系: 窗口一般組織為層次體系結(jié)構(gòu)的形式(或者說,樹的形式)。 根窗口(root window)是所有窗口的祖先,占滿整個屏幕的表面,也稱 為桌面窗口。 除了根窗口以外的所有窗口都有父窗口,每一個窗口都可能有子窗口、 兄弟窗口、祖先窗口和子孫窗口等 子窗口含在父窗口內(nèi),同一個父窗口內(nèi)的子窗口為同級窗口。 窗口有從屬關(guān)系,也就是說,某些窗口的生命周期和可見性由它的所有 者決定。父窗口通常擁有它們的子窗口。,Desktop,主窗口1,主窗口2,控件 (子窗口),控件 (子窗口),控件 (子窗口),對話框1,窗口體系,線程1,線程2,MiniGUI 中有三種窗口類型:主窗口、對話框和控件窗口(子窗口)。 每一個MiniGUI應(yīng)用程序一般都要至少創(chuàng)建一個主窗口,作為應(yīng)用程序的主界面或開始界面。 主窗口通常包括一些子窗口,這些子窗口通常是控件窗口,也可以是自定義窗口類。 應(yīng)用程序還會創(chuàng)建其它型的窗口,例如對話框。對話框本質(zhì)上就是主窗口,應(yīng)用程序一般通過對話框提示用戶進行輸入操作。,主窗口:,主窗口沒有很精確的定義,目前可以認為其特征主要有父窗口為Desktop的,擁有子窗口,在創(chuàng)建后可以進入消息循環(huán)。 MiniGUI 為每個托管窗口為Desktop的主窗口建立單獨的消息隊列,在該主窗口上派生出的主窗口、對話框及控件(子窗口)均使用同一消息隊列。 在調(diào)用 MiniGUIMain之前,MiniGUI 啟動桌面窗口Desktop。桌面窗口作為 MiniGUI 的窗口管理器而存在,也是事實上根窗口。,主窗口:,MAINWINCREATE結(jié)構(gòu)體指定窗口信息: 窗口風格 窗口標題 窗口菜單 窗口圖標 窗口背景色 ,主窗口屬性:,主窗口屬性:,主窗口風格:,WS_BORDER WS_CAPTION WS_VISIBLE,WS_VISIBLE,簡而言之,回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用為調(diào)用它所指向的函數(shù)時,就可以說這是回調(diào)函數(shù)。 使用回調(diào)函數(shù)實際上就是在調(diào)用某個函數(shù)(通常是類API函數(shù))時,將自己的一個函數(shù)(這個函數(shù)為回調(diào)函數(shù))的地址作為參數(shù)傳遞給那個函數(shù)。而那個函數(shù)在需要的時候,利用傳遞的地址調(diào)用回調(diào)函數(shù),這時你可以利用這個機會在回調(diào)函數(shù)中處理消息或完成一定的操作。至于如何定義回調(diào)函數(shù),跟具體使用的類API函數(shù)有關(guān),一般在幫助中有說明回調(diào)函數(shù)的參數(shù)和返回值等。,回調(diào)函數(shù):,主窗口過程實際是一個回調(diào)函數(shù),一般由 DispatchMessage 函數(shù)調(diào)用,用來處理應(yīng)用的消息。 定義:int TestMainWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) ; 四個入口參數(shù):消息的目標窗口句柄、消息、消息的 WPARAM (即unsigned int) 型參數(shù)和 LPARAM (即long int) 型參數(shù)。 在 32 位系統(tǒng)中,消息的兩個參數(shù)實際是等長度的。 主窗口的窗口過程處理應(yīng)用感興趣的消息,將其他消息傳遞給 DefaultMainWinProc 函數(shù)處理。,主窗口過程:,消息和消息隊列,MiniGUI 是一個圖形用戶界面支持系統(tǒng),通常的GUI 編程概念均適用于MiniGUI 編程,如窗口和事件驅(qū)動編程等。 鍵盤和鼠標動作產(chǎn)生事件,這些事件通常被發(fā)送到具有焦點的窗口,由該窗口相關(guān)聯(lián)的例程來處理。 焦點和光標的概念用于管理輸入設(shè)備和輸入事件的傳送。應(yīng)用程序可以捕捉鼠標光標并獲取光標事件、鍵盤輸入焦點和鍵盤事件。 應(yīng)用程序可通過調(diào)用一些系統(tǒng)函數(shù)來要求重繪窗口或窗口的某一部分,這些事件通常由窗口例程來處理。,事件驅(qū)動編程:,消息被如下定義(): typedef struct _MSG HWND hwnd; /窗口句柄 int message; /消息類型 WPARAM wParam; /消息參數(shù) LPARAM lParam; /消息參數(shù) struct timeval time; void* pAdd; MSG; typedef MSG* PMSG;,消息結(jié)構(gòu)的定義:,系統(tǒng)消息: MSG_IDLE、MSG_TIMER、MSG_FDEVENT等; 對話框消息: MSG_COMMAND、MSG_INITDIALOG、MSG_SETTEXT等; 窗口繪制消息: MSG_PAINT、MSG_ERASEBKGND等; 窗口創(chuàng)建和銷毀消息: MSG_CREATE、MSG_DESTROY、MSG_CLOSE等; 鍵盤和鼠標消息: MSG_KEYDOWN、MSG_CHAR、MSG_LBUTTONDOWN等; 鼠標/鍵盤后處理消息: MSG_SETCURSOR、MSG_SETFOCUS、MSG_KILLFOCUS等; 用戶自定義消息 MSG_USER,消息的種類:,消息隊列:系統(tǒng)中用于存儲消息的一塊內(nèi)存區(qū)域,每個消息存儲在一個消息結(jié)構(gòu)中 。 MiniGUI有兩種向窗口過程發(fā)送消息的辦法: 把消息投遞到一個先進先出的消息隊列中。大多數(shù)消息。 通過消息發(fā)送函數(shù)直接調(diào)用窗口過程函數(shù)。需立即處理,如MSG_ERASEBKGND消息。,消息隊列:,MiniGUI 為每個托管窗口為Desktop的主窗口建立單獨的消息隊列,在該主窗口上派生出的主窗口、對話框及控件(子窗口)均使用同一消息隊列。 消息隊列中存儲大部分消息,如底層的鍵盤和鼠標消息。還有上層邏輯消息等等。大部分消息要經(jīng)過消息隊列存儲。,消息處理,MiniGUI-Threads 中每個線程創(chuàng)建的第一個主窗口,其托管窗口必須是桌面,即HWND_DESKTOP,該線程的其他窗口,必須由屬于同一線程的已有主窗口作為托管窗口。系統(tǒng)在托管窗口為 HWND_DESKTOP 時創(chuàng)建新的消息隊列,而在指定非桌面的窗口作為托管窗口時,使用該托管窗口的消息隊列。,窗口消息隊列的托管窗口,消息循環(huán) minigui中大部分動作要在消息循環(huán)中調(diào)用消息處理函數(shù)來完成。實際上消息循環(huán)就是不斷的從消息隊列中取出消息,直至遇到MSG_QUIT才退出該次消息循環(huán)。 while (GetMessage( Msg 變量是類型為 MSG的結(jié)構(gòu),MSG結(jié)構(gòu)在 window.h中。,消息處理:,窗口過程函數(shù) 在 helloworld.c程序中,窗口過程是HelloWinProc。 CreateMainWindow 函數(shù)根據(jù) MAINWINCREATE 結(jié)構(gòu)類型的參數(shù)中指定的窗口過程創(chuàng)建主窗口。 窗口過程函數(shù)由 MiniGUI進行調(diào)用,是一個回調(diào)函數(shù)。 窗口過程函數(shù)不予處理的消息應(yīng)該傳給 DefaultMainWinProc 函數(shù)進行缺省處理。,消息處理:,窗口過程函數(shù) 窗口過程函數(shù)總是定義為如下形式: static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) 第一個參數(shù) hWnd是接受消息的窗口的句柄。 第二個參數(shù)標識窗口所收到消息的整數(shù)值。 最后兩個參數(shù)都是 32位的消息參數(shù)。,消息處理:,SendMessage MSG_CREATE,CREATEMAINWINDOW,MSG_PAINT,hWnd,SHOWWINDOW,PostMessage MSG_PAINT,GetMessage,WndProc,主窗口創(chuàng)建時消息動作過程:,MSG_CLOSE,hWnd,MSG_Derstroy,hWnd,GetMessage,WndProc,底層事件響應(yīng) 用戶單擊關(guān)閉按鈕,DestroyMainWindow PostQuitWindow,hWnd,MSG_QUIT,QUIT 退出,主窗口銷毀時消息動作過程:,投遞(郵寄)消息:把消息復(fù)制到消息隊列中。 發(fā)送消息:直接把消息發(fā)送到窗口過程函數(shù)。,發(fā)送和投遞消息:,發(fā)送和投遞消息:,電話,發(fā)送消息,投遞消息,郵箱,PostMessage 立即返回。 “郵寄” PostSyncMessage 向不同的線程消息隊列郵寄消息,消息被處理之后返回, 同步消息。“郵寄” SendMessage 消息處理完成之后返回。 同線程“發(fā)送”。不同線程“郵寄”(PostSyncMessage)。 SendNotifyMessage 立即返回,不允許丟失?!班]寄”。 SendAsyncMessage 異步消息?!鞍l(fā)送”。,發(fā)送和投遞消息:,對話框,簡單而言,模態(tài)對話框就是顯示之后,用戶不能再切換到其他主窗口(同線程內(nèi))進行工作的對話框,而只能在關(guān)閉之后,才能使用其他的主窗口。 MiniGUI 中,使用 DialogBoxIndirectParam 函數(shù)建立的對話框就是模態(tài)對話框。 實際上,該對話框首先根據(jù)模板建立對話框,然后禁止其托管主窗口,并在主窗口的 MSG_CREATE 消息中創(chuàng)建控件,之后發(fā)送 MSG_INITDIALOG消息給回調(diào)函數(shù),最終建立一個新的消息循環(huán),并進入該消息循環(huán),直到程序調(diào)用 EndDialog函數(shù)為止。 非模態(tài)可以切換,不禁用托管主窗口。,模態(tài)與非模態(tài),編程實例,對話框演示程序,對話框是一種特殊的主窗口,應(yīng)用程序一般通過DialogBoxIndirectParam 函數(shù)創(chuàng)建對話框。需準備對話框模板和對話框的窗口過程函數(shù)。 按下“確定”按鈕或者關(guān)閉對話框時,調(diào)用EndDialog 用來結(jié)束對話框過程。 DestroyAllControls 用來銷毀對話框(包括主窗口)中的所有子控件。,對話框:,對話框是一種特殊的主窗口,應(yīng)用程序一般通過DialogBoxIndirectParam 函數(shù)創(chuàng)建對話框: int GUIAPI DialogBoxIndirectParam (PDLGTEMPLATE pDlgTemplate,HWND hOwner, WNDPROC DlgProc, LPARAM lParam); 該函數(shù)建立的對話框稱為模態(tài)對話框。用戶需要為此函數(shù)準備對話框模板和對話框的窗口過程函數(shù)。,模態(tài)對話框創(chuàng)建:,在 MiniGUI 中,用兩個結(jié)構(gòu)來表示對話框模板:控件數(shù)組和對話框模板。先介紹一下控件數(shù)組。 typedef struct char* class_name; / control class DWORD dwStyle; / control style int x, y, w, h; / control position in dialog int id; / control identifier const char* caption; / control caption DWORD dwAddData; / additional data DWORD dwExStyle; / control extended style CTRLDATA; typedef CTRLDATA* PCTRLDATA;,對話框模板:,#define IDC_PROMPTINFO 100 #define IDC_OK 110 /對話框模版,設(shè)置各個控件的屬性 static CTRLDATA CtrlInitProgress = “static“, WS_VISIBLE | SS_SIMPLE, 10, 10, 380, 16, IDC_PROMPTINFO, “你好!“, 0 , “button“, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 170, 70, 60, 25, IDC_OK, “確定“, 0 ;,對話框模板:,對話框模板 typedef struct DWORD dwStyle; / dialog box style DWORD dwExStyle; / dialog box extended style int x, y, w, h; / dialog box position const char* caption; / dialog box caption HICON hIcon; / dialog box icon HMENU hMenu; / dialog box menu int controlnr; / number of controls PCTRLDATA controls; / poiter to control array DWORD dwAddData; / addtional data, must be zero DLGTEMPLATE; typedef DLGTEMPLATE* PDLGTEMPLATE;,對話框模板:,/對話框模板,設(shè)置對話框的屬性 static DLGTEMPLATE DlgInitProgress = WS_BORDER | WS_CAPTION, WS_EX_NONE, 120, 150, 400, 130, “DEMO“, 0, 0, 2, NULL, 0 ;,對話框模板:,結(jié)構(gòu) CTRLDATA 用來定義控件,DLGTEMPLATE 用來定義對話框本身。 在程序中,應(yīng)該首先利用 CTRLDATA 定義對話框中所有的控件,并用數(shù)組表示??丶谠摂?shù)組中的順序,也就是對話框中用戶按 TAB 鍵時的控件切換順序。 然后定義對話框,指定對話框中的控件數(shù)目,并指定 DLGTEMPLATE 結(jié)構(gòu)中的 controls 指針指向定義控件的數(shù)組。,對話框模板:,在定義了對話框模板數(shù)據(jù)之后, 需要定義對話框的回調(diào)函數(shù), 并調(diào)用DialogBoxIndirectParam 函數(shù)建立對話框。 對話框回調(diào)函數(shù)是一類特殊的主窗口回調(diào)函數(shù)。 用戶在定義自己的對話框回調(diào)函數(shù)時,需要處理 MSG_INITDIALOG 消息。該消息是在 MiniGUI 根據(jù)對話框模板建立對話框以及控件之后,發(fā)送到對話框回調(diào)函數(shù)的。 該消息的 lParam 參數(shù)包含了由DialogBoxIndirectParam 函數(shù)的第四個參數(shù)傳遞到對話框回調(diào)函數(shù)的值。用戶可以利用該值進行對話框的初始化, 或者保存起來以備后用。,對話框回調(diào)函數(shù),static int InitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam) switch (message) /注意這個和主窗口創(chuàng)建的區(qū)別,這個是對話框特有的,在主窗口基礎(chǔ)上增添的。和CREATE一個時機發(fā)送出來的。 case MSG_INITDIALOG: SetWindowText(GetDlgItem(hDlg,IDC_PROMPTINFO),“您好!“); return 1; /處理通知消息 case MSG_COMMAND: switch (wParam) case IDOK: case IDCANCEL: EndDialog (hDlg, wParam); break; break; return DefaultDialogProc (hDlg, message, wParam, lParam); ,對話框回調(diào)函數(shù),static void InitDialogBox (HWND hWnd) /制定對話框模版 DlgInitProgress.controls = CtrlInitProgress; DialogBoxIndirectParam ( ,對話框創(chuàng)建,提供和 Win32 完全兼容的消息框調(diào)用接口。 int MessageBox (HWND hwnd, LPCTSTR lpsztext, LPCSTR lpsztitle, UINT ustyle ); MessageBox (hDlg, “你好!“, “確認“, MB_OK | MB_ICONINFORMATION);,消息框:,消息框:,基本控件,控件風格 大小寫、密碼風格、自動換行、對齊方式等 控件消息 改變大小或位置、讀取寫入數(shù)據(jù)等 控件的通知消息 鼠標、鍵盤、焦點等操作和變化,控件:要素,在 MiniGUI中,通過調(diào)用 CreateWindow 函數(shù)( CreateWindow 其實是CreateWindowEx 函數(shù)的宏),可以建立某個控件類的一個實例。控件類既可以是預(yù)定義 MiniGUI 控件類,也可以是用戶自定義的控件類。 CreateWindow 函數(shù)建立一個子窗口,即控件。 在對話框中,用對話框模版來設(shè)定參數(shù),由對話框創(chuàng)建函數(shù)負責自動創(chuàng)建。,創(chuàng)建控件,hwnd = CreateWindow ( CTRL_STATIC,/類名 “click me!”,/標題名或者名稱 WS_VISIBLE | SS_CENTER | SS_NOTIFY, /風格 ID_STATIC, /ID號 80, 100, 200, 20, /位置與寬度和長度 hDlg,/父句柄 0);/附屬數(shù)據(jù) 它指定了控件類(class_name)、控件標題(caption)、控件風格(style)、控件的標識符(id)、以及窗口的初始位置和大?。▁, y,w, h)。該函數(shù)同時指定子窗口的父窗口(parent)。參數(shù) add_data 用來向控件傳遞其特有數(shù)據(jù)的指針,該指針所指向的數(shù)據(jù)結(jié)構(gòu)隨控件類的不同而不同。,創(chuàng)建控件,控件具有自己的窗口風格定義,需要在創(chuàng)建控件時指定需要的風格,不同的風格將使得控件具有不同的表象和行為。 獲取或設(shè)置控件的狀態(tài)、內(nèi)容等。一般可通過向控件發(fā)送一些通用或者特有的消息來完成。 控件內(nèi)部發(fā)生某種事件時, 會通過通知消息通知其父窗口。通知消息一般通過MSG_COMMAND 消息發(fā)送,該消息的 wParam 參數(shù)由子窗口標識符和通知碼組成,lParam 參數(shù)含有發(fā)出通知消息的控件句柄。也可以為控件設(shè)置一個通知消息的回調(diào)函數(shù),定義回調(diào)函數(shù)就不能發(fā)送通知消息。,控件編程涉及的內(nèi)容,控件常見風格,控件內(nèi)部發(fā)生某種事件時,會通過通知消息通知其父窗口。通知消息一般通過MSG_COMMAND 消息發(fā)送,該消息的 wParam 參數(shù)由子窗口標識符和通知碼組成,lParam 參數(shù)含有發(fā)出通知消息的控件句柄。例如,當用戶修改編輯框中的內(nèi)容時,編輯框會向父窗口發(fā)出 EN_CHANGE 通知消息。 針對控件的通知消息處理引入了SetNotificationCallback 函數(shù),該函數(shù)可以為控件設(shè)置一個通知消息的回調(diào)函數(shù)。當控件有通知消息時,將調(diào)用該函數(shù),而不是發(fā)送通知消息到父窗口。新的應(yīng)用程序應(yīng)盡量使用這個函數(shù)來處理控件的通知消息,以便獲得良好的程序結(jié)構(gòu)。,控件:回調(diào)函數(shù),獲取控件的通知消息回調(diào)函數(shù) GetNotificationCallback 設(shè)置控件的通知消息回調(diào)函數(shù) SetNotificationCallback,控件:回調(diào)函數(shù),static void my_notif_proc (HWND hwnd, int id, int nc, DWORD add_data) if (nc = STN_CLICKED) SetWindowText (hwnd, “notif clicked. :)“); static int InitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam) switch (message) case MSG_INITDIALOG: hwnd = CreateWindow (CTRL_STATIC, “click me!“, WS_VISIBLE | SS_CENTER | SS_NOTIFY, ID_STATIC, 80, 100, 200, 20, hDlg, 0); SetNotificationCallback (hwnd, my_notif_proc); return 0; ,控件:回調(diào)函數(shù),基本控件靜態(tài)框,靜態(tài)框?qū)嵗?將靜態(tài)框控件的風格設(shè)定為SS_SIMPLE、SS_LEFT、SS_CENTER、SS_RIGHT,以及SS_LEFTNOWORDWRAP 之一,將創(chuàng)建用來顯示文字的靜態(tài)框,其所顯示的內(nèi)容在CreateWindow 函數(shù)的 caption 參數(shù)中進行指定,并且在以后可以用SetWindowText 來改變。 通過 SS_SIMPLE 風格創(chuàng)建的控件只用來顯示單行文本,也就是說,控件文本不會自動換行顯示,并且文本永遠是左對齊的。 通過 SS_LEFT、SS_CENTER 或 SS_RIGHT 風格創(chuàng)建的靜態(tài)框可用來顯示多行文本,并分別以左對齊、中對齊和右對齊方式顯示文本。,風格:,hwnd = CreateWindow (CTRL_STATIC, /類名 “Double-click me!”, /內(nèi)容 WS_VISIBLE | SS_CENTER | SS_NOTIFY,/風格,可見,居中,通知 ID_STATIC, /ID號 80, 100, 200, 20,/坐標及大小 hDlg, /父窗口 0);,風格:,當靜態(tài)框風格中包含 SS_NOTIFY 時,靜態(tài)框會產(chǎn)生如下兩個通知消息: STN_DBLCLK:表示用戶在靜態(tài)框內(nèi)雙擊了鼠標左鍵。 STN_CLICKED:表示用戶在靜態(tài)框內(nèi)單擊了鼠標左鍵。,通知碼:,static void my_notif_proc (HWND hwnd, int id, int nc, DWORD add_data) if (nc = STN_DBLCLK) SetWindowText (hwnd, “I am double-clicked. :)“); switch (message) case MSG_INITDIALOG: hwnd = CreateWindow (CTRL_STATIC, “Double-click me!“, WS_VISIBLE | SS_CENTER | SS_NOTIFY, ID_STATIC, 80, 100, 200, 20, hDlg, 0); SetNotificationCallback (hwnd, my_notif_proc); return 0;,通知碼:,基本控件按鈕,按鈕實例,基本控件按鈕,普通按鈕是一個矩形,其中顯示了通過 CreateWindow 傳遞的窗口標題。該矩形占用了在CreateWindow 調(diào)用中給出的全部高度和寬度,而文字位于矩形的中心。,普通按鈕:,按鈕控件主要用來觸發(fā)一個立即回應(yīng)的動作,并且不會長久保持開關(guān)信息。這種形態(tài)的按鈕控件有兩種窗口風格, 分別叫做BS_PUSHBUTTON 和BS_DEFPUSHBUTTON。BS_DEFPUSHBUTTON 中的“DEF”代表“默認”。 當用來設(shè)計對話框時,BS_PUSHBUTTON風格和BS_DEFPUSHBUTTON 風格的作用不同,具有 BS_DEFPUSHBUTTON 的按鈕將是默認接收 ENTER 鍵輸入的按鈕,而不管當前的輸入焦點處于哪個控件上。 但是當用作普通主窗口的控件時,兩種型態(tài)的按鈕作用相同,只是具有 BS_DEFPUSHBUTTON 風格的按鈕的邊框要粗一些。 按鈕文本會以單行的形式在垂直和水平方向居中顯示,不會自動換行。不過,應(yīng)用

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論