Helloworld.c的开始包括的四个头文件 Common.h 包括MINIGUI常用的宏以及数据类型的定义; Minigui.h 包括了全局的和通用的接口函数以及某些杂项函数的定义; Gdi.h 包含了MINIGUI绘图函数的接口定义; Window.h 包含了窗口有关的宏、数据类型、数据结构定义以及函数接口声明。 使用预定义控件的MINIGUI应用程序还必须包括另外一个头文件--- Control.h 包含了linminigui 中所有内建控件接口定义。 所以,一个MINIGUI 程序的开始通常包括如下的MINIGUI相关头文件: #include #include #include #include #include 1.2程序入口点 一个C程序的入口点为main函数,而一个MINIGUI程序的入口点为MINIGUIMAIN,该函数原型如下: int MiniGUIMain (int argc, const char* argv[]) 1.3设置显示区域 #ifdef _LITE_VERSION SetDesktopRect(0,0,800,600); #endif 其中SetDesktopRect是一个宏,定义在头文件minigui.h中,如下: #define SetDesktopRect (lx, ly ,rx, by)\\ JoinLayer(“”,””,lx, ty, rx, by) void GUIAPI GetDesktopRect (int* lx, int* ty, int* rx, int* by); 所以,你也可以用JoinLayer 函数来代替SetDesktopRect,来设置程序的桌面显示区域。 1.4创建和显示主窗口 hMainWnd = CreateMainWindow (&CreateInfo); 在使用CreateInfo创建主窗口之前,需要设置它的各项属性。 CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; 设置主窗口风格,这里把窗口设为初始可见的,并具有边框和标题栏。 CreateInfo.dwExStyle = WS_EX_NONE; 设置主窗口的扩展风格,该窗口没有扩展风格。 CreateInfo.spCaption = "Hello, world"; 设置主窗口的标题为"Hello, world" CreateInfo.hMenu = 0; 设置主窗口的主菜单,该窗口没有主菜单。 CreateInfo.hCursor = GetSystemCursor(0); 设置主窗口的光标为系统缺省光标。 CreateInfo.hIcon = 0; 设置主窗口的图标,改窗口没有图标。 CreateInfo.MainWindowProc = HelloWinProc; 设置主窗口过程函数为HelloWinProc,所有发往该窗口的消息由该函数处理。 CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = 320; CreateInfo.by = 240; 设置主窗口在屏幕上的位置,该窗口左上角位于(0,0),右下角位于(320,240)。 CreateInfo.iBkColor = COLOR_lightwhite; 设置主窗口的背景色为白色,COLOR_lightwhite是MINIGUI预定义的像素值。 CreateInfo.dwAddData = 0; 设置主窗口的附加数据,该窗口没有附加数据。 CreateInfo.hHosting = HWND_DESKTOP; 设置主窗口的托管窗口为桌面窗口。 ShowWindow(hMainWnd, SW_SHOWNORMAL); 显示所创建的窗口,第一个参数为 所要显示的窗口句柄,第二个参数指明显示窗口的方式(显示还是隐藏),SW_SHOWNORMAL说明要显示主窗口,并把它置为顶层窗口。 1.5进入消息循环 调用显示窗口函数后,应用程序现在的任务就是执行如下的消息循环代码,不断地从消息队列中取出消息,进行处理: while (GetMessage(&Msg, hMainWnd)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } Msg变量是类型为MSG的结构,MSG结构在window.h中定义如下: typedef struct _MSG { /** the handle to the window which receives this message. */ HWND hwnd; /** the message identifier. */ int message; /** The first parameter of the message (32-bit integer). */ WPARAM wParam; /** The second parameter of the message (32-bit integer). */ LPARAM lParam; #ifdef _LITE_VERSION unsigned int time; #else struct timeval time; void* pAdd; #endif } MSG; GetMessage函数调用从应用程序的消息队列中取出一个消息: GetMessage(&Msg, hMainWnd) 该函数调用的第二个参数为要获取消息的主窗口的句柄,第一个参数为一个指向MSG结构的指针,GetMessage函数将用从消息队列中取出的消息来填充该消息结构的各个域,包括: Hwnd消息发往的窗口的句柄。在helloworld.c程序中,该值与hMainWnd相同。 Message消息标识符。这是一个用于标识消息的整数值。每一个消息均有一个对应的预定义标识符,这些标识符定义在window.h头文件中,以前缀MSG开头。 wParam 一个32位的消息参数,其含义和值根据消息的不同而不同。 lParam 一个32位的消息参数,其含义和值取决于消息的类型。 Time 消息放入消息队列中的时间。 只要从消息队列中取出的消息不为MSG_QUIT,GetMessage就返回一个非0值,消息循环将持续下去。MSG_QUIT消息使GetMessage返回0,导致消息循环的终止。 TranslateMessage(&Msg); TranslateMessage函数把击键消息转换为MSG_CHAR消息,然后直接发送到窗口过程函数。 DispatchMessage(&Msg); DispatchMessage函数最终将把消息发往该消息的目标窗口的窗口过程,让它进行处理,在本例中,该窗口过程就是HelloWinproc。也就是说,MiniGUI在 DispatchMessage函数中调用主窗口的窗口过程函数(回调函数)对发往该主窗口的消息进行处理。处理完消息之后,应用程序的窗口过程函数将返回到 DispatchMessage函数中,而 DispatchMessage函数最后又将返回到应用程序代码中,应用程序又从下一个 DispatchMessage函数调用开始消息循环。 1.6窗口过程函数 窗口过程函数是MINIGUI程序的主体部分,应用程序实际所作的工作大部分都发生在窗口过程函数中。 在helloworld.c程序中,窗口过程是名为HelloWinProc的函数。窗口过程函数可以根据程序员任意命 名,CreateMainWindow函数根据MAINWINCREATE结构类型的参数中指定的窗口过程创建主窗口。 窗口过程函数总是定义为如下形式: static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) 窗口过程的4个参数与MSG结构的前四个域是相同的。第一个参数hWnd是接收消息的窗口的句柄,它与CreateMainWindow函数的返回值相同,该值标识了接收该信息的特定窗口。第二个参数与MSG结构中的message域相同,它是一个标识窗口所收到消息的整数值,最后两个参数都是32位的消息参数,它提供和消息相关的特定信息。 窗口过程函数不予处理的消息应该传给DefaultMainWinProc函数进行缺省处理,从DefaultMainWinProc返回的值必须由窗口过程返回。 1.7屏幕输出 程序在响应MSG_PAINT消息时进行屏幕输出。应用程序应首先通过调用BeginPaint函数来获得设备上下文句柄,并用它调用GDI函数来执行绘制操作。这里,程序使用TextOut文本输出函数在客户区的中部显示了一个Hello, world!字符串。绘制结束后,应用程序应调用EndPaint函数释放设备上下文句柄。 1.8程序的提出 用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个MSG_CLOSE消息,helloworld程序在收到MSG_CLOSE消息时调用DestroyMainWindow函数销毁主窗口,并调用PostQuitMessage函数在消息队列投入一个MSG_QUIT消息,当GetMessage函数取出MSG_QUIT消息时将返回0,最终导致程序退出消息循环。 程序最后调用 MainWindowThreadCleanup清楚主窗口所使用的消息队列等系统资源并最终由MiniGUIMain返回。