1.2.2 Windows应用程序框架结构(2)
x,y:指定窗口的初始水平位置和初始垂直位置。nWidth:指定窗口的宽度和高度。hWndParent:指向被创建窗口的父窗口或所有者窗口的句柄。hMenu:菜单句柄,或依据窗口风格的一个子窗口标识。hlnstance:包含该窗口类实例的句柄。lpParam:指向一个值的指针,该值传递给窗口WM_CREATE消息。
创建窗口后,Windows并没有将其显示到显示器上,只是在内存中保存了这个窗口的全部信息,要显示这个窗口,需要使用函数ShowWindow,它的函数原型如下:
- BOOL ShowWindow(HWND hWnd, int nCmdShow);
函数说明如下。
返回值:如果窗口以前可见,则返回一个非零值;如果窗口以前被隐藏,则返回值0。hWnd:指定窗口句柄。nCmdShow:指定窗口如何显示,通常设置该参数为SW_SHOW(在窗口原来的位置以原来的尺寸激活并显示窗口)或SW_HIDE(隐藏窗口并激活其他窗口)。
4.窗口消息循环
Windows会为每一个当前运行的程序建立一个消息队列,用来完成用户与程序的交互。为了让程序能够处理这个消息队列,程序员必须使用一个消息循环从消息队列中取出消息,代码如下:
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
消息循环从GetMessage函数开始,首先从消息队列中取出一个消息,然后通过TranslateMessage(&msg)函数将msg结构体传递给Windows进行转换,最后使用DispatchMessage(&msg)函数将msg结构体回传给Windows,再由Windows将此消息发送到相应的窗口过程中进行处理。
5.窗口过程函数
要处理Windows发来的消息,必须定义一个窗口过程函数。在填充WNDCLASS结构体的时候定义的窗口的消息处理函数就是用来处理窗口消息的窗口过程函数,它是一个回调函数。其定义形式如下:
- LRESULT CALLBACK WndProc(HWND hwnd,
- UNIT message,
- WPARAM wParam,
- LPARAM lParam);
函数说明如下。
hwnd:是接收消息的窗口句柄,它由CreateWindow函数创建。message:标识消息类型。wParam,lParam:32位的消息参数,用来提供消息的更多信息。
6.窗口处理消息
在定义完窗口过程函数后,就可以在窗口过程函数中来处理由Windows发来的窗口消息。根据判断收到的是什么消息,再对该消息做相应的处理,实例代码如下:
- switch(message)
- {
- case WM_CREATE:
- /*……*/
//代码实现省略 - break;
- case WM_PAINT:
- /*……*/
//代码实现省略 - break;
- }
- return DefWindowProc(hwnd,message,wParam,lParam);
7.创建应用程序结构
Windows应用程序框架结构的创建请参考以下实例代码:
- #include <windows.h>
- LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); //声明回调函数
- char szWinName[] = "MyWindow"; //程序的类名称
- int WINAPI WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nShowCmd)
- {
- HWND hWnd; //窗口句柄
- MSG msg; //消息
- WNDCLASS WndClass; //窗口类
- WndClass.style = CS_HREDRAW | CS_VREDRAW; //定义窗口类型
- WndClass.lpfnWndProc = WindowFunc; //消息处理函数
- WndClass.cbClsExtra = 0; //预留空间,0为不预留
- WndClass.cbWndExtra = 0; //预留空间,0为不预留
- WndClass.hInstance = hInstance; //程序的实例句柄
- WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //设置窗口的图标
- WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //设置鼠标光标形状
- WndClass.hbrBackground = (HBRUSH)GetStockObject
(WHITE_BRUSH);
//窗口背景为白色 - WndClass.lpszMenuName = NULL; //设置窗口菜单
- WndClass.lpszClassName = szWinName; //定义窗口类的名称
- if(!RegisterClass(&WndClass)) //注册窗口
- return 1;
- hWnd = CreateWindow(szWinName, //窗口的类名称
- "MyWindow", //窗口的标题
- WS_OVERLAPPEDWINDOW, //窗口的风格
- CW_USEDEFAULT, //窗口的坐标x
- CW_USEDEFAULT, //窗口的坐标y
- CW_USEDEFAULT, //窗口的宽度
- CW_USEDEFAULT, //窗口的高度
- NULL, //父窗口句柄
- NULL, //窗口的目录
- hInstance, //窗口的句柄
- NULL); //参数指针
- ShowWindow(hWnd, nShowCmd); //显示窗口
- UpdateWindow(hWnd); //更新窗口
- //处理窗口消息
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
- //定义回调处理函数
- LRESULT CALLBACK WindowFunc(HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam)
- {
- HDC hDC; //设备句柄
- PAINTSTRUCT PainStruct; //声明绘制窗口客户区
- RECT Rect; //矩形区域
- switch(message)
- {
- case WM_PAINT: //重画消息
- hDC = BeginPaint(hWnd, &PainStruct); //准备窗口绘图
- GetClientRect(hWnd, &Rect); //得到客户区矩形区域
- //在窗口显示字符串“Hello”
- DrawText(hDC, "Hello, Windows" , -1, &Rect,
- DT_SINGLELINE|DT_CENTER|DT_VCENTER);//绘制字符串
- EndPaint(hWnd, &PainStruct); //结束窗口绘图
- return 0;
- case WM_DESTROY: //销毁窗口消息
- PostQuitMessage(0); //发送退出消息
- return 0;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
8.运行结果
Windows应用程序框架结构运行结果如图1.1所示。
|
| 图1.1 Windows应用程序框架结构运行结果 |