WIN32 绘制消息

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);
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值