提示:以下是本篇文章正文内容
窗口过程是一个特定类型的函数,用来接收和处理所有发送到该窗口的消息。每个控件类都有一个窗口过程,属于同一控件类的所有控件共用一个窗口过程来处理消息。窗口过程函数是MiniGUI程序的主体部分,应用程序实际所做的工作大部分都发生在窗口过程函数中,因为MiniGUI程序的主要任务就是接收和处理窗口收到的各种消息。窗口过程函数由MiniGUI调用,是一个回调函数。
窗口过程函数一般定义的形式:
static int HelloWinPro(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
hWnd:接收消息的窗口的句柄,与CreateMainWindow函数的返回值相同,该值标识了接收该消息的特定窗口。(何为句柄? 下面会说)
message:与MSG结构中的message域相同,是一个标识窗口所收到消息的整数值。
wParam和IParam:都是32位的消息参数。
句柄(Handle)是一个用来标识对象或项目的标识符,可以用来描述窗体、文件等。在 MiniGUI 中,使用句柄访问窗口、控件、菜单、图标等。
eg: 窗口句柄:是用来标识窗口的唯一值。每个窗口都对应一个句柄,所有的句柄都不会重复,根据句柄可以获取对应窗口的相关信息。
#include <stdio.h>
#include <minigui/common.h> //包括MiniGUI常用的宏以及数据类型的定义
#include <minigui/minigui.h> //包含全局接口函数和通用接口函数以及某些杂项函数的定义
#include <minigui/gdi.h> //包含MiniGUI绘图函数的接口定义
#include <minigui/window.h> //包含窗口有关的宏、数据类型、数据结构定义以及函数接口声明
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)//窗口过程函数
{
HDC hdc;
switch (message) {
case MSG_PAINT: //该消息在需要进行窗口重绘时发送到窗口过程,处理完该消息后 直接返回
hdc = BeginPaint (hWnd); //获取设备上下文句柄
//TextOut (hdc, 100, 100, "Hello world!");//文本的输出
SetPenColor(hdc, PIXEL_red);
Rectangle (hdc, 100, 100, 200, 200);
EndPaint (hWnd, hdc); //释放设备上下文句柄
return 0;
case MSG_CLOSE: //点击关闭按钮时,应用程序在响应消息时会调用销毁窗口
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
int MiniGUIMain (int argc, const char* argv[])
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 800, 600);
#endif
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = "HelloWorld";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = HelloWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 320;
CreateInfo.by = 240;
CreateInfo.iBkColor = COLOR_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow(hMainWnd, SW_SHOWNORMAL);
while (GetMessage(&Msg, hMainWnd)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
MainWindowThreadCleanup (hMainWnd);
return 0;
}
#ifndef _LITE_VERSION
#include <minigui/dti.c>
#endif
PostQuitMessage (hWnd);
该消息在消息队列中设置一个QS_QUIT标志。GetMessage在从指定消息队列中获取消息时,会检查该标准,如果有QS_QUIT标志,GetMessage消息将返回FALSE,从而可以利用该返回值终止消息循环 。
SetDesktopRect(0, 0, 800, 600);
在MiniGUI-Lite版本中,每个MiniGUI客户端程序在调用其它MiniGUI函数之前必须调用该函数以设置程序的桌面显示矩形区域。
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwStyle——窗口的风格。
WS_VISIBLE——创建⼀个初始状态为可见的窗⼝
WS_BORDER——创建⼀个单边框的窗⼝
WS_CAPTION——标题栏
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.dwExStyle——窗口的附加风格。
WS_EX_NONE——表示无附加窗口风格
CreateInfo.spCaption = "HelloWorld";
CreateInfo.spCaption ——窗口的标题。
CreateInfo.hMenu = 0;
CreateInfo.hMenu——附加在窗口上的菜单句柄,设置窗口的主菜单
CreateInfo.hMenu = 0;表示该窗口无主菜单
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hCursor—— 在窗口中所使用的鼠标光标句柄
GetSystemCursor(0);——设置主窗口的光标为系统缺省光标。(即系统默认的光标)
CreateInfo.hIcon = 0;
CreateInfo.hIcon ——程序的图标
CreateInfo.hIcon = 0;表示该窗口没有图标
CreateInfo.MainWindowProc = HelloWinProc;
CreateInfo.MainWindowProc= HelloWinProc ——设置主窗口的过程函数为HelloWinProc,发往该 窗口的消息由该函数处理
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 320;
CreateInfo.by = 240;
设置窗口在屏幕的位置,该窗口左上角位于(0,0),右下角位于(320,240).
CreateInfo.lx——窗口左上角相对屏幕的绝对横坐标
CreateInfo.ty ——窗口左上角相对屏幕的绝对纵坐标
CreateInfo.rx ——窗口右下角相对屏幕的绝对横坐标
CreateInfo.by ——窗口右下角相对屏幕的绝对纵坐标
CreateInfo.iBkColor = COLOR_lightwhite;
CreateInfo.iBkColor——设置窗口的背景颜色
CreateInfo.iBkColor = COLOR_lightwhite;表示设置主窗口的颜色为白色
CreateInfo.dwAddData = 0;
CreateInfo.dwAddData ——窗口的附加数据
CreateInfo.dwAddData = 0; 表示窗口无附加数据
CreateInfo.hHosting = HWND_DESKTOP;
CreateInfo.hHosting——设置主窗口的托管窗口
CreateInfo.hHosting = HWND_DESKTOP;表示设置主窗口的托管窗口为桌面窗口
ShowWindow(hMainWnd, SW_SHOWNORMAL);
显示窗口;
第一个参数为所要显示的窗口的窗口句柄,第二个参数指明显示方式(显示或者隐藏,SW_SHOWNORMAL说明要显示主窗口,并把它置为顶窗口)。 调用ShowWindow函数后主窗口会出现在屏幕上,之后便进入消息循环
TranslateMessage(&Msg);
TranslateMessage函数把击键消息转化为MSG_CHAR消息,然后直接发送到窗口过程函数。
DispatchMessage(&Msg);
DispatchMessage函数最终将把消息发往该消息的目标窗口过程,让它进行处理。
MainWindowThreadCleanup (hMainWnd);
清除主窗口所使用的消息队列、内存等系统资源,并由MiniGUIMain返回。