OPENMiniGUI程序設計課件_第1頁
OPENMiniGUI程序設計課件_第2頁
OPENMiniGUI程序設計課件_第3頁
OPENMiniGUI程序設計課件_第4頁
OPENMiniGUI程序設計課件_第5頁
已閱讀5頁,還剩139頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、OPENMiniGUI程序設計1 目 錄 1.1.第一章第一章 嵌入式系統基本概念嵌入式系統基本概念 2.2.第二章第二章 LinuxLinux基礎基礎 5.5.第三章第三章 嵌入式交叉編譯環境嵌入式交叉編譯環境 5.5.第四章第四章 嵌入式開發環境的搭建嵌入式開發環境的搭建 5.5.第五章第五章 MiniGUIMiniGUI 6.6.第六章第六章 嵌入式數據庫嵌入式數據庫 OPENMiniGUI程序設計2 第5章 嵌入式開發環境的搭 建 u嵌入式GUI概述 uMiniGUI DEMO uMiniGUI的編譯和安裝 uMiniGUI程序框架 uMiniGUI編程基礎 OPENMiniGUI程序

2、設計3 GUI(Graphics User Interface),圖形用戶界面,借助菜單、 按鈕等標準界面元素和鼠標進行操作,幫助用戶方便地向計算 機系統發出指令,并將系統運行的結果同樣以圖形方式顯示給 用戶。 嵌入式GUI:輕型、占用資源少、高性能、高可靠性、可配置 5.1嵌入式GUI概述 OPENMiniGUI程序設計4 5.2 常用嵌入式GUI介紹 MicroWindows MiniGUI 其他圖形平臺:其他圖形平臺:Qt/Embedded等等 OPENMiniGUI程序設計5 MiniGUIMicroWindowsOpenGUIQT/Embedded APIWin32風格X、Win32

3、風格風格私有私有QT(C+) API是否完備是否完備是是Win32不完善不完善是是是是 函數庫典型大小函數庫典型大小500K600K300K1.5M 可移植性可移植性很好很好很好很好只支持只支持X86平臺平臺較好(函數庫較好(函數庫 跨平臺交跨平臺交 叉編譯困叉編譯困 難)難) 授權條款授權條款GPL/商業許可商業許可 證證 MPL/LGPLLGPLQPL/GPL/商業商業 許可證許可證 多進程支持多進程支持好好X支持好,支持好, Win32不支不支 持持 不好不好好好 健壯性健壯性/穩定性穩定性好好很差很差一般一般差差 多語種支持多語種支持獨特的多字符獨特的多字符 集支持功集支持功 能能 一

4、般一般一般一般UNICODE, 效率低效率低 OPENMiniGUI程序設計6 MiniGUIMicroWindowsOpenGUIQT/Embedded 可配置和可定制可配置和可定制 性性 好,大量編好,大量編 譯配置選項譯配置選項 一般一般差差差差 系統資源消耗系統資源消耗小較大(基于較大(基于 UNIX套接字,套接字, 進程間通訊)進程間通訊) 最小(不支持最小(不支持 多進程)多進程) 最大(C+) 效率效率好好較差較差最好最好差差 操作系統支持操作系統支持Linux/uClin ux, uC/OSII, VxWorks等等 LinuxDos、Linux、 QNX Linux 硬件平臺

5、支持硬件平臺支持X86、ARM、 MIPS、 PowerPC X86、ARM、 MIPS X86X86、ARM 主要應用區域主要應用區域中國大陸、 臺灣地區 美國,及國內少美國,及國內少 數用戶數用戶 歐洲歐洲歐美、韓國 OPENMiniGUI程序設計7 5.3 MiniGUI概述 MiniGUI()原是由魏永明主持和開發的一個自由軟件()原是由魏永明主持和開發的一個自由軟件 項目,現由北京飛漫軟件技術有限公司維護并開展后續項目,現由北京飛漫軟件技術有限公司維護并開展后續 開發。開發。 遵循遵循GPL 條款條款 支持操作系統支持操作系統Linux、uClinux、VxWorks、eCos、 u

6、C/OS-II、pSOS、ThreadX 等等 MiniGUI 為應用程序定義了一組輕量級的窗口和圖形設為應用程序定義了一組輕量級的窗口和圖形設 備接口。備接口。 OPENMiniGUI程序設計8 手機手機/PDA MiniGUI 典型應用 OPENMiniGUI程序設計9 數字媒體數字媒體/機頂盒機頂盒 MiniGUI 典型應用 OPENMiniGUI程序設計10 工控儀表工控儀表 MiniGUI 典型應用 OPENMiniGUI程序設計11 其他其他 MiniGUI 典型應用 OPENMiniGUI程序設計12 miniGUI系統架構 OPENMiniGUI程序設計13 程序架構分析: 結

7、構體初始化 創建窗口 顯示窗口 消息循環 清理資源 MSG_CREATE MSG_PAINT MSG_CLOSE 消息處理函數 OPENMiniGUI程序設計14 本機執行環境 內核:2.6.22 桌面:KDE 底層圖形接口:framebuffer 調試接口qvfb 1.0 miniGUI版本 1.6 OPENMiniGUI程序設計15 2.Hello miniGUI DEMO OPENMiniGUI程序設計16 1) 頭文件(前四個為必須)頭文件(前四個為必須) #include #include #include #include #include common.h 包括 MiniGUI常

8、用的宏及數據類型的定義。 minigui.h 包含了全局的和通用的接口函數以及某些雜項函數的定義。 gdi.h包含了繪圖函數的接口的定義 。 window.h 包含了窗口有關的宏、數據類型、數據結構的定義以及函數接口 聲明。 control.h 包含了 所有內建控件的接口定義。 程序架構分析: OPENMiniGUI程序設計17 2) MiniGUI程序入口點程序入口點 int MiniGUIMain (int argc, const char* argv) 函數原形: int MiniGUIMain (int argc, const char* argv) 參數argc 和argv 與C 程

9、序main 函數的參數argc 和argv 的含義 是一樣的,分別為命令行參數個數和參數字符串數組指針。 main 函數已經在 MiniGUI的函數庫中定義了,該函數在進行一些 MiniGUI的初始化工作之后調用 MiniGUIMain函數。 程序架構分析: OPENMiniGUI程序設計18 3) 設置主窗口屬性 MAINWINCREATE 結構描述 /窗口信息 CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; /風格 CreateInfo.dwExStyle = WS_EX_NONE; CreateInfo.spCaptio

10、n = Hello, world!; /標題名 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; CreateInfo.iBkColor = COLOR_lightwhite; CreateInfo.dwA

11、ddData = 0; CreateInfo.hHosting = HWND_DESKTOP; /托管窗口 程序架構分析: OPENMiniGUI程序設計19 3) 設置主窗口屬性設置主窗口屬性 MAINWINCREATE 結構描述結構描述 CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; 設置主窗口風格,這里把窗口設為初始可見的,并具有邊框 和標題欄。 CreateInfo.deExStyle = WS_EX_NONE; 設置主窗口的擴展風格,該窗口沒有擴展風格。 CreateInfo.spCaption = “HelloWo

12、rld” 設置主窗口的標題為”HelloWorld”。 程序架構分析: OPENMiniGUI程序設計20 3) 3) 設置主窗口屬性設置主窗口屬性 MAINWINCREATE MAINWINCREATE 結構描述結構描述 CreateInfo.hMenu = 0; 設置主窗口的主菜單,該窗口沒有主菜單。 CreateInfo.hCursor = GetSystemCursor(0); 設置主窗口的光標為系統缺省光標。 CreateInfo.hIcon = 0; 設置主窗口的圖標,該窗口沒有圖標。 程序架構分析: OPENMiniGUI程序設計21 3) 設置主窗口屬性設置主窗口屬性 MAIN

13、WINCREATE 結構描述結構描述 CreateInfo.iBkColor = PIXEL_lightwhite; 設置主窗口的背景色為白色,PIXEL_lightwhite 是 MiniGUI預定義的象素值。 CreateInfo.dwAddData = 0; 設置主窗口的附加數據,該窗口沒有附加數據。 CreateInfo.hHosting = HWND_DESKTOP; 設置主窗口的托管窗口為桌面窗口。 程序架構分析: OPENMiniGUI程序設計22 3) 設置主窗口屬性設置主窗口屬性 MAINWINCREATE 結構描述結構描述 CreateInfo.MainWindowProc

14、 = HelloWinProc; 設置主窗口的窗口過程函數為 HelloWinProc,所有發往該 窗口的消息由該函數處理。 CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = 320; CreaetInfo.by=240; 設置主窗口在屏幕上的位置,該窗口左上角位于(0, 0),右 下角位于(320, 240)。 程序架構分析: OPENMiniGUI程序設計23 4) 創建和顯示主窗口 /創建主窗口 hMainWnd = CreateMainWindow ( CreateMainWindow創建主窗口,參數是指向 MAINWINCRE

15、ATE結構的指針 CreateInfo,返回值為所創建的主窗口的句柄。MAINWINCREATE 結構描述 一個主窗口的屬性。 /顯示主窗口 ShowWindow(hMainWnd, SW_SHOWNORMAL); 顯示窗口在屏幕上。 程序架構分析: OPENMiniGUI程序設計24 5) 進入消息循環進入消息循環 MiniGUI 對 MiniGUI程序維護一種名叫消息隊列的數據結構。 在發生事件之后,MiniGUI 將事件轉換為一個消息,并將消息 放入目標程序的消息隊列之中。應用程序現在的任務就是執行 消息循環代碼,不斷地從消息隊列中取出消息,進行處理。 /消息循環 while (GetM

16、essage( DispatchMessage( 程序架構分析: OPENMiniGUI程序設計25 6) 6) 窗口過程函數窗口過程函數 static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) HDC hdc; RECT rc; char msg_text30; switch (message) /創建時發送的消息,用來做初始化處理,這里是初始化字符串內容 case MSG_CREATE: break; /窗口繪畫時發送的消息,用來在界面繪圖或者輸出文字 /注意這里的return 0 表明不需

17、要進入默認處理函數中。 case MSG_PAINT: printf (BeginPaint.n); hdc = BeginPaint (hWnd); TextOut (hdc, 10, 50, ,Hello, world!); EndPaint (hWnd, hdc); printf (EndPaint.n); return 0; /結束時一些處理函數,主要是銷毀主窗口和發送quit消息以退出消息循環。 case MSG_CLOSE: DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; return DefaultMainW

18、inProc(hWnd, message, wParam, lParam); 程序架構分析: OPENMiniGUI程序設計26 6) 窗口過程函數窗口過程函數 在 helloworld.c程序中,窗口過程是HelloWinProc。 CreateMainWindow 函數根據 MAINWINCREATE 結構類型的參 數中指定的窗口過程創建主窗口。 窗口過程函數由 MiniGUI進行調用。 窗口過程函數不予處理的消息應該傳給 DefaultMainWinProc 函數進行缺省處理。 程序架構分析: OPENMiniGUI程序設計27 SendMessage MSG_CREATE CREATE

19、MAINWINDOW MSG_PAINT hWnd SHOWWINDOW PostMessage MSG_PAINT GetMessageWndProc 主窗口創建時消息動作過程:主窗口創建時消息動作過程: 程序架構分析: OPENMiniGUI程序設計28 MSG_CLOSE hWnd MSG_Derstroy hWnd GetMessageWndProc 底層事件響應 用戶單擊關閉按鈕 DestroyMainWindow PostQuitWindow hWnd MSG_QUIT QUIT 退出 主窗口銷毀時消息動作過主窗口銷毀時消息動作過 程:程: 程序架構分析: OPENMiniGUI程

20、序設計29 7) 屏幕輸出屏幕輸出 MSG_PAINT消息-進行屏幕輸出。 case MSG_PAINT: hdc = BeginPaint (hWnd); TextOut (hdc, 60, 60, Hello world!); EndPaint (hWnd, hdc); return 0; 程序架構分析: OPENMiniGUI程序設計30 8) 程序的退出程序的退出 單擊窗口右上角關閉按鈕,發送 MSG_CLOSE 消 息。 case MSG_CLOSE: DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; 程序架構分析

21、: OPENMiniGUI程序設計31 9) 程序編譯程序編譯 MiniGUI-Threads 模式: $ gcc o helloworld helloworld.c lpthread lminigui pthread 線程庫 minigui minigui支持庫 程序架構分析: OPENMiniGUI程序設計32 10) 程序執行 ./helloworld 程序架構分析: OPENMiniGUI程序設計33 MiniGUI函數庫組成 libminigui:核心庫,標準控件:核心庫,標準控件 libmgext :擴展庫,一些有用的控件:擴展庫,一些有用的控件 libvcongui:虛擬控制臺窗

22、口:虛擬控制臺窗口 OPENMiniGUI程序設計34 MiniGUI運行模式 MiniGUI-Threads MiniGUI-Lite MiniGUI-Standalone 注意:注意: 以下講述基于MiniGUI1.6; MiniGUI 2.0.x 中Lite模式升級為Processes 模式。 默認模式是MiniGUI-Threads。 OPENMiniGUI程序設計35 1) 提供了完備的提供了完備的多窗口機制和消息傳遞機制。 2) 提供常用的提供常用的控件類。 3) 對話框和消息框支持。對話框和消息框支持。 4) 其它 GUI 元素,包括菜單、加速鍵、插入符、定時 器等。等。 5)

23、界面皮膚支持。界面皮膚支持。 MiniGUI V1.6.x 的主要特征(1/4): OPENMiniGUI程序設計36 6) 支持低端顯示設備(比如單色支持低端顯示設備(比如單色 LCD)和高端顯示設)和高端顯示設 備(比如彩色顯示器。備(比如彩色顯示器。 7) Windows 的資源文件支持,如位圖、圖標、光標等。的資源文件支持,如位圖、圖標、光標等。 8) 各種流行圖像文件的支持。各種流行圖像文件的支持。 9) 多字符集和多字體支持。 10) 多種鍵盤布局的支持。多種鍵盤布局的支持。 MiniGUI V1.6.x 的主要特征(2/4): OPENMiniGUI程序設計37 11) 漢字(漢

24、字(GB2312)輸入法支持。)輸入法支持。 12) 針對嵌入式系統的特殊支持,包括一般性的針對嵌入式系統的特殊支持,包括一般性的 I/O 流操作,字節序相關函數等。流操作,字節序相關函數等。 13) 層的支持。層的支持。 (MiniGUI-Lite 版本版本)。 14) 提供快速和增強的位塊操作,視頻加速支持以及提供快速和增強的位塊操作,視頻加速支持以及 Alpha 混合等功能。混合等功能。 MiniGUI V1.6.x 的主要特征(3/4): OPENMiniGUI程序設計38 15) 增強的新增強的新 GDI 函數。函數。 16) 圖形抽象層(GAL)以及輸入抽象層(IAL)。 Mini

25、GUI V1.6.x 的主要特征(4/4): OPENMiniGUI程序設計39 輕型、占用資源少輕型、占用資源少 高性能高性能 高可靠性高可靠性 可伸縮性強可伸縮性強 跨操作系統支持跨操作系統支持 可配置可配置 MiniGUI 優勢: OPENMiniGUI程序設計40 MiniGUI編程指南編程指南 V1.6 MiniGUI API Reference Manual V1.6 其他資源其他資源 http:/ MiniGUI 參考手冊: OPENMiniGUI程序設計41 5.4 MiniGUI編譯安裝 北京飛漫軟件技術有限公司北京飛漫軟件技術有限公司 MiniGUI 免費版免費版 獲取Mi

26、niGUI: OPENMiniGUI程序設計42 libminigui-1.6.x.tar.gz:MiniGUI 函數庫源代碼,其函數庫源代碼,其 中包括中包括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 編程指南編程指南 的配套示例程序。的配套示例程序。 源代

27、碼及資源包 OPENMiniGUI程序設計43 基于基于VESA FrameBuffer的圖形引擎。的圖形引擎。 支持支持 FrameBuffer的的Linux內核相關選項:內核相關選項: MiniGUI圖形引擎 OPENMiniGUI程序設計44 修改修改/boot/grub/menu.lst 文件,文件,kernel 打頭的一行添加打頭的一行添加 vga=0 x0317 1024*768*16bpp 必須重新啟動才能生效必須重新啟動才能生效 Linux 引導時,會在屏幕的左上方顯示一個可愛的小企鵝或者發引導時,會在屏幕的左上方顯示一個可愛的小企鵝或者發 行版廠商的行版廠商的 LOGO 圖片

28、圖片 FrameBuffer OPENMiniGUI程序設計45 vga=0 x0317 FrameBuffer: OPENMiniGUI程序設計46 分辨率:分辨率: FrameBuffer分辨率: Colours640 x480800 x6001024x7681280 x10241600 x1200 8 bits0 x3010 x3030 x3050 x3070 x31C 16 bits0 x3110 x3140 x3170 x31A0 x31E 24 bits0 x3120 x3150 x3180 x31B0 x31F OPENMiniGUI程序設計47 libminigui-1.6.0

29、-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 本地安裝庫 OPENMiniGUI程序設計48 修改 /etc/ld.so.conf 文件 共享庫搜索目錄共享庫搜索目錄 /usr/lib /usr/X11R6/lib /usr/i486-linux-libc

30、5/lib /usr/local/lib 運行運行ldconfig 命令刷新系統的共享庫搜索緩存:命令刷新系統的共享庫搜索緩存: $ su -c /sbin/ldconfig 本地安裝更新庫搜索路徑: OPENMiniGUI程序設計49 安裝安裝 MiniGUI 的資源的資源res.tar.bz2軟件包:圖標、光標等 $ tar jxvf res-host.tar.bz2 $ cd res $ make install 默認的安裝腳本會把 MiniGUI 資源文件安裝到 /usr/local/lib/minigui/res/ 目錄下。 本地安裝資源: OPENMiniGUI程序設計50 編譯應

31、用程序例子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 本地安裝代碼編譯: OPENMiniGUI程序設計51 PC 上MiniGUI 的運行 注意:必須要在控制臺模式才能運行注意:必須要在控制臺模式才能運行MiniGUI。要啟動。要啟動 控制臺,按住控制臺,按住CtrlAlt 的同時,按的同時,按F1F6 中的任意中的任意 一個均可,然后登錄系統,進入一個均可,然

32、后登錄系統,進入mg-sample-1.6.0- host/src 目錄,直接運行即可目錄,直接運行即可(./helloworld)。 按住按住CtrlAlt 的同時,按的同時,按7 可返回可返回 本地運行: OPENMiniGUI程序設計52 交叉編譯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需要持續幾分鐘需要持續幾分鐘) 默認的安裝腳本會把

33、 庫文件安裝到 /opt/host/armv4l/armv4l-unknown/linux/lib/ 目錄下 交叉安裝庫: OPENMiniGUI程序設計53 安裝安裝 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/ 目錄下 交叉安裝資源: OPENMiniGUI程序設計54 編譯應用程序

34、例子 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 交叉安裝代碼編譯: OPENMiniGUI程序設計55 將應用程序拷貝到將應用程序拷貝到/arm2410/目錄下目錄下 minicom通訊終端,連接好開發板和主機,打開電源通訊終端,連接好開發板和主機,打開電源 mount t nfs 192.168.0.xx:/arm2410 /h

35、ost ln s /dev/fb/0 /dev/fb0 建立符號連接建立符號連接 mknod /dev/tty0 c 4 0 建立建立/dev/tty0 設備設備 執行執行MiniGUI 應用程序應用程序 在目標板上運行: OPENMiniGUI程序設計56 5.5 MiniGUI程序架構 分析分析 MiniGUI應用程序應用程序 helloworld 源代碼在源代碼在src目錄下目錄下 helloworld 程序運行結果程序運行結果 OPENMiniGUI程序設計57 5.6 MiniGUI編程基礎 本節內容 MiniGUI窗口 MiniGUI消息及消息隊列 MiniGUI對話框 MiniG

36、UI菜單 MiniGUI基本控件 按鈕 靜態框 編輯框 OPENMiniGUI程序設計58 窗口 窗口是屏幕上的一個矩形區域。應用程序的可視部分由窗口是屏幕上的一個矩形區域。應用程序的可視部分由 一個或多個窗口構成。窗口系統控制窗口的位置、大小、一個或多個窗口構成。窗口系統控制窗口的位置、大小、 和可見區域。和可見區域。 一個應用程序窗口一般包括如下部分:一個應用程序窗口一般包括如下部分: 一個可視的邊界一個可視的邊界 一個窗口一個窗口ID,客戶程序使用該,客戶程序使用該ID操作窗口,操作窗口, “窗口窗口 句柄句柄” 一些其它特性:高、寬、背景色等一些其它特性:高、寬、背景色等 可能有菜單和

37、滾動條等附加窗口元素可能有菜單和滾動條等附加窗口元素 OPENMiniGUI程序設計59 窗口 屏幕上的重疊窗口通常具有如下的關系:屏幕上的重疊窗口通常具有如下的關系: 窗口一般組織為層次體系結構的形式(或者說,樹的形式)。 根窗口(root window)是所有窗口的祖先,占滿整個屏幕的 表面,也稱 為桌面窗口。 除了根窗口以外的所有窗口都有父窗口,每一個窗口都可能有 子窗口、 兄弟窗口、祖先窗口和子孫窗口等 子窗口含在父窗口內,同一個父窗口內的子窗口為同級窗口。 窗口有從屬關系,也就是說,某些窗口的生命周期和可見性由 它的所有 者決定。父窗口通常擁有它們的子窗口。 OPENMiniGUI程

38、序設計60 Desktop 主窗口1 主窗口2 控件 (子窗口) 控件 (子窗口) 控件 (子窗口) 對話框1 窗口體系 線程1 線程2 OPENMiniGUI程序設計61 MiniGUI MiniGUI 中有三種窗口類型:中有三種窗口類型:主窗口、對話框和控件窗口(子窗 口)。 每一個每一個MiniGUIMiniGUI應用程序一般都要至少創建一個主窗口,作為應用應用程序一般都要至少創建一個主窗口,作為應用 程序的主界面或開始界面。程序的主界面或開始界面。 主窗口通常包括一些子窗口,這些子窗口通常是控件窗口,也可主窗口通常包括一些子窗口,這些子窗口通常是控件窗口,也可 以是自定義窗口類以是自定

39、義窗口類。 應用程序還會創建其它型的窗口,例如對話框。對話框本質上就應用程序還會創建其它型的窗口,例如對話框。對話框本質上就 是主窗口,應用程序一般通過對話框提示用戶進行輸入操作。是主窗口,應用程序一般通過對話框提示用戶進行輸入操作。 主窗口: OPENMiniGUI程序設計62 主窗口沒有很精確的定義,目前可以認為其特征主要有主窗口沒有很精確的定義,目前可以認為其特征主要有 父窗口為父窗口為Desktop的,擁有子窗口,在創建后可以進入的,擁有子窗口,在創建后可以進入 消息循環。消息循環。 MiniGUI 為每個托管窗口為為每個托管窗口為Desktop的的主窗口建立單獨主窗口建立單獨 的消息

40、隊列的消息隊列,在該主窗口上派生出的主窗口、對話框及,在該主窗口上派生出的主窗口、對話框及 控件(子窗口)均使用同一消息隊列。控件(子窗口)均使用同一消息隊列。 在調用在調用 MiniGUIMain之前,之前,MiniGUI 啟動桌面窗口啟動桌面窗口 Desktop。桌面窗口作為。桌面窗口作為 MiniGUI 的窗口管理器而存的窗口管理器而存 在,也是事實上根窗口。在,也是事實上根窗口。 主窗口: OPENMiniGUI程序設計63 MAINWINCREATE結構體指定窗口信息: 窗口風格窗口風格 窗口標題窗口標題 窗口菜單窗口菜單 窗口圖標窗口圖標 窗口背景色窗口背景色 主窗口屬性: OPE

41、NMiniGUI程序設計64 主窗口屬性: CreateInfo.dwStyle窗口風格窗口風格 CreateInfo.spCaption窗口的標題窗口的標題 CreateInfo.dwExStyle窗口的附加風格窗口的附加風格 CreateInfo.hMenu附加在窗口上的菜單句柄附加在窗口上的菜單句柄 CreateInfo.hCursor在窗口中所使用的鼠標光標句柄在窗口中所使用的鼠標光標句柄 CreateInfo.hIcon程序的圖標程序的圖標 CreateInfo.MainWindowProc該窗口的消息處理函數指針該窗口的消息處理函數指針 CreateInfo.lx窗口左上角相對屏幕

42、的絕對橫坐標,以象素點表示窗口左上角相對屏幕的絕對橫坐標,以象素點表示 CreateInfo.ty窗口左上角相對屏幕的絕對縱坐標,以象素點表示窗口左上角相對屏幕的絕對縱坐標,以象素點表示 CreateInfo.rx窗口右下角相對屏幕的絕對橫坐標,以象素點表示窗口右下角相對屏幕的絕對橫坐標,以象素點表示 CreateInfo.by窗口右下角相對屏幕的絕對縱坐標,以象素點表示窗口右下角相對屏幕的絕對縱坐標,以象素點表示 CreateInfo.iBkColor窗口背景顏色窗口背景顏色 CreateInfo.dwAddData附帶給窗口的一個附帶給窗口的一個 32 位值位值 CreateInfo.hH

43、osting窗口消息隊列的托管窗口窗口消息隊列的托管窗口 OPENMiniGUI程序設計65 主窗口風格: 風格描述 WS_BORDER創建一個具有單線邊框的窗口創建一個具有單線邊框的窗口 WS_THICKFRAME創建一個具有寬邊框的窗口創建一個具有寬邊框的窗口 WS_THINFRAME創建一個具有細邊框的窗口創建一個具有細邊框的窗口 WS_CAPTION創建一個具有標題欄的窗口創建一個具有標題欄的窗口 WS_MAXMIZEBOX創建一個具有最大化框的窗口創建一個具有最大化框的窗口 WS_MINIMIZEBOX創建一個具有最小化框的窗口創建一個具有最小化框的窗口 WS_SYSMENU創建一個

44、具有系統菜單的窗口創建一個具有系統菜單的窗口 WS_HSCROLL創建一個具有水平滾動條的窗口創建一個具有水平滾動條的窗口 WS_VSCROLL創建一個具有垂直滾動條的窗口創建一個具有垂直滾動條的窗口 WS_DISABLED創建一個初始為禁止的窗口創建一個初始為禁止的窗口 WS_MAXIMIZE創建一個初始最大化的窗口創建一個初始最大化的窗口 WS_MINIMIZE創建一個初始最小化的窗口創建一個初始最小化的窗口 WS_VISIBLE創建一個初始可見的窗口創建一個初始可見的窗口 WS_EX_TOPMOST創建一個頂層窗口,創建一個頂層窗口,Win32 的擴展風格的擴展風格 WS_BORDER

45、WS_CAPTION WS_VISIBLE WS_VISIBLE OPENMiniGUI程序設計66 簡而言之,回調函數就是一個通過函數指針調用的函數。如果把簡而言之,回調函數就是一個通過函數指針調用的函數。如果把 函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被 用為調用它所指向的函數時,就可以說這是回調函數。用為調用它所指向的函數時,就可以說這是回調函數。 使用回調函數實際上就是在調用某個函數(通常是類使用回調函數實際上就是在調用某個函數(通常是類APIAPI函數)時,函數)時, 將自己的一個函數(這個函數為回調函數)的地址作

46、為參數傳遞將自己的一個函數(這個函數為回調函數)的地址作為參數傳遞 給那個函數。而那個函數在需要的時候,利用傳遞的地址調用回給那個函數。而那個函數在需要的時候,利用傳遞的地址調用回 調函數,這時你可以利用這個機會在回調函數中處理消息或完成調函數,這時你可以利用這個機會在回調函數中處理消息或完成 一定的操作。至于如何定義回調函數,跟具體使用的類一定的操作。至于如何定義回調函數,跟具體使用的類APIAPI函數有函數有 關,一般在幫助中有說明回調函數的參數和返回值等。關,一般在幫助中有說明回調函數的參數和返回值等。 回調函數: OPENMiniGUI程序設計67 主窗口過程實際是一個主窗口過程實際是

47、一個回調函數,一般由,一般由 DispatchMessage 函數調用,用來處理應用的消息。函數調用,用來處理應用的消息。 定義:int TestMainWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) ; 四個入口參數:消息的目標窗口句柄、消息、消息的 WPARAM (即unsigned int) 型參數和 LPARAM (即long int) 型參數。 在 32 位系統中,消息的兩個參數實際是等長度的。 主窗口的窗口過程處理應用感興趣的消息,將其他消息主窗口的窗口過程處理應用感興趣的消息,將其他消息 傳遞給傳遞給 D

48、efaultMainWinProc 函數處理。函數處理。 主窗口過程: OPENMiniGUI程序設計68 消息和消息隊列 MiniGUI 是一個圖形用戶界面支持系統,通常的GUI 編程概念均 適用于MiniGUI 編程,如窗口和事件驅動編程等。 鍵盤和鼠標動作產生事件,這些事件通常被發送到具有焦點的窗 口,由該窗口相關聯的例程來處理。 焦點和光標的概念用于管理輸入設備和輸入事件的傳送。應用程 序可以捕捉鼠標光標并獲取光標事件、鍵盤輸入焦點和鍵盤事件。 應用程序可通過調用一些系統函數來要求重繪窗口或窗口的某一 部分,這些事件通常由窗口例程來處理。 事件驅動編程: OPENMiniGUI程序設計

49、69 消息被如下定義(消息被如下定義():): typedef struct _MSG HWND hwnd; /窗口句柄窗口句柄 int message; /消息類型消息類型 WPARAM wParam; /消息參數消息參數 LPARAM lParam; /消息參數消息參數 struct timeval time; void* pAdd; MSG; typedef MSG* PMSG; 消息結構的定義: OPENMiniGUI程序設計70 l 系統消息: MSG_IDLE、MSG_TIMER、MSG_FDEVENT等; l 對話框消息: MSG_COMMAND、MSG_INITDIALOG、M

50、SG_SETTEXT等; l 窗口繪制消息: MSG_PAINT、MSG_ERASEBKGND等; l 窗口創建和銷毀消息: MSG_CREATE、MSG_DESTROY、MSG_CLOSE等; l 鍵盤和鼠標消息: MSG_KEYDOWN、MSG_CHAR、MSG_LBUTTONDOWN等; l 鼠標/鍵盤后處理消息: MSG_SETCURSOR、MSG_SETFOCUS、MSG_KILLFOCUS等; l 用戶自定義消息 MSG_USER 消息的種類: OPENMiniGUI程序設計71 消息隊列:系統中用于存儲消息的一塊內存區 域,每個消息存儲在一個消息結構中 。 MiniGUI有兩種向

51、窗口過程發送消息的辦法: 把消息投遞到一個先進先出的消息隊列中。大多 數消息。 通過消息發送函數直接調用窗口過程函數。需立 即處理,如MSG_ERASEBKGND消息。 消息隊列: OPENMiniGUI程序設計72 MiniGUI 為每個托管窗口為Desktop的主窗口建立單獨的消息隊 列,在該主窗口上派生出的主窗口、對話框及控件(子窗口) 均使用同一消息隊列。 消息隊列中存儲大部分消息,如底層的鍵盤和鼠標消息。還有 上層邏輯消息等等。大部分消息要經過消息隊列存儲。 消息處理 OPENMiniGUI程序設計73 MiniGUI-Threads 中每個線程創建的第一個主窗口,其托管 窗口必須是

52、桌面,即HWND_DESKTOP,該線程的其他窗口, 必須由屬于同一線程的已有主窗口作為托管窗口。系統在托管 窗口為 HWND_DESKTOP 時創建新的消息隊列,而在指定非 桌面的窗口作為托管窗口時,使用該托管窗口的消息隊列。 窗口消息隊列的托管窗口 OPENMiniGUI程序設計74 消息循環 minigui中大部分動作要在消息循環中調用消息處理函數來完成。 實際上消息循環就是不斷的從消息隊列中取出消息,直至遇到 MSG_QUIT才退出該次消息循環。 while (GetMessage( DispatchMessage( Msg 變量是類型為 MSG的結構,MSG結構在 window.h中

53、。 消息處理: OPENMiniGUI程序設計75 窗口過程函數 在 helloworld.c程序中,窗口過程是HelloWinProc。 CreateMainWindow 函數根據 MAINWINCREATE 結構類型的參數中 指定的窗口過程創建主窗口。 窗口過程函數由 MiniGUI進行調用,是一個回調函數。 窗口過程函數不予處理的消息應該傳給 DefaultMainWinProc 函 數進行缺省處理。 消息處理: OPENMiniGUI程序設計76 窗口過程函數 窗口過程函數總是定義為如下形式: static int HelloWinProc(HWND hWnd, int message

54、, WPARAM wParam, LPARAM lParam) 第一個參數 hWnd是接受消息的窗口的句柄。 第二個參數標識窗口所收到消息的整數值。 最后兩個參數都是 32位的消息參數。 消息處理: OPENMiniGUI程序設計77 SendMessage MSG_CREATE CREATEMAINWINDOW MSG_PAINT hWnd SHOWWINDOW PostMessage MSG_PAINT GetMessageWndProc 主窗口創建時消息動作過程: OPENMiniGUI程序設計78 MSG_CLOSE hWnd MSG_Derstroy hWnd GetMessageW

55、ndProc 底層事件響應 用戶單擊關閉按鈕 DestroyMainWindow PostQuitWindow hWnd MSG_QUIT QUIT 退出 主窗口銷毀時消息動作過程: OPENMiniGUI程序設計79 投遞(郵寄)消息:把消息復制到消息隊列中。投遞(郵寄)消息:把消息復制到消息隊列中。 發送消息:直接把消息發送到窗口過程函數。發送消息:直接把消息發送到窗口過程函數。 發送和投遞消息: OPENMiniGUI程序設計80 發送和投遞消息: 電話 發送消息發送消息 投遞消息投遞消息 郵箱 OPENMiniGUI程序設計81 PostMessage 立即返回。 “郵寄” PostS

56、yncMessage 向不同的線程消息隊列郵寄消息, 消息被處理之后返回, 同步消息。“郵寄” SendMessage 消息處理完成之后返回。 同線程“發送”。不同線程“郵寄”(PostSyncMessage)。 SendNotifyMessage 立即返回,不允許丟失。“郵 寄”。 SendAsyncMessage 異步消息。“發送”。 發送和投遞消息: OPENMiniGUI程序設計82 對話框 簡單而言,模態對話框就是顯示之后,用戶不能再切換到其他主 窗口(同線程內)進行工作的對話框,而只能在關閉之后,才能 使用其他的主窗口。 MiniGUI 中,使用 DialogBoxIndirect

57、Param 函數建立的對話框 就是模態對話框。 實際上,該對話框首先根據模板建立對話框,然后禁止其托管主 窗口,并在主窗口的 MSG_CREATE 消息中創建控件,之后發送 MSG_INITDIALOG消息給回調函數,最終建立一個新的消息循環, 并進入該消息循環,直到程序調用 EndDialog函數為止。 非模態可以切換,不禁用托管主窗口。 模態與非模態 OPENMiniGUI程序設計83 編程實例編程實例 對話框演示程序 OPENMiniGUI程序設計84 對話框是一種特殊的主窗口,應用程序一般通過 DialogBoxIndirectParam 函數創建對話框。需準備 對話框模板和對話框的窗

58、口過程函數。 按下“確定”按鈕或者關閉對話框時,調用EndDialog 用 來結束對話框過程。 DestroyAllControls 用來銷毀對話框(包括主窗口) 中的所有子控件。 對話框: OPENMiniGUI程序設計85 對話框是一種特殊的主窗口,應用程序一般通過 DialogBoxIndirectParam 函數創建對話框: int GUIAPI DialogBoxIndirectParam (PDLGTEMPLATE pDlgTemplate,HWND hOwner, WNDPROC DlgProc, LPARAM lParam); 該函數建立的對話框稱為模態對話框。用戶需要為此函

59、數準備對話框模板和對話框的窗口過程函數。 模態對話框創建: OPENMiniGUI程序設計86 在 MiniGUI 中,用兩個結構來表示對話框模板:控件數組和對話 框模板。先介紹一下控件數組。 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 dwAd

60、dData; / additional data DWORD dwExStyle; / control extended style CTRLDATA; typedef CTRLDATA* PCTRLDATA; 對話框模板: OPENMiniGUI程序設計87 #define IDC_PROMPTINFO100 #define IDC_OK 110 /對話框模版,設置各個控件的屬性 static CTRLDATA CtrlInitProgress = static, WS_VISIBLE | SS_SIMPLE, 10, 10, 380, 16, IDC_PROMPTINFO, 你好!, 0

溫馨提示

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

評論

0/150

提交評論