
创建窗口消息为“WM_NCCREATE”消息和“WM_CREATE”消息。该消息是由函数"CreateWindow()"产生的,在程序执行"CreateWindow()"函数的时候,首先发出消息“WM_NCCREATE”,紧接着是“WM_CREATE”。消息“WM_NCCREATE”是由函数"CreateWindow()"直接发送至窗口过程。如果程序针对“WM_NCCREATE”消息进行处理,则需要返回True以继续创建窗口。如果执行返回Flase 则返回一个NULL句柄。“WM_CREATE”消息在窗口创建成功并且返回之前发送“WM_CREATE”消息,可以在该消息下初始化窗口,如:子窗口,控件,等等。
二;注销窗口消息注销窗口所使用的消息为“WM_DESTROY”,"WM_NCDESTROY"。它们是由函数DestroyWindow函数产生。
三;刷新窗口消息窗口刷新消息为“WM_PAINT”。
在Windows系统中,所有的东西都是绘制的,包括窗口,按钮,对话框,图片,甚至是文字。“WM_PAINT”消息就是在绘制这些对象的时候系统发送的消息。如果处理该消息,应用程序返回零。
具体如下操作会触发WM_PAINT消息。
- 程序启动,UpdateWindow函数发送WM_PAINT消息来更新指定窗口的客户去。
- 鼠标窗口调整大小。
- 最小化窗口状态时,还原触发。
- 最大化触发。
- 当向屏幕外拖动窗口时,不会触发,拉回则触发。
- InvalidateRect函数触发。
- 程序在执行至函数CreateWindow()会产生两条消息“WM_NCCREATE”,“WM_CREATE”。该消息是直接发送到窗口过程并不是存入消息队列。
- 窗口过程中MyWindowProc() 匹配到该消息,并且进行处理,执行SetWindowTextA()函数,对窗口进行初始化。
- 首先,在用户在窗口界面会点击关闭按钮,产生消息“WM_CLOSE”。
- 窗口过程中,匹配到“WM_CLOSE”,执行其中代码函数DestroyWindow()。
- 函数DestroyWindow()会产生销毁窗口的消息“WM_DESTROY”,"WM_NCDESTROY"。
- 同样在窗口过程中,匹配到消息,调用函数PostQuitMessage()。
- PostQuitMessage()函数会产生消息“WM_QUIT”。该消息由默认处理函数DefWindowProc() 函数处理用来退出消息循环。
程序执行逻辑图:
3;更新窗口程序执行逻辑- 施行触发“WM_PAINT”消息行为。
- 窗口过程中,匹配至该消息,通过函数BeginPaint() 和EndPaint() 函数来控制多次触发WM_PAINT”消息。
#include <Windows.h>
#include <stdio.h>
//自定义消息
#define WM_AAA WM_USER+1
//自定义窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT MSG, WPARAM wParam, LPARAM IParam)
{
switch (Msg)
{
case WM_AAA:
MessageBoxA(NULL, "窗口过程:WM_AAA", "测试", MB_OK);
return 0;
/// /////////////////// 创建窗口消息 ///////////////////////
case WM_NCCREATE: //CreateWindow() 函数产生的消息
//OutputDebugStringA("WM_NCCREATE 消息!!!n");
return true;
case WM_CREATE:
{ //CreateWindow函数在窗口创建成功并且在返回之前直接发送WM_CREATE消息给窗口过程函数。
CREATESTRUCT* P = (CREATESTRUCT*)IParam;
//IParam是指向CREATESTRUCT结构的指针,其中包含了有关正在创建的窗口信息。
SetWindowTextA(hWnd, "你好 天象独行");
//OutputDebugStringA("WM_CREATE 消息!!!n");
return true;
}
/// /////////////////// 注销窗口消息 ///////////////////////
case WM_CLOSE:
DestroyWindow(hWnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_NCDESTROY:
return 0;
/// /////////////////// 刷新窗口消息 ///////////////////////
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
static int i = 0;
char str[64];
sprintf_s(str, "第%d次产生WM_PAINT!!!n", ++i);
OutputDebugStringA(str);
//return 0;
//break;
EndPaint(hWnd, &ps);
return 0;
}
default:
return DefWindowProcW(hWnd, Msg, wParam, IParam);
}
return 0;
}
//主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
//int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
//注册窗口类
WNDCLASS wind;
wind.cbClsExtra = 0;
wind.cbWndExtra = 0;
wind.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));// 设定背景色
wind.hCursor = LoadCursor(NULL, IDC_ARROW); //光标
wind.hIcon = LoadCursor(NULL, IDI_APPLICATION);//图标
wind.lpfnWndProc = MyWindowProc; //自定义的窗口过程函数
wind.lpszClassName = L"Aaron.xu"; //窗口类名
wind.lpszMenuName = NULL; // 菜单资源名称
wind.style = CS_HREDRAW;//窗口类,样式
wind.hInstance = hInstance;//实例句柄
RegisterClass(&wind); //注册窗口类
//创建窗口
HWND hWnd = CreateWindow(L"Aaron.xu", L"天象独行",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);
//显示窗口
//ShowWindow(hWnd, nShowCmd);
ShowWindow(hWnd, nCmdShow);
//更新窗口
UpdateWindow(hWnd);
//创建窗口2
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) //GetMessage()从消息队列取出消息
{
if (msg.message == WM_LBUTTONDOWN) { //接收用户窗口双击产生的消息,并且发送WM_AAA消息。
//SendMessage()函数将消息直接发送给窗口过程,并且阻塞,除非被窗口过程处理才返回。
SendMessage(hWnd, WM_AAA, 0, 0);
//PostQuitMessage(0);
//int a = 100;
}
TranslateMessage(&msg); //将虚拟键消息转换为字符消息
DispatchMessage(&msg); //将WM_AAA消息分配窗口过程MyWindowProc
}
}