本範例版權為Feynman Software.所有


本文只增加其說明


1.Hello World




#include


#include


#include


#include


#include




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);


return 0;


}




return DefaultMainWinProc(hWnd, message, wParam, lParam);


}




/*


一個 C 程式的進入點點為 main 函數,而一個 MiniGUI 程式的進入點點為 MiniGUIMain,該函數原型如下:


int MiniGUIMain (int argc, const char* argv[])




main 函數已經在 MiniGUI 的函數程式庫中定義了,該函數在進行一些 MiniGUI 的起始化工作之后呼叫 MiniGUIMain 函數。


所以,每個 MiniGUI 應用程式(無論是伺服器端程式 mginit 還是用戶端應用程式)的進入點點均為 MiniGUIMain 函數。


參數 argc argv C 程式 main 函數的參數 argc argv 的含義是一樣的,分別為指令行參數個數和參數字串陣列指標。


*/


int MiniGUIMain (int argc, const char* argv[])


{


MSG Msg;


HWND hMainWnd;


MAINWINCREATE CreateInfo;




#ifdef _LITE_VERSION


SetDesktopRect(0, 0, 1024, 768);


/*


SetDesktopRect 是一個巨集,定義在標頭檔案 minigui.h 中,如下:


#define SetDesktopRect(lx, ty, rx, by) \


JoinLayer ("", "", lx, ty, rx, by)


所以,你也可以用 JoinLayer 函數來代替 SetDesktopRect,來設定程式的上管理系統察看區域。


*/


#endif




////設定主視窗


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;
//
設定主視窗的視窗過程函數為 HelloWinProc,所有發往該視窗的訊息由該函數處理。


CreateInfo.lx = 0;
//
設定主視窗在螢幕上的位置,該視窗左上角位于(0, 0),右下角位于(320, 240)


CreateInfo.ty = 0;


CreateInfo.rx = 320;


CreateInfo.by = 240;


CreateInfo.iBkColor = COLOR_lightwhite;
//
設定主視窗的背景色為白色,PIXEL_lightwhite MiniGUI 預定義的像素值


CreateInfo.dwAddData = 0;
//
設定主視窗的附加資料,該視窗沒有附加資料。


CreateInfo.hHosting = HWND_DESKTOP;
//
設定主視窗的托管視窗為上管理系統視窗。



hMainWnd = CreateMainWindow (&CreateInfo);


/*


每個MiniGUI 應用程序的初始介面一般都是一個主視窗,你可以通過呼叫CreateMainWindow 函數來建立一個主視窗,


其參數是一個指向 MAINWINCREATE 架構的指標,本例中就是 CreateInfo,傳回值為所建立主視窗的控點。


MAINWINCREATE 架構說明一個主視窗的屬性,你在使用 CreateInfo 建立主視窗之前,需要設定它的各項屬性。


*/




if (hMainWnd == HWND_INVALID)


return -1;




ShowWindow(hMainWnd, SW_SHOWNORMAL);
//
建立完主視窗之后,還需要呼叫 ShowWindow 函數才能把所建立的視窗察看在螢幕上。 //ShowWindow 第一個參數為所要察看的視窗控點,第二個參數指明察看視窗的方式(察看 //還是隱藏),SW_SHOWNORMAL 說明要察看主視窗,并把它置為頂層視窗。



/*


1.在呼叫 ShowWindow 函數之后,主視窗就會顯示在螢幕上。和其他 GUI 一樣,現在是


進入訊息迴圈的時候了。MiniGUI 為每一個 MiniGUI 程式維護一個訊息佇列。在發生事件


之后,MiniGUI 將事件轉換為一個訊息,并將訊息擺入目的程式的訊息佇列之中。應用程式


現在的工作就是執行如下的訊息迴圈程式碼,不斷地從訊息佇列中取出訊息,進行處理




2.程式的結束


用戶按一下視窗右上角的關閉按鈕時視窗過程函數將收到一個MSG_CLOSE 訊息。


helloworld 程式在收到 MSG_CLOSE 訊息時呼叫 DestroyMainWindow 函數銷毀主視窗,并


呼叫 PostQuitMessage 函數在訊息佇列中投入一個 MSG_QUIT 訊息。當 GetMessage 函數取


MSG_QUIT 訊息時將傳回 0,最終導致程式結束訊息迴圈




3.Msg 變數是類別為 MSG 的架構,MSG 架構在 window.h 中定義如下:


typedef struct _MSG


{


HWND hwnd; //訊息發往的視窗的控點。在 helloworld.c 程式中,該值與 hMainWnd 相同。


int message;//訊息旗標。這是一個用于識別訊息的整數值。每一個訊息均有一個對應的預定義旗標,這些旗標定義在 window.h 標頭檔案中,以前置 MSG 開頭。


WPARAM wParam; //一個 32 位的訊息參數,其含義和值根據訊息的不同而不同。


LPARAM lParam; //一個 32 位的訊息參數,其含義和值取決于訊息的類別。


#ifdef _LITE_VERSION


unsigned int time; //訊息擺入訊息佇列中的時間。


#else


struct timeval time;


void* pAdd;


#endif


} MSG;


typedef MSG* PMSG;


*/


while (GetMessage(&Msg, hMainWnd)) {
//GetMessage
該函數呼叫的第二個參數為要抓取訊息的主視窗的控點,第一個參數為一個指向 MSG架構的指標


TranslateMessage(&Msg);


DispatchMessage(&Msg);


}






MainWindowThreadCleanup (hMainWnd);
//
清除主視窗所使用的訊息佇列等系統資源并最終由 MiniGUIMain 傳回




return 0;


}




#ifndef _LITE_VERSION


#include


#endif

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()