1、Win32窗口程序采用的是事件驱动方式执行,也就是消息机制,当系统通知窗口工作时,就是采用消息的方式派发给窗口,通过调用窗口处理函数进行对消息对处理。
2、消息MessageBox结构体:
int MessageBox(
HWND hWnd, //父窗口句柄
LPCTSTR lpText, //显示在消息框中的文字
LPCTSTR lpCaption, //显示在标题栏中的文字
UINT uType //消息框中的按钮、图标显示类型
); //返回点击的按钮ID
3、每一个窗口都有窗口处理函数,例如:
LRESULT CALLBACK WindowProc(
HWND hwnd, //窗口句柄
UINT uMsg, //消息ID
WPARAM wParam, //消息参数
LPARAM lParam //消息参数
);
当系统通知窗口时,会调用窗口处理函数同时,会将消息ID和消息参数传递给窗口处理函数,在窗口处理函数中,没有手动处理的消息会使用缺省的窗口处理函数DefWindowProc()。
4、消息相关函数:
GetMessage();
TranslateMessage();
DispatchMessage();
5、常见消息:
WM_DESTROY:窗口被销毁时的消息,无消息参数(wParam、lParam),常用于在窗口被销毁之前,做相应的善后处理,例如资源、内存等
WM_SYSCOMMAND:系统命令消息,当点击窗口的最大化、最小化、关闭等命令时,收到这个消息。常用在窗口关闭时,提示用户处理。
WM_CREATE:在窗口创建成功还未显示之前,收到这个消息。常用于初始化窗口的参数、资源等,包括子窗口的创建。
WM_SIZE:在窗口大小发生变化后,会收到这个消息。常用于窗口大小变化后,调节窗口内各个部分的布局。其中,该消息的附加数据:WPARAM表示窗口大小变化的原因,LPARAM表示变化后窗口客户区大小,通过调用LOWORD获取变化后宽度,HIWORD获取变化后高度。
WM_QUIT:用于结束消息循环处理。
WM_PAINT:绘图消息。
另外还有键盘消息、鼠标消息、定时器消息等,以后研究。
附练习代码:
/*
功能:在点击关闭窗口按钮时,提示是否关闭窗口,YES关闭窗口,NO取消关闭窗口 WM_SYSCOMMAND: WM_CREATE: WM_SIZE: 以上消息的使用 */ #include <Windows.h> HINSTANCE g_hInstance; HWND childWnd; void OnCreate(HWND hParent) { childWnd = CreateWindowEx(0,__TEXT("edit"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,0,0,100,100,hParent,NULL,g_hInstance,NULL); } void OnSize(HWND hWnd,LPARAM lParam) { int nWidth = LOWORD(lParam); int nHight = HIWORD(lParam); MoveWindow(childWnd,0,0,nWidth,nHight,TRUE); } //窗口处理函数 LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { /* case WM_DESTROY: PostQuitMessage(0); break; */ case WM_SIZE: OnSize(hWnd,lParam); break; case WM_CREATE: OnCreate(hWnd); break; case WM_SYSCOMMAND: if (SC_CLOSE == wParam) { if(IDYES == MessageBox(hWnd,__TEXT("确定是否关闭窗口"),__TEXT("提示"),MB_YESNO)) { PostQuitMessage(0); } //不加else处理,程序会执行DefWindowProc,窗口进程不能关闭 else return 0; }
break; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } //注册窗口类 BOOL Register(LPCWSTR className) { WNDCLASSEX wc = {0}; wc.cbClsExtra = 0; wc.cbSize = sizeof(WNDCLASSEX); wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)COLOR_WINDOW; wc.hCursor = NULL; wc.hIcon = NULL; wc.hIconSm = NULL; wc.hInstance = g_hInstance; wc.lpfnWndProc = WinProc; wc.lpszClassName = className; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; return RegisterClassEx(&wc); } //创建窗口 HWND CreateWin(LPCWSTR className,LPCWSTR winName) { return CreateWindowEx(0,className,winName,WS_OVERLAPPEDWINDOW,100,100,600,600,NULL,NULL,g_hInstance,NULL); } //显示和更新窗口 void ShowWin(HWND hWnd) { ShowWindow(hWnd,SW_SHOW); UpdateWindow(hWnd); } //消息循环 void Message() { MSG ms = {0}; while (GetMessage(&ms,NULL,0,0)) { TranslateMessage(&ms); DispatchMessage(&ms); } } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { g_hInstance = hInstance; Register(__TEXT("Main")); HWND hWnd = CreateWin(__TEXT("Main"),__TEXT("This is test")); ShowWin(hWnd); Message(); return 0; }