|
在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。
在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或者点击窗口时,窗口需要运行这个消息处理函数。
窗口函数 WindowProc 声明如下:
- LRESULT CALLBACK WindowProc(
- HWND hwnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam
- );
复制代码
hwnd 是当前窗口的句柄;
uMsg 是系统发过来的消息;
wParam 是消息参数;
lParam 是消息参数。
这个函数一定是静态函数,也就是全局函数,在编译时已经确定了地址。由于它需要设置在注册的窗口类型里,如下:
注册窗口类,指定窗口类的名称与窗口回调函数
- WNDCLASSEX wcex = { 0 };
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.lpfnWndProc = WindowProc;
- wcex.lpszClassName = szWindowClass;
- if (!RegisterClassEx(&wcex))
- {
- MessageBox(NULL, _T("注册窗口类失败"), _T("Tip"), NULL);
- return 1;
- }
复制代码
默认窗口函数 DefWindowProc 声明如下:
- LRESULT DefWindowProc(
- HWND hWnd,
- UINT Msg,
- WPARAM wParam,
- LPARAM lParam
- );
复制代码
这个函数参数跟上面那个函数是一样的。只不过,它是处理所有默认的消息。
调用这两个函数的实例如下:
- #include <windows.h>
- #include <tchar.h>
- static TCHAR szWindowClass[] = _T("WindowClass");
- static TCHAR szTitle[] = _T("我在VC驿站的第一个窗口程序");
- LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- PAINTSTRUCT ps;
- HDC hdc;
- TCHAR greeting[] = _T("你好,世界!");
- switch (uMsg)
- {
- case WM_PAINT:
- hdc = BeginPaint(hwnd, &ps);
- TextOut(hdc, 5, 5, greeting, _tcslen(greeting));
- EndPaint(hwnd, &ps);
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hwnd, uMsg, wParam, lParam);
- break;
- }
- return 0;
- }
复制代码
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
- {
- //第一步:注册窗口类,指定窗口类的名称与窗口回调函数
- WNDCLASSEX wcex = { 0 };
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.lpfnWndProc = WindowProc;
- wcex.lpszClassName = szWindowClass;
- if (!RegisterClassEx(&wcex))
- {
- MessageBox(NULL, _T("注册窗口类失败"), _T("Tip"), NULL);
- return 1;
- }
- //第二步:创建窗口,指定注册窗口类,窗口标题,窗口的大小
- HWND hWnd = CreateWindow(
- szWindowClass,
- szTitle,
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT,
- 500, 300,
- NULL,
- NULL,
- hInstance,
- NULL
- );
- if (!hWnd)
- {
- MessageBox(NULL, _T("创建窗口失败!"), _T("Tip"), NULL);
- return 1;
- }
- //第三步:显示窗口
- ShowWindow(hWnd, nCmdShow);
- //第四步:开始消息循环
- MSG msg = { 0 };
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return (int)msg.wParam;
- }
复制代码
|
上一篇: RegisterClassEx 函数说明下一篇: ShowWindow 函数说明
|