MiniGUI编程之Helloworld(一)
MiniGUI由飛漫公司于1998年為嵌入式平臺開發的基于framebuffer圖像庫,至今以發展的非常完善!目前大致可以分為三種模式:
1.MiniGui-Threads,運行在MiniGui-Threads的程序可以再不同的線程中建立多個窗口,但是所有的窗口在一個進程或者地址空間中運行。
適用范圍:uC/OS-ll,eCos,VxWorks,pSOS等無內存單元cpu的系統(Linux和uClinux上也可)
?2.MiniGui-Standalone,可以以獨立進程的方式運行,不需要多線程和多進程的支持。
?適用范圍:功能單一的應用場合,如uClinux的嵌入式產品
?3.MiniGui-Processes,和MiniGui-Threads相反,每個進程是獨立的進程,每個進程可以有多個窗口。
然后其中MiniGui-Processes模式應用頗為廣泛!
MiniGui是基于消息驅動的圖像化編程,比如一個創建一個主窗口,那么MiniGui會為這個進程創建一個消息隊列,當一個事件被觸發以后會被轉化成消息發送到這個消息隊列當中,然后執行響應的過程函數進行處理。下面一個個經典的HelloWorld例子來講解!
好了看完代碼來分析一下,做個win32圖像編程的很容易上手!
大概步驟:
1.首先是定義窗口對象CreateInfo;
2.初始化工作,設置CreateInfo的一些屬性和對應的過程函數等;
3.創建主窗口CreateMainWindow(&CreateInfo);
4.顯示窗口ShowWindow(hMainWnd,?SW_SHOWNORMAL);
5.消息輪詢,從消息隊列中獲取消息以及消息響應;
編譯選項:gcc?-o?hello?helloworld.c?-lminigui?-ljpeg?-lpng?-lz?(如果為Thread模式加上?-lpthread)
********代碼********
#include <stdio.h> #include <minigui/common.h> #include <minigui/minigui.h> #include <minigui/gdi.h> #include <minigui/window.h> //#include<minigui/control.h> /*窗口消息處理*/ static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) {HDC hdc;//窗口句柄switch (message) //接受到的消息在這里處理{case MSG_PAINT:hdc = BeginPaint(hWnd);//繪制窗口TextOut(hdc, 60, 60, "Hello world!");//顯示輸出EndPaint(hWnd, hdc);//結束繪圖return 0;case MSG_CLOSE:DestroyMainWindow(hWnd);//銷毀窗口對象PostQuitMessage(hWnd);//退出消息循環return 0;}/*當接收到的消息沒有對應的處理過程,則交個下面函數處理*/return DefaultMainWinProc(hWnd, message, wParam, lParam); }int MiniGUIMain(int argc, const char* argv[]) {MSG Msg;//消息數據結構體文章末尾給出HWND hMainWnd;//窗口句柄MAINWINCREATE CreateInfo;//窗口結構體,繪圖等用到 #ifdef _MGRM_PROCESSESJoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0);//MiniGui-Processes模式下用到 #endif/*風格設置*/CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;/*設置主窗口風格,此處設置為可見*/CreateInfo.dwExStyle = WS_EX_NONE;/*設置主窗口標題*/CreateInfo.spCaption = "HelloWorld";/*設置主窗口菜單*/CreateInfo.hMenu = 0;/*設置主窗口光標系統為系統默認光標*/CreateInfo.hCursor = GetSystemCursor(0);/*設置主窗口圖標*/CreateInfo.hIcon = 0;/*設置主窗口函數,所有發往該窗口的消息有該函數處理*/CreateInfo.MainWindowProc = HelloWinProc;/*設置主窗口位置: 左上角(0,0)*/CreateInfo.lx = 0;CreateInfo.ty = 0;/*設置主窗口位置: 右下角(320,240)*/CreateInfo.rx = 240;CreateInfo.by = 320;/*設置主窗口背景顏色*/CreateInfo.iBkColor = COLOR_lightwhite;/*設置主窗口附加數據*/CreateInfo.dwAddData = 0;/*設置主窗口的托管窗口為桌面*/CreateInfo.hHosting = HWND_DESKTOP;/*創建主窗口*/hMainWnd = CreateMainWindow(&CreateInfo);if (hMainWnd == HWND_INVALID)return -1;/*顯示主窗口*/ShowWindow(hMainWnd, SW_SHOWNORMAL);/*消息循環*/while (GetMessage(&Msg, hMainWnd))//GetMessage函數文章末尾分析{/*把擊鍵消息轉換成MSG_CHAR消息,然后直接發送窗口過程函數*/TranslateMessage(&Msg);/*調用消息處理窗口過程函數(回調函數),處理完返回函數此函數*/DispatchMessage(&Msg);}/*清理工作*/MainWindowThreadCleanup(hMainWnd);return 0; }#ifndef _MGRM_PROCESSES #include <minigui/dti.c> #endif*********************************
GetMessage(&Msg,hMainWnd)函數從應用程序中取出消息
Msg:消息結構體(用獲取的消息填充)
hMainWnd:要獲取消息的主窗口句柄
GetMessage返回值分析:
?0:獲得的消息為MSG-QUIT,將導致消息循環終止,其他返回非0
消息結構體原型:
typedf struct _MSG {HWND hwnd;//消息發往的窗口句柄int message;//消息標示符,每個消息對應一個整數,在window.h頭文件中有預定義WPARAM wParam;//一個32位的消息參數,其含義跟消息不同而不同LPARAM lParam;//一個32的消息參數,其含義取決于消息的類型 unsigned int time;//消息放入消息隊列的時間 #ifndef LITE VERSIONvoid * pAdd; #endif }MSG,*PMSG;總結
以上是生活随笔為你收集整理的MiniGUI编程之Helloworld(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CreateMainWindow 创建主
- 下一篇: Minigui及lgui使用全解释