holleword program of minigui_应用程序helloword

 

一、头文件

所有的 MiniGUI 应用程序都必须包括的头文件:

• common.h 包括 MiniGUI 常用的以及数据类型的定义。

• minigui.h 包含了全局的和通用的接口函数以及某些杂项函数的定义。

• gdi.h 包含了 MiniGUI 绘图函数的接口定义。

• window.h 包含了窗口有关的宏、数据类型、数据结构定义以及函数接口声明。

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

二、创建和显示主窗口

hMainWnd = CreateMainWindow (&CreateInfo);

每个 MiniGUI 应用程序的初始界面一般都是一个主窗口,你可以通过调用 CreateMainWindow 函数来创建一个主窗口,其参 数是一个指向 MAINWINCREATE 结构的指针,本例中就是 CreateInfo,返回值为所创建主窗口的句柄。MAINWINCREATE 结构 描述一个主窗口的属性,在使用 CreateInfo 创建主窗口之前,需要设置它的各项属性。

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 ,所有发往该窗口的消息由该函数处理。

CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = 320; CreateInfo.by = 240;

设置主窗口在屏幕上的位置,该窗口左上角位于(0, 0),右下角位于(320, 240)。

CreateInfo.iBkColor = PIXEL_lightwhite;

设置主窗口的背景色为白色;PIXEL_lightwhite 是 MiniGUI 预定义的象素值(白色)。 CreateInfo.dwAddData = 0;

设置主窗口的附加数据,该窗口没有附加数据。

CreateInfo.hHosting = HWND_DESKTOP;

设置主窗口的托管窗口为桌面窗口。

ShowWindow(hMainWnd, SW_SHOWNORMAL);

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

 

 

三、进入消息循环

在调用 ShowWindow 函数之后,主窗口就会显示在屏幕上。和其它 GUI 一样,现在是进入消息循环的时候了。MiniGUI 为每 一个 MiniGUI 程序维护一个消息队列。在发生事件之后,MiniGUI 将事件转换为一个消息,并将消息放入目标程序的消息队 列之中。应用程序现在的任务就是执行如下的消息循环代码,不断地从消息队列中取出消息,进行处理:

while (GetMessage(&Msg, hMainWnd)) {

  TranslateMessage(&Msg);

  DispatchMessage(&Msg);

}

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;

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 函 数 最后又将返回到应用程序代码中,应用程序又从下一个 GetMessage 函数调用开始消息循环。

 

四、窗口过程函数

  窗口过程函数是 MiniGUI 程序的主体部分,应用程序实际所做的工作大部分都发生在窗口过程函数中,因为 GUI 程序的主要 任务就是接收和处理窗口收到的各种消息。 在 helloworld.c 程序中,窗口过程是名为 HelloWinProc 的函数。窗口过程函数可以由程序员任意命名,CreateMainWindow 函 数根据 MAINWINCREATE 结构类型的参数中指定的 窗口过程创建主窗口。 窗口过程函数总是定义为如下形式:

static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam);

窗口过程的 4 个参数与 MSG 结构的前四个域是相同的。第一个参数 hWnd 是接收消息的窗口的句柄,它 与 CreateMainWindow 函数的返回值相同,该值标识了接收该消息的特定 窗口。第二个参数与 MSG 结构中的 message 域 相同,它是一个标识窗口所收到消息的整数值。最后两个参数都是 32 位的消息参数,它提供和消息相关的特定信息。程序 通常不直接调用窗口过程函数,而是由 MiniGUI 进行调用;也就是说,它是一个回调函数。 窗口过程函数不予处理的消息应该传给 DefaultMainWinProc 函数进行缺省处理,从 DefaultMainWinProc 返回的值必须由窗口 过程返回。

 

五、屏幕输出

  程序在响应 MSG_PAINT 消息时进行屏幕输出。应用程序应首先通过调用 BeginPaint 函数来获得设备上下文句柄,并用它调 用 GDI 函数来执行绘制操作。这里,程序使用 TextOut 文本输出函数在客户区的中部显示了一个“Hello world!”字符串。绘制 结束之后,应用程序应调用 EndPaint 函数释放设备上下文句柄。 我们将在本指南第 2 篇对 MiniGUI 的图形设备接口进行详细的描述。

六、 程序的退出

  用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个 MSG_CLOSE 消息。helloworld 程序在收到 MSG_CLOSE 消息时 调用 DestroyMainWindow 函数销毁主窗口,并调用 PostQuitMessage 函数在消息队列中投入一个 MSG_QUIT 消息。 当 GetMessage 函数取出 MSG_QUIT 消息时将返回 0,最终导致程序退出消息循环。 程序最后调用 MainWindowThreadCleanup 清除主窗口所使用的消息队列等系统资源并最终由 MiniGUIMain 返回。