在 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
是否擦除背景
如以下代码在左键按下时出发绘图消息
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
消息