第一个helloworld.c实例

时间:2023-02-15 16:15:39
/*
*helloworld.c 的开始所包括的四个头文件<minigui/common.h>、<minigui/minigui.h>、
*<minigui/gdi.h> 和 <minigui/window.h> 是所有的MiniGUI 应用程序都必须包括的头文件:
*/
#include <stdio.h>
#include <minigui/common.h>//包括MiniGUI 常用的宏以及数据类型的定义。
#include <minigui/minigui.h>//包含了全局的和通用的接口函数以及某些杂项函数的定义。
#include <minigui/gdi.h>//包含了 MiniGUI 绘图函数的接口定义。
#include <minigui/window.h>//包含了窗口有关的宏、数据类型、数据结构定义以及函数接口声明。

//使用预定义控件的MiniGUI 应用程序还必须包括另外一个头文件— —<minigui/control.h>:
//control.h 包含了 libminigui 中所有内建控件的接口定义。

/*
*在helloworld.c 程序中,窗口过程是名为HelloWinProc 的函数。窗口过程函数可以由程序员任意命名,
*CreateMainWindow 函数根据MAINWINCREATE 结构类型的参数中指定的窗口过程创建主窗口。
*窗口过程的4 个参数与MSG 结构的前四个域是相同的。
*第一个参数hWnd 是接收消息的窗口的句柄,它与CreateMainWindow 函数的返回值相同,
*该值标识了接收该消息的特定窗口。
*第二个参数与MSG 结构中的message 域相同,它是一个标识窗口所收到消息的整数值。
*最后两个参数都是32 位的消息参数,它提供和消息相关的特定信息。
*/
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 程序的入口点为MiniGUIMain
*参数argc 和argv 与C 程序main
*函数的参数argc 和argv 的含义是一样的,分别为命令行参数个数和参数字符串数组指针。
*/
int MiniGUIMain (int argc, const char* argv[])
{
MSG Msg;//消息数据结构体文章末尾给出
HWND hMainWnd;//窗口句柄
MAINWINCREATE CreateInfo;//窗口结构体,绘图等用到

#ifdef _MGRM_PROCESSES//JoinLayer 是MiniGUI-Processes 模式的专有函数,因此包含在 _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0);//的条件编译中。在 MiniGUI-Processes 运行模式下,每个MiniGUI 客户端程序在调用其它
#endif//MiniGUI 函数之前必须调用该函数将自己添加到一个层中(或创建一个新层)

/*
如果程序是 MiniGUI-Processes 服务器端,你应该改为调用 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;//设置主窗口风格,这里把窗口设为初始可见的,并具有边框和标题栏。
CreateInfo.dwExStyle = WS_EX_NONE;//设置主窗口的扩展风格,该窗口没有扩展风格
CreateInfo.spCaption = "HelloWorld";//设置主窗口的标题为“HelloWorld”。
CreateInfo.hMenu = 0;//设置主窗口的主菜单,该窗口没有主菜单
CreateInfo.hCursor = GetSystemCursor(0);//设置主窗口的光标为系统缺省光标。
CreateInfo.hIcon = 0;//设置主窗口的图标,该窗口没有图标。
CreateInfo.MainWindowProc = HelloWinProc;//设置主窗口的窗口过程函数为HelloWinProc,所有发往该窗口的消息由该函数处理。

/*设置主窗口在屏幕上的位置,该窗口左上角位于(0, 0),右下角位于(320, 240)。*/
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 240;
CreateInfo.by = 180;

CreateInfo.iBkColor = COLOR_lightwhite;//设置主窗口的背景色为白色,PIXEL_lightwhite 是MiniGUI 预定义的象素值。
CreateInfo.dwAddData = 0;//设置主窗口的附加数据,该窗口没有附加数据。
CreateInfo.hHosting = HWND_DESKTOP;//设置主窗口的托管窗口为桌面窗口
hMainWnd = CreateMainWindow (&CreateInfo);//创建和显示主窗口
if (hMainWnd == HWND_INVALID)//判读窗口句柄是否为有效的句柄
return -1;

/*ShowWindow的第一个参数为所要显示的窗口句柄,第二个参数指明显示窗口的方式(显示还是隐藏)SW_SHOWNORMAL说明要显示主窗口,并把它置为顶层窗口。
调用ShowWindow 函数才能把所创建的窗口显示在屏幕上。*/
ShowWindow(hMainWnd, SW_SHOWNORMAL);

while (GetMessage(&Msg, hMainWnd)) {//在调用ShowWindow 函数之后,主窗口就会显示在屏幕上。和其它GUI 一样,现在是
TranslateMessage(&Msg);//进入消息循环的时候了。MiniGUI 为每一个MiniGUI 程序维护一个消息队列。在发生事件之
DispatchMessage(&Msg);//后,MiniGUI 将事件转换为一个消息,并将消息放入目标程序的消息队列之中。应用程序现
}//在的任务就是执行如下的消息循环代码,不断地从消息队列中取出消息,进行处理:
/*
1.Msg 变量是类型为MSG 的结构,MSG 结构在window.h 中定义如下:
typedef struct _MSG
{
HWND hwnd;
int message;
WPARAM wParam;
LPARAM lParam;
unsigned int time;
#ifndef _LITE_VERSION
void* pAdd;
#endif
} MSG;
typedef MSG* PMSG;

2.GetMessage 函数调用从应用程序的消息队列中取出一个消息:
GetMessage( &Msg, hMainWnd);
该函数调用的第二个参数为要获取消息的主窗口的句柄,第一个参数为一个指向MSG
结构的指针,GetMessage 函数将用从消息队列中取出的消息来填充该消息结构的各个域

3.只要从消息队列中取出的消息不为MSG_QUIT,GetMessage 就返回一个非0 值,消息
循环将持续下去。MSG_QUIT 消息使GetMessage 返回0,导致消息循环的终止。
TranslateMessage (&Msg);

4.TranslateMessage 函数把击键消息转换为MSG_CHAR 消息,然后直接发送到窗口过程函数。
DispatchMessage (&Msg);
DispatchMessage 函数最终将把消息发往该消息的目标窗口的窗口过程,让它进行处理,
*/

/*程序退出
用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个MSG_CLOSE 消息。
helloworld 程序在收到MSG_CLOSE 消息时调用DestroyMainWindow 函数销毁主窗口,并
调用PostQuitMessage 函数在消息队列中投入一个MSG_QUIT 消息。当GetMessage 函数
取出MSG_QUIT 消息时将返回0,最终导致程序退出消息循环。
程序最后调用MainWindowThreadCleanup 清除主窗口所使用的消息队列等系统资源并
最终由MiniGUIMain 返回。
*/
MainWindowThreadCleanup (hMainWnd);
return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif