窗口过程:在用户调整应用程序时,Windows会向应用程序发送一条消息,实际是调用了该程序内部的一个函数,这个函数描述了由Windows发送应用程序接收的特定消息。此函数为“窗口过程”
窗口类 ,窗口,窗口过程,消息队列,消息循环,窗口消息
通过RegisterClass()该函数注册窗口类,之后利用窗口类来创建窗口并且确定了窗口过程,之后Windows创建一个消息队列,该消息被添加进消息队列中,通过消息循环将消息进行接收,转换,派发给应用程序进行处理之后产生相应消息的事件。(PostMessage需要排队,SendMessage不需要排队)
窗口是基于窗口类来创建的,在创建窗口时便确定了处理窗口消息的窗口过程。
处理消息的一生
1.RegisterClass()注册窗口类---初始化结构体(10个基本参数)
2.CreateWindow() 创建窗口---传参形式(11个基本参数)ASCII字符将调用CreateWindowA(...),UNICODE字符将调用CreateWindowW(...)
3.ShowWindow(hwnd, iCmdShow) hwnd为CreateWindow的窗口句柄,iCmdShow为初始显示形式(正常,最大化,最小化),如果第二个参数是正常则该窗口客户区会被窗口类中背景画刷擦除就需要调用UpdateWindow(hwnd)进行重绘。
4.消息循环
此刻Windows会为当前运行每一个Windows程序维护一个消息队列,输入一个事件会将这些事件转换为消息放在消息队列中。
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage ($msg);
DispatchMessage (&msg);
}
通过GetMessage()将从消息队列中对消息进行检索
TranslateMessage()将mes结构返回的键盘鼠标等消息进行转换。
DispatchMessage()即windows将这条消息发送给合适的窗口过程来处理。
5.窗口过程决定了窗口所做的意义。(几乎都是由Windows自身调用),应用程序想自己调用窗口过程通过SendMessage()函数实现
WndProc(消息处理)函数,所接受的每一条消息都是由一个数字来表示即message参数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
6.消息处理
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
DefWindowProc() 用来接收所有窗口过程不进行处理的消息,DefWindowProc()返回值必须从窗口过程返回。