#include
#include
#include
#include
#include
static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam);
int MiniGUIMain(int argc,const char **argv)
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;//用于描述一个窗口的各项属性
//MiniGui-Processes模式下加入层
//#ifdef _MGRM_PROCESSES//JoinLayer 是 MiniGUI-Processes 模式的专有函数,因此包含在 _MGRM_PROCESSES 宏的条件编译中
//在 MiniGUI-Processes 运行模式下,每个 MiniGUI 客户端程序在调用其它 MiniGUI 函数之前
//必须调用该函数将自己添加到一个层中(或创建一个新层)
//JoinLayer(NAME_DEF_LAYER,"helloworld",0,0);
//#endif
//设置主窗口风格,这里把窗口设为初始可见的,并具有边框和标题栏
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
//设置主窗口的扩展风格,该窗口没有扩展风格。
CreateInfo.dwExStyle = WS_EX_NONE;
//设置窗口的标题为"HelloWorld"
CreateInfo.spCaption = "HelloWorld";
//设置窗口的主菜单,该窗口没有主菜单
CreateInfo.hMenu = 0;
//设置窗口的光标为系统缺省光标
CreateInfo.hCursor = GetSystemCursor (0);
//设置窗口的图标,该窗口没有图标
CreateInfo.hIcon = 0;
//设置主窗口的窗口过程函数为 HelloWinProc ,所有发往该窗口的消息由该函数处理
CreateInfo.MainWindowProc = HelloWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 800;
CreateInfo.by = 480;
CreateInfo.iBkColor = COLOR_lightwhite;//背景色为白色
CreateInfo.dwAddData = 0;//设置窗口没有附加数据
CreateInfo.hHosting = HWND_DESKTOP;//设置主窗口的托管窗口为桌面窗口。
//创建主窗口,返回值为所创建窗口的句柄
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
//把所创建的窗口显示出来,参数二指明窗口的显示方式(显示还是隐藏)
ShowWindow (hMainWnd, SW_SHOWNORMAL);//SW_SHOWNORMAL 说明要显示主窗口,并把它置为顶层窗口。
//进入消息循环
//在发生事件之后, MiniGUI 将事件转换为一个消息,并将消息放入目标程序的消息队列之中。
//应用程序现在的任务就是执行如下的消息循环代码,不断地从消息队列中取出消息,进行处理
while (GetMessage (&Msg, hMainWnd))
{
//函数把击键消息转换为 MSG_CHAR 消息,然后直接发送到窗口过程函数。
TranslateMessage (&Msg);
//把消息发往消息的目标窗口的窗口过程,让窗口过程进行处理。
DispatchMessage (&Msg);// 所做的工作就是获取消息的目标窗口的窗口过程,然后直接调用该窗口过程函数对消息进行处理。
}
//DetroyMainWindow 销毁一个主窗口,但不会销毁主窗口所使用的消息队列以及窗口对象本身。
//因此,应用程序要在线程或进程的最后使用 MainWindowCleaup
//最终清除主窗口所使用的消息队列以及窗口对象本身。
MainWindowThreadCleanup (hMainWnd);
return 0;
}
//窗口过程函数
//第一个参数hWnd是接收消息的窗口的句柄,它与CreateMainWindow 函数的返回值相同,该值标识了接收该消息的特定窗口。
//第二个参数与 MSG 结构中的 message 域相同,它是一个标识窗口所收到消息的整数值。
//最后两个参数都是 32 位的消息参数,它提供和消息相关的特定信息。
//程序通常不直接调用窗口过程函数,而是由 MiniGUI 进行调用;也就是说,它是一个回调函数。
static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message)
{
case MSG_PAINT:
//应用程序应首先通过调用 BeginPaint 函数来获得设备上下文句柄,
//并用它调用 GDI 函数来执行绘制操作。
hdc = BeginPaint (hWnd);
TextOut (hdc, 60, 60, "Hello world!");
//调用 EndPaint 函数释放设备上下文句柄。
EndPaint (hWnd, hdc);
return 0;
case MSG_CLOSE://用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个 MSG_CLOSE 消息
DestroyMainWindow (hWnd); //主窗口的销毁
PostQuitMessage (hWnd); //发送MSG_QUIT消息
return 0;
}
return DefaultMainWinProc (hWnd, message, wParam, lParam);
}