您的位置:首页 > 大数据 > 人工智能

InvalidateRect,ValidateRect,WM_PAINT消息

2013-09-06 20:44 274 查看
关于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”;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: