首先,介绍几个函数以及相关结构体的定义,这里只介绍名称和大致功能,详情可以自己查。
1、定义窗口类对象,指定窗口特征,用到一个结构体WNDCLASS。
2、注册窗口类,ATOM RegisterClass(CONST WNDCLASS* lpWndClass);
3、创建窗口实例,HWND CreateWindow(...)。
4、显示窗口,BOOL ShowWindow(HWND hWnd, int nCmdShow);
5、刷新窗口,BOOL UpdateWindow(HWND hWnd);
6、从消息队列中取出消息,BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wmsgFilterMax);
7、将虚拟键消息转换为字符消息,TranslateMessage。
8、将消息传送到窗口函数,DispatchMessage。
其次,介绍如何创建一个窗口。我们知道,WinMain()函数是所有Windows应用程序的入口,主要功能是注册窗口类、创建显示窗口以及产生消息循环。
int WINAPI WinMain(
HINSTANCE hInstance, // 应用程序当前实例句柄
HINSTANCE hPrevInstance, // 保留,一直是NULL
LPSTR lpCmdLine, // 指向程序命令行参数的指针
int nCmdShow // 应用程序开始执行时窗口显示方式的整数值标识
)
注:在WinMain函数的声明中,WINAPI关键字一种调用约定,是Windows操作 系统对WinMain函数的一种规定,必须使用这种调用规定。
接着,有了WinMain函数之后,还需要编写一个窗口函数用于处理发送给窗口的信息。窗口函数的原型如下:
LRESULT CALLBACK WindowProc(
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息框
WPARAM wParam, // 消息参数
LPARAM lParam // 消息参数
)
最后,附上一个示例,代码如下:
#include <WINDOWS.H>
#include <TCHAR.H>
// 声明窗口函数
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// 入口函数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
// 定义窗口类
WNDCLASS wndclass;
wndclass.lpfnWndProc = WindowProc; // 指定窗口函数
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
wndclass.lpszClassName = _T("我的窗体"); // 使用Unicode字符集
wndclass.hInstance = hInstance; // 注册窗口类的实例句柄
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // 获取标准鼠标光标
wndclass.hIcon = 0;
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 窗口背景颜色
wndclass.lpszMenuName = 0;
// 注册窗口类
if(0 == RegisterClass(&wndclass))
{
MessageBox(0, _T("注册窗口类失败"), _T("我的窗体"), MB_OK);
return 0;
}
// 创建窗口实例
HWND hWnd = CreateWindow(_T("我的窗体"), _T("我的第一个窗体"), WS_OVERLAPPEDWINDOW,
100, 100, 500, 400, 0, 0, hInstance, 0);
// 显示和更新窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
// 消息循环
MSG msg;
while(GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
// 定义窗口函数
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE:
{
PostQuitMessage(0); // 给消息队列发送WM_QUIT消息,以便结束消息循环,退出程序
}
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}