WM_DESTROY消息:
产生时间:窗口销毁时
附带信息:wParam为0,lParam为0
一般用法:常用于在窗口呗销毁之前,做善后处理,例如资源、内存
WM_SYSCOMMAND消息:
产生时间:当点击窗口的最大化、最小化、关闭等。
附带信息:wParam:具体点击的位置,例如关闭SC_CLOSE等。
lParam:鼠标光标的位置。
LOWORD(lParam);//水平位置(lParam的低两个字节)
HIWORD(lParam);//垂直位置(lParam的高两个字节)
一般用法:常用在窗口关闭时,提示用户处理。
WM_CREATE消息:
产生时间:窗口创建成功但还未显示时
附带信息:wParam:为0.
lParam:为CREATESTRUCT类型的指针。
通过这个指针可以获取CreatWindowEx中的全部12个参数的信息。
一般用法:常用于初始化窗口的参数、资源等等,包括创建子窗口等。
WM_SIZE消息:
产生时间: 在窗口大小发生变化后。
附带信息:wParam:窗口大小变化的原因
lParam:窗口变化后的大小。
LOWORD(lParam)//变化后的宽度
HIWORD(lParam)//变化后的高度
一般用法:常用于窗口大小变化后,调整窗口内各部分的布局。
WM_QUIT消息:
产生时间:程序员发送。
附带消息:wParam: PostQuitMessage函数传递的参数。
lParam: 0。
一般用法:用于结束消息循环,当GetMessage收到这个消息后,会返回FALSE, 结束while处理,退出消息循环。
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
HANDLE g_hOutput; //接受标准输出句柄
void OnCreate(HWND hWnd, LPARAM lParam) {
CREATESTRUCT* pcs = (CREATESTRUCT*)lParam;
char* pszText = (char*)pcs->lpCreateParams;
MessageBox(NULL, pszText, "Infor", MB_OK);
CreateWindowEx(0, "EDIT", "hello", WS_CHILD | WS_VISIBLE | WS_BORDER, 0, 0, 200, 200, hWnd, NULL, 0, NULL);
}
void OnSize(HWND hWnd, LPARAM lParam) {
short nWidth = LOWORD(lParam);
short nHeight = HIWORD(lParam);
char szText[256] = { 0 };
sprintf(szText, "WM_SIZE:宽:%d, 高:%d\n", nWidth, nHeight);
WriteConsole(g_hOutput, szText, strlen(szText), NULL, NULL);
}
//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgId, WPARAM wParam, LPARAM lParam) {
switch (msgId) {
case WM_SIZE:
OnSize(hWnd, lParam);
break;
case WM_CREATE:
OnCreate(hWnd, lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) {
int nRet = MessageBox(hWnd, "是否退出", "注意", MB_YESNO);
if (nRet != IDYES) {
return 0;
}
break;
}
}
return DefWindowProc(hWnd, msgId, wParam, lParam);
}
//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
AllocConsole();//增加dos窗口
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//注册窗口类
WNDCLASS wc = { 0 };
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor = NULL;
wc.hIcon = NULL;
wc.hInstance = hIns;
wc.lpfnWndProc = WndProc;
TCHAR name[] = TEXT("Main");
wc.lpszClassName = name;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);//将以上所有赋值全部写入操作系统。
char pszText[] = "hello data";
//在内存中创建窗口
HWND hWnd = CreateWindow(name, TEXT("title"), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, pszText);
//注册子窗口类
wc = { 0 };
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor = NULL;
wc.hIcon = NULL;
wc.hInstance = hIns;
wc.lpfnWndProc = DefWindowProc;
TCHAR name1[] = TEXT("Child");
wc.lpszClassName = name1;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);//将以上所有赋值全部写入操作系统。
//在内存中创建子窗口
HWND hChild1 = CreateWindowEx(0, name1, TEXT("ChildTitle"), WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, hWnd, NULL, hIns, NULL);
HWND hChild2 = CreateWindowEx(0, "Child", "c2", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 200, 0, 200, 200, hWnd, NULL, hIns, NULL);
//显示窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
//消息循环
MSG nMsg = { 0 };
while (GetMessage(&nMsg, NULL, 0, 0)) {
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理
}
return 0;
}