WIN32 绘制消息

it2025-05-27  10

在 Win32开发中会收到系统发来的各种消息,WM_PAINT表示希望程序开始绘制界面。

什么时候会发出WM_PAINT消息:

当窗口存在一个无效的区域时(region)会触发绘制消息到程序上, 如果一直存在无效区域那么会一直发送绘制消息

LRESULT CALLBACK MYWNDPROC(HWND hwind, UINT unit, WPARAM wp, LPARAM lp) { //用户点击界面的x菜单的时候回收到WM_CLOSE消息 //收到消息后主动发一个WM_QUIT表示进程结束 if (unit==WM_CLOSE) { PostMessage(hwind, WM_QUIT, NULL, NULL); //也可以用如下消息API //PostQuitMessage(0); //返回值跟发送的消息相关,但是退出的消息随便返回 return 0; } else if (unit==WM_PAINT) { OutputDebugString(_T("测试输出调试")); PAINTSTRUCT ps; //用于获取hdc ,获取设备环境句柄,绘制必须依靠他 //HDC hdc=GetDC(hwind); 另一个相关API也可以获取到 HDC hdc = BeginPaint(hwind, &ps); RECT rc = { 100,100, 500,500 }; //绘制一个文字在特定矩形区域 DrawText(hdc, _T("嘿嘿"), lstrlenW(_T("嘿嘿")), &rc, DT_LEFT); //关闭资源并回收 否则GDI会一直上升,可以在任务管理器 //ReleaseDC 对应GetDC资源释放 EndPaint(hwind, &ps); return 0; } return DefWindowProc(hwind,unit,wp,lp); }

如果 开发者想主动出发可以使用InvalidateRect

BOOL InvalidateRect( HWND hWnd, const RECT *lpRect, BOOL bErase );

lpRect 更新绘制的区域 bErase 是否擦除背景

InvalidateRect文档

如以下代码在左键按下时出发绘图消息

LRESULT CALLBACK MYWNDPROC(HWND hwind, UINT unit, WPARAM wp, LPARAM lp) { //用户点击界面的x菜单的时候回收到WM_CLOSE消息 //收到消息后主动发一个WM_QUIT表示进程结束 if (unit==WM_CLOSE) { //... } else if (unit==WM_PAINT) { //... } else if (unit==WM_LBUTTONDOWN) { InvalidateRect(hwind, NULL, FALSE); return 0; } return DefWindowProc(hwind,unit,wp,lp); }

GetDC 和BeginPaint都可以得到hwin对象进行窗口绘制,但是GetDC不会清楚无效区域,简而言之用GetDC绘制后依然会收到WM_PAINT消息

最新回复(0)