




已閱讀5頁,還剩139頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目 錄,1.第一章 嵌入式系統(tǒng)基本概念 2.第二章 Linux基礎(chǔ) 5.第三章 嵌入式交叉編譯環(huán)境 5.第四章 嵌入式開發(fā)環(huán)境的搭建 5.第五章 MiniGUI程序設(shè)計(jì) 6.第六章 嵌入式數(shù)據(jù)庫,第5章 嵌入式開發(fā)環(huán)境的搭建,嵌入式GUI概述 MiniGUI DEMO MiniGUI的編譯和安裝 MiniGUI程序框架 MiniGUI編程基礎(chǔ),GUI(Graphics User Interface),圖形用戶界面,借助菜單、按鈕等標(biāo)準(zhǔn)界面元素和鼠標(biāo)進(jìn)行操作,幫助用戶方便地向計(jì)算機(jī)系統(tǒng)發(fā)出指令,并將系統(tǒng)運(yùn)行的結(jié)果同樣以圖形方式顯示給用戶。 嵌入式GUI:輕型、占用資源少、高性能、高可靠性、可配置,5.1嵌入式GUI概述,5.2 常用嵌入式GUI介紹,MicroWindows MiniGUI 其他圖形平臺(tái):Qt/Embedded等,5.3 MiniGUI概述,MiniGUI()原是由魏永明主持和開發(fā)的一個(gè)自由軟件項(xiàng)目,現(xiàn)由北京飛漫軟件技術(shù)有限公司維護(hù)并開展后續(xù)開發(fā)。 遵循GPL 條款 支持操作系統(tǒng)Linux、uClinux、VxWorks、eCos、uC/OS-II、pSOS、ThreadX 等 MiniGUI 為應(yīng)用程序定義了一組輕量級(jí)的窗口和圖形設(shè)備接口。,手機(jī)/PDA,MiniGUI 典型應(yīng)用,數(shù)字媒體/機(jī)頂盒,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ù),本機(jī)執(zhí)行環(huán)境,內(nèi)核:2.6.22 桌面:KDE 底層圖形接口:framebuffer 調(diào)試接口qvfb 1.0 miniGUI版本 1.6,2.Hello miniGUI,DEMO,1) 頭文件(前四個(gè)為必須) #include #include #include #include #include common.h 包括 MiniGUI常用的宏及數(shù)據(jù)類型的定義。 minigui.h 包含了全局的和通用的接口函數(shù)以及某些雜項(xiàng)函數(shù)的定義。 gdi.h包含了繪圖函數(shù)的接口的定義 。 window.h 包含了窗口有關(guān)的宏、數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)的定義以及函數(shù)接口聲明。 control.h 包含了 所有內(nèi)建控件的接口定義。,程序架構(gòu)分析:,2) MiniGUI程序入口點(diǎn) 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ù)個(gè)數(shù)和參數(shù)字符串?dāng)?shù)組指針。 main 函數(shù)已經(jīng)在 MiniGUI的函數(shù)庫中定義了,該函數(shù)在進(jìn)行一些 MiniGUI的初始化工作之后調(diào)用 MiniGUIMain函數(shù)。,程序架構(gòu)分析:,3) 設(shè)置主窗口屬性 MAINWINCREATE 結(jié)構(gòu)描述 /窗口信息 CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; /風(fēng)格 CreateInfo.dwExStyle = WS_EX_NONE; CreateInfo.spCaption = “Hello, world!“; /標(biāo)題名 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è)置主窗口風(fēng)格,這里把窗口設(shè)為初始可見的,并具有邊框和標(biāo)題欄。 CreateInfo.deExStyle = WS_EX_NONE; 設(shè)置主窗口的擴(kuò)展風(fēng)格,該窗口沒有擴(kuò)展風(fēng)格。 CreateInfo.spCaption = “HelloWorld” 設(shè)置主窗口的標(biāo)題為”HelloWorld”。,程序架構(gòu)分析:,3) 設(shè)置主窗口屬性 MAINWINCREATE 結(jié)構(gòu)描述 CreateInfo.hMenu = 0; 設(shè)置主窗口的主菜單,該窗口沒有主菜單。 CreateInfo.hCursor = GetSystemCursor(0); 設(shè)置主窗口的光標(biāo)為系統(tǒng)缺省光標(biāo)。 CreateInfo.hIcon = 0; 設(shè)置主窗口的圖標(biāo),該窗口沒有圖標(biāo)。,程序架構(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) 進(jìn)入消息循環(huán) MiniGUI 對(duì) MiniGUI程序維護(hù)一種名叫消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu)。在發(fā)生事件之后,MiniGUI 將事件轉(zhuǎn)換為一個(gè)消息,并將消息放入目標(biāo)程序的消息隊(duì)列之中。應(yīng)用程序現(xiàn)在的任務(wù)就是執(zhí)行消息循環(huán)代碼,不斷地從消息隊(duì)列中取出消息,進(jì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)建時(shí)發(fā)送的消息,用來做初始化處理,這里是初始化字符串內(nèi)容 case MSG_CREATE: break; /窗口繪畫時(shí)發(fā)送的消息,用來在界面繪圖或者輸出文字 /注意這里的return 0 表明不需要進(jìn)入默認(rèn)處理函數(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í)一些處理函數(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進(jìn)行調(diào)用。 窗口過程函數(shù)不予處理的消息應(yīng)該傳給 DefaultMainWinProc 函數(shù)進(jìn)行缺省處理。,程序架構(gòu)分析:,SendMessage MSG_CREATE,CREATEMAINWINDOW,MSG_PAINT,hWnd,SHOWWINDOW,PostMessage MSG_PAINT,GetMessage,WndProc,主窗口創(chuàng)建時(shí)消息動(dòng)作過程:,程序架構(gòu)分析:,MSG_CLOSE,hWnd,MSG_Derstroy,hWnd,GetMessage,WndProc,底層事件響應(yīng) 用戶單擊關(guān)閉按鈕,DestroyMainWindow PostQuitWindow,hWnd,MSG_QUIT,QUIT 退出,主窗口銷毀時(shí)消息動(dòng)作過程:,程序架構(gòu)分析:,7) 屏幕輸出 MSG_PAINT消息-進(jìn)行屏幕輸出。 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:核心庫,標(biāo)準(zhǔn)控件 libmgext :擴(kuò)展庫,一些有用的控件 libvcongui:虛擬控制臺(tái)窗口,MiniGUI運(yùn)行模式,MiniGUI-Threads MiniGUI-Lite MiniGUI-Standalone 注意: 以下講述基于MiniGUI1.6; MiniGUI 2.0.x 中Lite模式升級(jí)為Processes 模式。 默認(rèn)模式是MiniGUI-Threads。,1) 提供了完備的多窗口機(jī)制和消息傳遞機(jī)制。 2) 提供常用的控件類。 3) 對(duì)話框和消息框支持。 4) 其它 GUI 元素,包括菜單、加速鍵、插入符、定時(shí)器等。 5) 界面皮膚支持。,MiniGUI V1.6.x 的主要特征(1/4):,6) 支持低端顯示設(shè)備(比如單色 LCD)和高端顯示設(shè)備(比如彩色顯示器。 7) Windows 的資源文件支持,如位圖、圖標(biāo)、光標(biāo)等。 8) 各種流行圖像文件的支持。 9) 多字符集和多字體支持。 10) 多種鍵盤布局的支持。,MiniGUI V1.6.x 的主要特征(2/4):,11) 漢字(GB2312)輸入法支持。 12) 針對(duì)嵌入式系統(tǒng)的特殊支持,包括一般性的 I/O 流操作,字節(jié)序相關(guān)函數(shù)等。 13) 層的支持。 (MiniGUI-Lite 版本)。 14) 提供快速和增強(qiáng)的位塊操作,視頻加速支持以及 Alpha 混合等功能。,MiniGUI V1.6.x 的主要特征(3/4):,15) 增強(qiáng)的新 GDI 函數(shù)。 16) 圖形抽象層(GAL)以及輸入抽象層(IAL)。,MiniGUI V1.6.x 的主要特征(4/4):,輕型、占用資源少 高性能 高可靠性 可伸縮性強(qiáng) 跨操作系統(tǒng)支持 可配置,MiniGUI 優(yōu)勢(shì):,MiniGUI編程指南 V1.6 MiniGUI API Reference Manual V1.6 其他資源 /api_ref/1.6.10/globals_0x65.html#index_d,MiniGUI 參考手冊(cè):,5.4 MiniGUI編譯安裝,北京飛漫軟件技術(shù)有限公司 MiniGUI 免費(fèi)版,獲取MiniGUI:,libminigui-1.6.x.tar.gz:MiniGUI 函數(shù)庫源代碼,其中包括libminigui、libmgext 和 libvcongui。 minigui-res-1.6.tar.gz:MiniGUI 所使用的資源, 包括基本字體、圖標(biāo)、位圖和鼠標(biāo)光標(biāo)。 mde-1.6.x.tar.gz:MiniGUI 的綜合演示程序。 mg-smaples-1.6.x.tar.gz:MiniGUI 編程指南的配套示例程序。,源代碼及資源包,基于VESA FrameBuffer的圖形引擎。 支持 FrameBuffer的Linux內(nèi)核相關(guān)選項(xiàng):,MiniGUI圖形引擎,修改/boot/grub/menu.lst 文件,kernel 打頭的一行添加 vga=0x0317 1024*768*16bpp 必須重新啟動(dòng)才能生效 Linux 引導(dǎo)時(shí),會(huì)在屏幕的左上方顯示一個(gè)可愛的小企鵝或者發(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 運(yùn)行l(wèi)dconfig 命令刷新系統(tǒng)的共享庫搜索緩存: $ su -c /sbin/ldconfig,本地安裝更新庫搜索路徑:,安裝 MiniGUI 的資源res.tar.bz2軟件包:圖標(biāo)、光標(biāo)等 $ tar jxvf res-host.tar.bz2 $ cd res $ make install 默認(rèn)的安裝腳本會(huì)把 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 的運(yùn)行 注意:必須要在控制臺(tái)模式才能運(yùn)行MiniGUI。要啟動(dòng)控制臺(tái),按住CtrlAlt 的同時(shí),按F1F6 中的任意一個(gè)均可,然后登錄系統(tǒng),進(jìn)入mg-sample-1.6.0-host/src 目錄,直接運(yùn)行即可(./helloworld)。 按住CtrlAlt 的同時(shí),按7 可返回,本地運(yùn)行:,交叉編譯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ù)幾分鐘) 默認(rèn)的安裝腳本會(huì)把 庫文件安裝到/opt/host/armv4l/armv4l-unknown/linux/lib/ 目錄下,交叉安裝庫:,安裝 MiniGUI 的資源res.tar.bz2軟件包:圖標(biāo)、光標(biāo)等 $ tar jxvf res-target.tar.bz2 $ cd res-target $ make install 默認(rèn)的安裝腳本會(huì)把 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ā)板和主機(jī),打開電源 mount t nfs 192.168.0.xx:/arm2410 /host ln s /dev/fb/0 /dev/fb0 建立符號(hào)連接 mknod /dev/tty0 c 4 0 建立/dev/tty0 設(shè)備 執(zhí)行MiniGUI 應(yīng)用程序,在目標(biāo)板上運(yùn)行:,5.5 MiniGUI程序架構(gòu),分析 MiniGUI應(yīng)用程序 helloworld 源代碼在src目錄下 helloworld 程序運(yùn)行結(jié)果,5.6 MiniGUI編程基礎(chǔ),本節(jié)內(nèi)容 MiniGUI窗口 MiniGUI消息及消息隊(duì)列 MiniGUI對(duì)話框 MiniGUI菜單 MiniGUI基本控件 按鈕 靜態(tài)框 編輯框,窗口,窗口是屏幕上的一個(gè)矩形區(qū)域。應(yīng)用程序的可視部分由一個(gè)或多個(gè)窗口構(gòu)成。窗口系統(tǒng)控制窗口的位置、大小、和可見區(qū)域。 一個(gè)應(yīng)用程序窗口一般包括如下部分: 一個(gè)可視的邊界 一個(gè)窗口ID,客戶程序使用該ID操作窗口, “窗口句柄” 一些其它特性:高、寬、背景色等 可能有菜單和滾動(dòng)條等附加窗口元素,窗口,屏幕上的重疊窗口通常具有如下的關(guān)系: 窗口一般組織為層次體系結(jié)構(gòu)的形式(或者說,樹的形式)。 根窗口(root window)是所有窗口的祖先,占滿整個(gè)屏幕的表面,也稱 為桌面窗口。 除了根窗口以外的所有窗口都有父窗口,每一個(gè)窗口都可能有子窗口、 兄弟窗口、祖先窗口和子孫窗口等 子窗口含在父窗口內(nèi),同一個(gè)父窗口內(nèi)的子窗口為同級(jí)窗口。 窗口有從屬關(guān)系,也就是說,某些窗口的生命周期和可見性由它的所有 者決定。父窗口通常擁有它們的子窗口。,Desktop,主窗口1,主窗口2,控件 (子窗口),控件 (子窗口),控件 (子窗口),對(duì)話框1,窗口體系,線程1,線程2,MiniGUI 中有三種窗口類型:主窗口、對(duì)話框和控件窗口(子窗口)。 每一個(gè)MiniGUI應(yīng)用程序一般都要至少創(chuàng)建一個(gè)主窗口,作為應(yīng)用程序的主界面或開始界面。 主窗口通常包括一些子窗口,這些子窗口通常是控件窗口,也可以是自定義窗口類。 應(yīng)用程序還會(huì)創(chuàng)建其它型的窗口,例如對(duì)話框。對(duì)話框本質(zhì)上就是主窗口,應(yīng)用程序一般通過對(duì)話框提示用戶進(jìn)行輸入操作。,主窗口:,主窗口沒有很精確的定義,目前可以認(rèn)為其特征主要有父窗口為Desktop的,擁有子窗口,在創(chuàng)建后可以進(jìn)入消息循環(huán)。 MiniGUI 為每個(gè)托管窗口為Desktop的主窗口建立單獨(dú)的消息隊(duì)列,在該主窗口上派生出的主窗口、對(duì)話框及控件(子窗口)均使用同一消息隊(duì)列。 在調(diào)用 MiniGUIMain之前,MiniGUI 啟動(dòng)桌面窗口Desktop。桌面窗口作為 MiniGUI 的窗口管理器而存在,也是事實(shí)上根窗口。,主窗口:,MAINWINCREATE結(jié)構(gòu)體指定窗口信息: 窗口風(fēng)格 窗口標(biāo)題 窗口菜單 窗口圖標(biāo) 窗口背景色 ,主窗口屬性:,主窗口屬性:,主窗口風(fēng)格:,WS_BORDER WS_CAPTION WS_VISIBLE,WS_VISIBLE,簡而言之,回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),就可以說這是回調(diào)函數(shù)。 使用回調(diào)函數(shù)實(shí)際上就是在調(diào)用某個(gè)函數(shù)(通常是類API函數(shù))時(shí),將自己的一個(gè)函數(shù)(這個(gè)函數(shù)為回調(diào)函數(shù))的地址作為參數(shù)傳遞給那個(gè)函數(shù)。而那個(gè)函數(shù)在需要的時(shí)候,利用傳遞的地址調(diào)用回調(diào)函數(shù),這時(shí)你可以利用這個(gè)機(jī)會(huì)在回調(diào)函數(shù)中處理消息或完成一定的操作。至于如何定義回調(diào)函數(shù),跟具體使用的類API函數(shù)有關(guān),一般在幫助中有說明回調(diào)函數(shù)的參數(shù)和返回值等。,回調(diào)函數(shù):,主窗口過程實(shí)際是一個(gè)回調(diào)函數(shù),一般由 DispatchMessage 函數(shù)調(diào)用,用來處理應(yīng)用的消息。 定義:int TestMainWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) ; 四個(gè)入口參數(shù):消息的目標(biāo)窗口句柄、消息、消息的 WPARAM (即unsigned int) 型參數(shù)和 LPARAM (即long int) 型參數(shù)。 在 32 位系統(tǒng)中,消息的兩個(gè)參數(shù)實(shí)際是等長度的。 主窗口的窗口過程處理應(yīng)用感興趣的消息,將其他消息傳遞給 DefaultMainWinProc 函數(shù)處理。,主窗口過程:,消息和消息隊(duì)列,MiniGUI 是一個(gè)圖形用戶界面支持系統(tǒng),通常的GUI 編程概念均適用于MiniGUI 編程,如窗口和事件驅(qū)動(dòng)編程等。 鍵盤和鼠標(biāo)動(dòng)作產(chǎn)生事件,這些事件通常被發(fā)送到具有焦點(diǎn)的窗口,由該窗口相關(guān)聯(lián)的例程來處理。 焦點(diǎn)和光標(biāo)的概念用于管理輸入設(shè)備和輸入事件的傳送。應(yīng)用程序可以捕捉鼠標(biāo)光標(biāo)并獲取光標(biāo)事件、鍵盤輸入焦點(diǎn)和鍵盤事件。 應(yīng)用程序可通過調(diào)用一些系統(tǒng)函數(shù)來要求重繪窗口或窗口的某一部分,這些事件通常由窗口例程來處理。,事件驅(qū)動(dòng)編程:,消息被如下定義(): 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等; 對(duì)話框消息: MSG_COMMAND、MSG_INITDIALOG、MSG_SETTEXT等; 窗口繪制消息: MSG_PAINT、MSG_ERASEBKGND等; 窗口創(chuàng)建和銷毀消息: MSG_CREATE、MSG_DESTROY、MSG_CLOSE等; 鍵盤和鼠標(biāo)消息: MSG_KEYDOWN、MSG_CHAR、MSG_LBUTTONDOWN等; 鼠標(biāo)/鍵盤后處理消息: MSG_SETCURSOR、MSG_SETFOCUS、MSG_KILLFOCUS等; 用戶自定義消息 MSG_USER,消息的種類:,消息隊(duì)列:系統(tǒng)中用于存儲(chǔ)消息的一塊內(nèi)存區(qū)域,每個(gè)消息存儲(chǔ)在一個(gè)消息結(jié)構(gòu)中 。 MiniGUI有兩種向窗口過程發(fā)送消息的辦法: 把消息投遞到一個(gè)先進(jìn)先出的消息隊(duì)列中。大多數(shù)消息。 通過消息發(fā)送函數(shù)直接調(diào)用窗口過程函數(shù)。需立即處理,如MSG_ERASEBKGND消息。,消息隊(duì)列:,MiniGUI 為每個(gè)托管窗口為Desktop的主窗口建立單獨(dú)的消息隊(duì)列,在該主窗口上派生出的主窗口、對(duì)話框及控件(子窗口)均使用同一消息隊(duì)列。 消息隊(duì)列中存儲(chǔ)大部分消息,如底層的鍵盤和鼠標(biāo)消息。還有上層邏輯消息等等。大部分消息要經(jīng)過消息隊(duì)列存儲(chǔ)。,消息處理,MiniGUI-Threads 中每個(gè)線程創(chuàng)建的第一個(gè)主窗口,其托管窗口必須是桌面,即HWND_DESKTOP,該線程的其他窗口,必須由屬于同一線程的已有主窗口作為托管窗口。系統(tǒng)在托管窗口為 HWND_DESKTOP 時(shí)創(chuàng)建新的消息隊(duì)列,而在指定非桌面的窗口作為托管窗口時(shí),使用該托管窗口的消息隊(duì)列。,窗口消息隊(duì)列的托管窗口,消息循環(huán) minigui中大部分動(dòng)作要在消息循環(huán)中調(diào)用消息處理函數(shù)來完成。實(shí)際上消息循環(huán)就是不斷的從消息隊(duì)列中取出消息,直至遇到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進(jìn)行調(diào)用,是一個(gè)回調(diào)函數(shù)。 窗口過程函數(shù)不予處理的消息應(yīng)該傳給 DefaultMainWinProc 函數(shù)進(jìn)行缺省處理。,消息處理:,窗口過程函數(shù) 窗口過程函數(shù)總是定義為如下形式: static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) 第一個(gè)參數(shù) hWnd是接受消息的窗口的句柄。 第二個(gè)參數(shù)標(biāo)識(shí)窗口所收到消息的整數(shù)值。 最后兩個(gè)參數(shù)都是 32位的消息參數(shù)。,消息處理:,SendMessage MSG_CREATE,CREATEMAINWINDOW,MSG_PAINT,hWnd,SHOWWINDOW,PostMessage MSG_PAINT,GetMessage,WndProc,主窗口創(chuàng)建時(shí)消息動(dòng)作過程:,MSG_CLOSE,hWnd,MSG_Derstroy,hWnd,GetMessage,WndProc,底層事件響應(yīng) 用戶單擊關(guān)閉按鈕,DestroyMainWindow PostQuitWindow,hWnd,MSG_QUIT,QUIT 退出,主窗口銷毀時(shí)消息動(dòng)作過程:,投遞(郵寄)消息:把消息復(fù)制到消息隊(duì)列中。 發(fā)送消息:直接把消息發(fā)送到窗口過程函數(shù)。,發(fā)送和投遞消息:,發(fā)送和投遞消息:,電話,發(fā)送消息,投遞消息,郵箱,PostMessage 立即返回。 “郵寄” PostSyncMessage 向不同的線程消息隊(duì)列郵寄消息,消息被處理之后返回, 同步消息?!班]寄” SendMessage 消息處理完成之后返回。 同線程“發(fā)送”。不同線程“郵寄”(PostSyncMessage)。 SendNotifyMessage 立即返回,不允許丟失。“郵寄”。 SendAsyncMessage 異步消息?!鞍l(fā)送”。,發(fā)送和投遞消息:,對(duì)話框,簡單而言,模態(tài)對(duì)話框就是顯示之后,用戶不能再切換到其他主窗口(同線程內(nèi))進(jìn)行工作的對(duì)話框,而只能在關(guān)閉之后,才能使用其他的主窗口。 MiniGUI 中,使用 DialogBoxIndirectParam 函數(shù)建立的對(duì)話框就是模態(tài)對(duì)話框。 實(shí)際上,該對(duì)話框首先根據(jù)模板建立對(duì)話框,然后禁止其托管主窗口,并在主窗口的 MSG_CREATE 消息中創(chuàng)建控件,之后發(fā)送 MSG_INITDIALOG消息給回調(diào)函數(shù),最終建立一個(gè)新的消息循環(huán),并進(jìn)入該消息循環(huán),直到程序調(diào)用 EndDialog函數(shù)為止。 非模態(tài)可以切換,不禁用托管主窗口。,模態(tài)與非模態(tài),編程實(shí)例,對(duì)話框演示程序,對(duì)話框是一種特殊的主窗口,應(yīng)用程序一般通過DialogBoxIndirectParam 函數(shù)創(chuàng)建對(duì)話框。需準(zhǔn)備對(duì)話框模板和對(duì)話框的窗口過程函數(shù)。 按下“確定”按鈕或者關(guān)閉對(duì)話框時(shí),調(diào)用EndDialog 用來結(jié)束對(duì)話框過程。 DestroyAllControls 用來銷毀對(duì)話框(包括主窗口)中的所有子控件。,對(duì)話框:,對(duì)話框是一種特殊的主窗口,應(yīng)用程序一般通過DialogBoxIndirectParam 函數(shù)創(chuàng)建對(duì)話框: int GUIAPI DialogBoxIndirectParam (PDLGTEMPLATE pDlgTemplate,HWND hOwner, WNDPROC DlgProc, LPARAM lParam); 該函數(shù)建立的對(duì)話框稱為模態(tài)對(duì)話框。用戶需要為此函數(shù)準(zhǔn)備對(duì)話框模板和對(duì)話框的窗口過程函數(shù)。,模態(tài)對(duì)話框創(chuàng)建:,在 MiniGUI 中,用兩個(gè)結(jié)構(gòu)來表示對(duì)話框模板:控件數(shù)組和對(duì)話框模板。先介紹一下控件數(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;,對(duì)話框模板:,#define IDC_PROMPTINFO 100 #define IDC_OK 110 /對(duì)話框模版,設(shè)置各個(gè)控件的屬性 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 ;,對(duì)話框模板:,對(duì)話框模板 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;,對(duì)話框模板:,/對(duì)話框模板,設(shè)置對(duì)話框的屬性 static DLGTEMPLATE DlgInitProgress = WS_BORDER | WS_CAPTION, WS_EX_NONE, 120, 150, 400, 130, “DEMO“, 0, 0, 2, NULL, 0 ;,對(duì)話框模板:,結(jié)構(gòu) CTRLDATA 用來定義控件,DLGTEMPLATE 用來定義對(duì)話框本身。 在程序中,應(yīng)該首先利用 CTRLDATA 定義對(duì)話框中所有的控件,并用數(shù)組表示??丶谠摂?shù)組中的順序,也就是對(duì)話框中用戶按 TAB 鍵時(shí)的控件切換順序。 然后定義對(duì)話框,指定對(duì)話框中的控件數(shù)目,并指定 DLGTEMPLATE 結(jié)構(gòu)中的 controls 指針指向定義控件的數(shù)組。,對(duì)話框模板:,在定義了對(duì)話框模板數(shù)據(jù)之后, 需要定義對(duì)話框的回調(diào)函數(shù), 并調(diào)用DialogBoxIndirectParam 函數(shù)建立對(duì)話框。 對(duì)話框回調(diào)函數(shù)是一類特殊的主窗口回調(diào)函數(shù)。 用戶在定義自己的對(duì)話框回調(diào)函數(shù)時(shí),需要處理 MSG_INITDIALOG 消息。該消息是在 MiniGUI 根據(jù)對(duì)話框模板建立對(duì)話框以及控件之后,發(fā)送到對(duì)話框回調(diào)函數(shù)的。 該消息的 lParam 參數(shù)包含了由DialogBoxIndirectParam 函數(shù)的第四個(gè)參數(shù)傳遞到對(duì)話框回調(diào)函數(shù)的值。用戶可以利用該值進(jìn)行對(duì)話框的初始化, 或者保存起來以備后用。,對(duì)話框回調(diào)函數(shù),static int InitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam) switch (message) /注意這個(gè)和主窗口創(chuàng)建的區(qū)別,這個(gè)是對(duì)話框特有的,在主窗口基礎(chǔ)上增添的。和CREATE一個(gè)時(shí)機(jī)發(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); ,對(duì)話框回調(diào)函數(shù),static void InitDialogBox (HWND hWnd) /制定對(duì)話框模版 DlgInitProgress.controls = CtrlInitProgress; DialogBoxIndirectParam ( ,對(duì)話框創(chuàng)建,提供和 Win32 完全兼容的消息框調(diào)用接口。 int MessageBox (HWND hwnd, LPCTSTR lpsztext, LPCSTR lpsztitle, UINT ustyle ); MessageBox (hDlg, “你好!“, “確認(rèn)“, MB_OK | MB_ICONINFORMATION);,消息框:,消息框:,基本控件,控件風(fēng)格 大小寫、密碼風(fēng)格、自動(dòng)換行、對(duì)齊方式等 控件消息 改變大小或位置、讀取寫入數(shù)據(jù)等 控件的通知消息 鼠標(biāo)、鍵盤、焦點(diǎn)等操作和變化,控件:要素,在 MiniGUI中,通過調(diào)用 CreateWindow 函數(shù)( CreateWindow 其實(shí)是CreateWindowEx 函數(shù)的宏),可以建立某個(gè)控件類的一個(gè)實(shí)例??丶惣瓤梢允穷A(yù)定義 MiniGUI 控件類,也可以是用戶自定義的控件類。 CreateWindow 函數(shù)建立一個(gè)子窗口,即控件。 在對(duì)話框中,用對(duì)話框模版來設(shè)定參數(shù),由對(duì)話框創(chuàng)建函數(shù)負(fù)責(zé)自動(dòng)創(chuàng)建。,創(chuàng)建控件,hwnd = CreateWindow ( CTRL_STATIC,/類名 “click me!”,/標(biāo)題名或者名稱 WS_VISIBLE | SS_CENTER | SS_NOTIFY, /風(fēng)格 ID_STATIC, /ID號(hào) 80, 100, 200, 20, /位置與寬度和長度 hDlg,/父句柄 0);/附屬數(shù)據(jù) 它指定了控件類(class_name)、控件標(biāo)題(caption)、控件風(fēng)格(style)、控件的標(biāo)識(shí)符(id)、以及窗口的初始位置和大小(x, y,w, h)。該函數(shù)同時(shí)指定子窗口的父窗口(parent)。參數(shù) add_data 用來向控件傳遞其特有數(shù)據(jù)的指針,該指針?biāo)赶虻臄?shù)據(jù)結(jié)構(gòu)隨控件類的不同而不同。,創(chuàng)建控件,控件具有自己的窗口風(fēng)格定義,需要在創(chuàng)建控件時(shí)指定需要的風(fēng)格,不同的風(fēng)格將使得控件具有不同的表象和行為。 獲取或設(shè)置控件的狀態(tài)、內(nèi)容等。一般可通過向控件發(fā)送一些通用或者特有的消息來完成。 控件內(nèi)部發(fā)生某種事件時(shí), 會(huì)通過通知消息通知其父窗口。通知消息一般通過MSG_COMMAND 消息發(fā)送,該消息的 wParam 參數(shù)由子窗口標(biāo)識(shí)符和通知碼組成,lParam 參數(shù)含有發(fā)出通知消息的控件句柄。也可以為控件設(shè)置一個(gè)通知消息的回調(diào)函數(shù),定義回調(diào)函數(shù)就不能發(fā)送通知消息。,控件編程涉及的內(nèi)容,控件常見風(fēng)格,控件內(nèi)部發(fā)生某種事件時(shí),會(huì)通過通知消息通知其父窗口。通知消息一般通過MSG_COMMAND 消息發(fā)送,該消息的 wParam 參數(shù)由子窗口標(biāo)識(shí)符和通知碼組成,lParam 參數(shù)含有發(fā)出通知消息的控件句柄。例如,當(dāng)用戶修改編輯框中的內(nèi)容時(shí),編輯框會(huì)向父窗口發(fā)出 EN_CHANGE 通知消息。 針對(duì)控件的通知消息處理引入了SetNotificationCallback 函數(shù),該函數(shù)可以為控件設(shè)置一個(gè)通知消息的回調(diào)函數(shù)。當(dāng)控件有通知消息時(shí),將調(diào)用該函數(shù),而不是發(fā)送通知消息到父窗口。新的應(yīng)用程序應(yīng)盡量使用這個(gè)函數(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)框控件的風(fēng)格設(shè)定為SS_SIMPLE、SS_LEFT、SS_CENTER、SS_RIGHT,以及SS_LEFTNOWORDWRAP 之一,將創(chuàng)建用來顯示文字的靜態(tài)框,其所顯示的內(nèi)容在CreateWindow 函數(shù)的 caption 參數(shù)中進(jìn)行指定,并且在以后可以用SetWindowText 來改變。 通過 SS_SIMPLE 風(fēng)格創(chuàng)建的控件只用來顯示單行文本,也就是說,控件文本不會(huì)自動(dòng)換行顯示,并且文本永遠(yuǎn)是左對(duì)齊的。 通過 SS_LEFT、SS_CENTER 或 SS_RIGHT 風(fēng)格創(chuàng)建的靜態(tài)框可用來顯示多行文本,并分別以左對(duì)齊、中對(duì)齊和右對(duì)齊方式顯示文本。,風(fēng)格:,hwnd = CreateWindow (CTRL_STATIC, /類名 “Double-click me!”, /內(nèi)容 WS_VISIBLE | SS_CENTER | SS_NOTIFY,/風(fēng)格,可見,居中,通知 ID_STATIC, /ID號(hào) 80, 100, 200, 20,/坐標(biāo)及大小 hDlg, /父窗口 0);,風(fēng)格:,當(dāng)靜態(tài)框風(fēng)格中包含 SS_NOTIFY 時(shí),靜態(tài)框會(huì)產(chǎn)生如下兩個(gè)通知消息: STN_DBLCLK:表示用戶在靜態(tài)框內(nèi)雙擊了鼠標(biāo)左鍵。 STN_CLICKED:表示用戶在靜態(tài)框內(nèi)單擊了鼠標(biāo)左鍵。,通知碼:,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;,通知碼:,基本控件按鈕,按鈕實(shí)例,基本控件按鈕,普通按鈕是一個(gè)矩形,其中顯示了通過 CreateWindow 傳遞的窗口標(biāo)題。該矩形占用了在CreateWindow 調(diào)用中給出的全部高度和寬度,而文字位于矩形的中心。,普通按鈕:,按鈕控件主要用來觸發(fā)一個(gè)立即回應(yīng)的動(dòng)作,并且不會(huì)長久保持開關(guān)信息。這種形態(tài)的按鈕控件有兩種窗口風(fēng)格, 分別叫做BS_PUSHBUTTON 和BS_DEFPUSHBUTTON。BS_DEFPUSHBUTTON 中的“DEF”代表“默認(rèn)”。 當(dāng)用來設(shè)計(jì)對(duì)話框時(shí),BS_PUSHBUTTON風(fēng)格和BS_DEFPUSHBUTTON 風(fēng)格的作用不同,具有 BS_DEFPUSHBUTTON 的按鈕將是默認(rèn)接收 ENTER 鍵輸入的按鈕,而不管當(dāng)前的輸入焦點(diǎn)處于哪個(gè)控件上。 但是當(dāng)用作普通主窗口的控件時(shí),兩種型態(tài)的按鈕作用相同,只是具有 BS_DEFPUSHBUTTON 風(fēng)格的按鈕的邊框要粗一些。 按鈕文本會(huì)以單行的形式在垂直和水平方向居中顯示,不會(huì)自動(dòng)換行。不過,應(yīng)用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 項(xiàng)目1城市軌道交通聯(lián)鎖系統(tǒng)基本認(rèn)知04課件
- T/BPC 0138-2019羅布麻茶
- T/BJWX 005-2024保密管理規(guī)范
- T/BIKE 3-2019共享自行車服務(wù)評(píng)價(jià)
- 基于農(nóng)村市場消費(fèi)升級(jí)的2025年零售渠道拓展研究報(bào)告
- 車工工藝與技能訓(xùn)練(第二版)課件:車單拐曲軸
- 社區(qū)健康教育理論與模式
- 2025年成人教育終身學(xué)習(xí)體系構(gòu)建與智能平臺(tái)運(yùn)營實(shí)踐探索報(bào)告
- 有毒植物健康教育
- 冷鏈物流行業(yè)冷鏈物流行業(yè)應(yīng)用場景2025年市場規(guī)模與技術(shù)革新研究報(bào)告
- 成人腦室外引流護(hù)理-中華護(hù)理學(xué)會(huì)團(tuán)體 標(biāo)準(zhǔn)
- 《管道用消氣過濾器》
- 2024年福建高考真題化學(xué)試題(解析版)
- 林俊杰專輯歌詞更新至-學(xué)不會(huì)
- 2024至2030年中國售電公司投資熱點(diǎn)研究報(bào)告
- 2024-2030年中國胸外科行業(yè)市場發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 天津二手房買賣合同范本大全(2024版)
- 六年級(jí)數(shù)學(xué)下冊(cè)期末試卷及答案【可打印】
- 數(shù)字圖像處理-第12章 圖像編碼
- JGJ100-2015 車庫建筑設(shè)計(jì)規(guī)范
- 娛樂場所安全管理?xiàng)l例
評(píng)論
0/150
提交評(píng)論