第一个helloworld.c实例
生活随笔
收集整理的這篇文章主要介紹了
第一个helloworld.c实例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/** helloworld.c 的開始所包括的四個(gè)頭文件<minigui/common.h>、<minigui/minigui.h>、* <minigui/gdi.h> 和 <minigui/window.h> 是所有的MiniGUI 應(yīng)用程序都必須包括的頭文件:*/
#include <stdio.h>
#include <minigui/common.h> //包括MiniGUI 常用的宏以及數(shù)據(jù)類型的定義。
#include <minigui/minigui.h> //包含了全局的和通用的接口函數(shù)以及某些雜項(xiàng)函數(shù)的定義。
#include <minigui/gdi.h> //包含了 MiniGUI 繪圖函數(shù)的接口定義。
#include <minigui/window.h> //包含了窗口有關(guān)的宏、數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)定義以及函數(shù)接口聲明。//使用預(yù)定義控件的MiniGUI 應(yīng)用程序還必須包括另外一個(gè)頭文件— —<minigui/control.h>:
//control.h 包含了 libminigui 中所有內(nèi)建控件的接口定義。/**在helloworld.c 程序中,窗口過程是名為HelloWinProc 的函數(shù)。窗口過程函數(shù)可以由程序員任意命名,*CreateMainWindow 函數(shù)根據(jù)MAINWINCREATE 結(jié)構(gòu)類型的參數(shù)中指定的窗口過程創(chuàng)建主窗口。*窗口過程的4 個(gè)參數(shù)與MSG 結(jié)構(gòu)的前四個(gè)域是相同的。*第一個(gè)參數(shù)hWnd 是接收消息的窗口的句柄,它與CreateMainWindow 函數(shù)的返回值相同,*該值標(biāo)識(shí)了接收該消息的特定窗口。*第二個(gè)參數(shù)與MSG 結(jié)構(gòu)中的message 域相同,它是一個(gè)標(biāo)識(shí)窗口所收到消息的整數(shù)值。*最后兩個(gè)參數(shù)都是32 位的消息參數(shù),它提供和消息相關(guān)的特定信息。*/
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);
}/* MiniGUI 程序的入口點(diǎn)為MiniGUIMain* 參數(shù)argc 和argv 與C 程序main* 函數(shù)的參數(shù)argc 和argv 的含義是一樣的,分別為命令行參數(shù)個(gè)數(shù)和參數(shù)字符串?dāng)?shù)組指針。*/
int MiniGUIMain (int argc, const char* argv[])
{MSG Msg; //消息數(shù)據(jù)結(jié)構(gòu)體文章末尾給出 HWND hMainWnd; //窗口句柄 MAINWINCREATE CreateInfo; //窗口結(jié)構(gòu)體,繪圖等用到 #ifdef _MGRM_PROCESSES //JoinLayer 是MiniGUI-Processes 模式的專有函數(shù),因此包含在 _MGRM_PROCESSESJoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0); //的條件編譯中。在 MiniGUI-Processes 運(yùn)行模式下,每個(gè)MiniGUI 客戶端程序在調(diào)用其它#endif //MiniGUI 函數(shù)之前必須調(diào)用該函數(shù)將自己添加到一個(gè)層中(或創(chuàng)建一個(gè)新層)/*如果程序是 MiniGUI-Processes 服務(wù)器端,你應(yīng)該改為調(diào)用 ServerStartup:if (!ServerStartup (0 , 0 , 0)) {fprintf (stderr,"Can not start the server of MiniGUI-Processes: mginit.\n");return 1;}*/CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; //設(shè)置主窗口風(fēng)格,這里把窗口設(shè)為初始可見的,并具有邊框和標(biāo)題欄。CreateInfo.dwExStyle = WS_EX_NONE; //設(shè)置主窗口的擴(kuò)展風(fēng)格,該窗口沒有擴(kuò)展風(fēng)格CreateInfo.spCaption = "HelloWorld"; //設(shè)置主窗口的標(biāo)題為“HelloWorld”。CreateInfo.hMenu = 0; //設(shè)置主窗口的主菜單,該窗口沒有主菜單CreateInfo.hCursor = GetSystemCursor(0); //設(shè)置主窗口的光標(biāo)為系統(tǒng)缺省光標(biāo)。CreateInfo.hIcon = 0; //設(shè)置主窗口的圖標(biāo),該窗口沒有圖標(biāo)。CreateInfo.MainWindowProc = HelloWinProc; //設(shè)置主窗口的窗口過程函數(shù)為HelloWinProc,所有發(fā)往該窗口的消息由該函數(shù)處理。/*設(shè)置主窗口在屏幕上的位置,該窗口左上角位于(0, 0),右下角位于(320, 240)。*/CreateInfo.lx = 0;CreateInfo.ty = 0;CreateInfo.rx = 240;CreateInfo.by = 180;CreateInfo.iBkColor = COLOR_lightwhite; //設(shè)置主窗口的背景色為白色,PIXEL_lightwhite 是MiniGUI 預(yù)定義的象素值。CreateInfo.dwAddData = 0; //設(shè)置主窗口的附加數(shù)據(jù),該窗口沒有附加數(shù)據(jù)。CreateInfo.hHosting = HWND_DESKTOP; //設(shè)置主窗口的托管窗口為桌面窗口hMainWnd = CreateMainWindow (&CreateInfo); //創(chuàng)建和顯示主窗口if (hMainWnd == HWND_INVALID) //判讀窗口句柄是否為有效的句柄return -1;/*ShowWindow的第一個(gè)參數(shù)為所要顯示的窗口句柄,第二個(gè)參數(shù)指明顯示窗口的方式(顯示還是隱藏)SW_SHOWNORMAL說明要顯示主窗口,并把它置為頂層窗口。調(diào)用ShowWindow 函數(shù)才能把所創(chuàng)建的窗口顯示在屏幕上。*/ShowWindow(hMainWnd, SW_SHOWNORMAL); while (GetMessage(&Msg, hMainWnd)) { //在調(diào)用ShowWindow 函數(shù)之后,主窗口就會(huì)顯示在屏幕上。和其它GUI 一樣,現(xiàn)在是TranslateMessage(&Msg); //進(jìn)入消息循環(huán)的時(shí)候了。MiniGUI 為每一個(gè)MiniGUI 程序維護(hù)一個(gè)消息隊(duì)列。在發(fā)生事件之DispatchMessage(&Msg); //后,MiniGUI 將事件轉(zhuǎn)換為一個(gè)消息,并將消息放入目標(biāo)程序的消息隊(duì)列之中。應(yīng)用程序現(xiàn)} //在的任務(wù)就是執(zhí)行如下的消息循環(huán)代碼,不斷地從消息隊(duì)列中取出消息,進(jìn)行處理:/*1.Msg 變量是類型為MSG 的結(jié)構(gòu),MSG 結(jié)構(gòu)在window.h 中定義如下:typedef struct _MSG{HWND hwnd;int message;WPARAM wParam;LPARAM lParam;unsigned int time;#ifndef _LITE_VERSIONvoid* pAdd;#endif} MSG;typedef MSG* PMSG;2.GetMessage 函數(shù)調(diào)用從應(yīng)用程序的消息隊(duì)列中取出一個(gè)消息:GetMessage( &Msg, hMainWnd);該函數(shù)調(diào)用的第二個(gè)參數(shù)為要獲取消息的主窗口的句柄,第一個(gè)參數(shù)為一個(gè)指向MSG結(jié)構(gòu)的指針,GetMessage 函數(shù)將用從消息隊(duì)列中取出的消息來填充該消息結(jié)構(gòu)的各個(gè)域3.只要從消息隊(duì)列中取出的消息不為MSG_QUIT,GetMessage 就返回一個(gè)非0 值,消息循環(huán)將持續(xù)下去。MSG_QUIT 消息使GetMessage 返回0,導(dǎo)致消息循環(huán)的終止。TranslateMessage (&Msg);4.TranslateMessage 函數(shù)把擊鍵消息轉(zhuǎn)換為MSG_CHAR 消息,然后直接發(fā)送到窗口過程函數(shù)。DispatchMessage (&Msg);DispatchMessage 函數(shù)最終將把消息發(fā)往該消息的目標(biāo)窗口的窗口過程,讓它進(jìn)行處理,*//*程序退出用戶單擊窗口右上角的關(guān)閉按鈕時(shí)窗口過程函數(shù)將收到一個(gè)MSG_CLOSE 消息。helloworld 程序在收到MSG_CLOSE 消息時(shí)調(diào)用DestroyMainWindow 函數(shù)銷毀主窗口,并調(diào)用PostQuitMessage 函數(shù)在消息隊(duì)列中投入一個(gè)MSG_QUIT 消息。當(dāng)GetMessage 函數(shù)取出MSG_QUIT 消息時(shí)將返回0,最終導(dǎo)致程序退出消息循環(huán)。程序最后調(diào)用MainWindowThreadCleanup 清除主窗口所使用的消息隊(duì)列等系統(tǒng)資源并最終由MiniGUIMain 返回。*/MainWindowThreadCleanup (hMainWnd);return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif
總結(jié)
以上是生活随笔為你收集整理的第一个helloworld.c实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译MiniGUI 程序
- 下一篇: CreateMainWindow 创建主