InvalidateRect,ValidateRect,WM_PAINT消息

关于InvalidateRect和ValidateRect函数,一直都不是很清楚。。。

今天写了几行代码,来验证一下心里所想的。。。

InvalidateRect函数使&rect标示的矩形区域无效,并且产生一个WM_paint消息,而ValidateRect函数则是rect标示的矩形有效,不会产生wm_paint消息,而会使当前的绘制操作立即生效(个人理解)

 

如代码所示,在wm_paint消息中输出一行字符“renjingwei”,当按下鼠标左键时,会绘制一个折线,

在wm_lbuttondown消息中,使用了Validate函数,使得整个客户区有效,使当前的绘制操作立即生效,而调用InvalidateRect函数则不会产生折线,因为这个invalidaterect函数会产生WM_PAINT消息,这样只会输出一个文本“renjingwei”

case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
RECT rect;
GetClientRect(hwnd,&rect);
//TextOut(hdc,200,300,"renjingwei",strlen("renjingwei"));
DrawText(hdc,"renjingwei",-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);

EndPaint(hwnd,&ps);
break;
case WM_LBUTTONDOWN:
hdc=GetDC(hwnd);
MoveToEx(hdc,50,50,&pt);
LineTo(hdc,50,100);
LineTo(hdc,100,100);
ValidateRect(hwnd,NULL);
ReleaseDC(hwnd,hdc);
break;
case WM_RBUTTONDOWN:
hdc=GetDC(hwnd);
MoveToEx(hdc,100,100,&pt);
LineTo(hdc,100,200);
InvalidateRect(hwnd,NULL,FALSE);
//ValidateRect(hwnd,NULL);
ReleaseDC(hwnd,hdc);
break;
在上边


例子的基础上有增加了WM_RBUTTONDOWN消息,在这个消息中绘制一条竖线,如果调用ValidateRect函数会和上边一样,立即生效。。绘制一个L

但是如果调用InvalidateRect(hwnd,NULL,FALSE);
第三个参数FALSE,指示产生WM_PAINT消息后不擦除背景,绘制一个L加一个竖线,

但是调用InvalidateRect(hwnd,NULL,TRUE);
TRUE参数指示产生WM_PAINT消息后擦除背景,会把LBUTTONDOWN消息产生的L给擦除,而且当前绘制的竖线也不会生效,仅仅绘制一行文本,“renjingwei”;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值