Programming windows中关于绘图的一个疑问!
有一段是这样说得:“在第三章的HELLOWIN程式中,我们并不关心处理WM_PAINT讯息时的无效矩形。如果文字显示区域恰巧在无效矩形内,则由DrawText恢复之”。他的意思是说用自己呼叫函数产生的字符有可能将字符串显示到无效的区域中?是这样吗?!为什么?什么情况下会产生无效矩形区域?还有这段话:“PAINTSTRUCT中的rcPaint矩形不仅是无效矩形,它还是一个「剪取」矩形。这意味著Windows将绘图操作限制在剪取矩形内(更确切地说,如果无效矩形区域不为矩形,则Windows将绘图操作限制在这个区域内)”,他的意思好像是说PAINTSTRUCT并不等于整个窗口!只是其中的一部分,这段话“例如,如果在显示区域的显示输出中包括了一个圆,但是只有圆的一部分落到了无效矩形中,它就使仅绘制圆的无效部分变得没有意义。这需要画整个圆。在您使用从BeginPaint传回的装置内容代号时,Windows不会绘制rcPaint矩形外的任何部分。
”是不是说明这个问题?无效区域是怎样产生的?应该怎样理解这个“PAINTSTRUCT”!?请指点!
问题点数:50、回复次数:3Top
1 楼ATField()回复于 2003-06-02 23:43:41 得分 50
所谓无效矩形,就是Windows当你的窗口某一部分由于被其他的图形覆盖掉而需要
重画时传给你的矩形,用来表示这个区域
比如你把其他窗口拖到你的窗口上
他的意思是如果你要显示的文字在无效区内,说明这个文字需要重画,所以用DrawText来重画(回复原来的样子)
确实PAINTSTRUCT指定的rcPaint不一定是整个窗口
这段话“例如,如果在显示区域的显示输出中包括了一个圆,但是只有圆的一部分落到了无效矩形中,它就使仅绘制圆的无效部分变得没有意义。这需要画整个圆。在您使用从BeginPaint传回的装置内容代号时,Windows不会绘制rcPaint矩形外的任何部分。“
其实这句话的意思是:重画整个圆,这样更方便,不用只画落在无效矩形内的一部分
那样太麻烦。
Top
2 楼jcreatorqijiashe(秋天的童话)回复于 2003-06-03 23:56:04 得分 0
多谢!无效区域有什莫利用价值呢?怎样利用无效区域呢?这里programming windows中有一个鼠标处理的例子:
case WM_LBUTTONDOWN:
iCount = 0 ;
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON && iCount < 1000)
{
pt[iCount ].x = LOWORD (lParam) ;
pt[iCount++].y = HIWORD (lParam) ;
hdc = GetDC (hwnd) ;
SetPixel (hdc, LOWORD (lParam), HIWORD (lParam), 0) ;
ReleaseDC (hwnd, hdc) ;
}
return 0 ;
case WM_LBUTTONUP:
InvalidateRect (hwnd, NULL, FALSE) ;
return 0 ;
从代码(wm_lbuttondown和wm_lbuttonup)看好像程序员故意使部分区域无效,这是为什么?什麽情况下我们希望使屏幕上的某个区域无效啊?请指点!Top
3 楼ATField()回复于 2003-06-04 00:03:27 得分 0
无效区域可以使你迫使Windows重画某些部分(InvalidateRect)
也可以让你知道需要重画那些部分(在WM_PAINT中)
在这里,通过调用InvalidateRect(hwnd,NULL,FALSE)
使得整个窗口变得无效,从而使Windows发送一条WM_PAINT消息,你的程序
接收这条消息,从而重画整个窗口来达到重画的目的
Top




