本範例版權為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
留言列表