书上说到“要在处理WM_PAINT消息时在更新的矩形外绘图,您可以在调用BEGINPAINT
之前使用 INVALIDATERECT(HWND,NULL,TRUE);它使整个客户区变的无效,并檫除背景。但是,如果最后一个参数等于FALSE,则不檫除背景,原有的东西将保留原处。通常这是WINDOWS程序在无论何时收到WM_PAINT消息而不考虑REPAINT结构的情况下简单的重画整个客户区最简单的办法。例如,如果在客户区的显示输出包括了一个圆,但是只有圆的一部分落到了无效的矩形区中,它就使仅绘制的圆的无效部分变的没有意义。这需要画整个圆。在你使用从BEGINPAINT返回的设备描述表句柄时,WINDOWS不会绘制RCPAINT矩形外的任何部分!
在第二章的HELLOWIN中,我们并不关系处理WM_PAINT消息时的无效矩形。如果文本显示区域恰巧在无效的矩形内,则由DRAWTEXT恢复之,不过,这一决定需要时间。……”
我把书的原句打出来了,这几段话,让我搞糊涂了,到底无效矩形区是能画图画还是不能画,有效矩形区呢?还有BEGINPAINT是让整个客户区有效是吗?还有“如果文本显示区域恰巧在无效的矩形内,则由DRAWTEXT恢复之”这是什么意思呢?“INVALIDATERECT(HWND,NULL,TRUE);”函数是使正个客户区无效,那怎么又说
“要在处理WM_PAINT消息时在更新的矩形外绘图,您可以在调用BEGINPAINT
之前使用 INVALIDATERECT(HWND,NULL,TRUE);”
总之这段怎么理解 还请请各位高手指教! 小弟另送分 谢谢了
之前使用 INVALIDATERECT(HWND,NULL,TRUE);它使整个客户区变的无效,并檫除背景。但是,如果最后一个参数等于FALSE,则不檫除背景,原有的东西将保留原处。通常这是WINDOWS程序在无论何时收到WM_PAINT消息而不考虑REPAINT结构的情况下简单的重画整个客户区最简单的办法。例如,如果在客户区的显示输出包括了一个圆,但是只有圆的一部分落到了无效的矩形区中,它就使仅绘制的圆的无效部分变的没有意义。这需要画整个圆。在你使用从BEGINPAINT返回的设备描述表句柄时,WINDOWS不会绘制RCPAINT矩形外的任何部分!
在第二章的HELLOWIN中,我们并不关系处理WM_PAINT消息时的无效矩形。如果文本显示区域恰巧在无效的矩形内,则由DRAWTEXT恢复之,不过,这一决定需要时间。……”
我把书的原句打出来了,这几段话,让我搞糊涂了,到底无效矩形区是能画图画还是不能画,有效矩形区呢?还有BEGINPAINT是让整个客户区有效是吗?还有“如果文本显示区域恰巧在无效的矩形内,则由DRAWTEXT恢复之”这是什么意思呢?“INVALIDATERECT(HWND,NULL,TRUE);”函数是使正个客户区无效,那怎么又说
“要在处理WM_PAINT消息时在更新的矩形外绘图,您可以在调用BEGINPAINT
之前使用 INVALIDATERECT(HWND,NULL,TRUE);”
总之这段怎么理解 还请请各位高手指教! 小弟另送分 谢谢了
无效区,然后同一重画。不用死抠他的字眼,外国人的表达方式和翻译都会浪费你的时间。
有效区域是要进行画的话,必须自己画。INVALIDATERECT(HWND,NULL,TRUE);就是使整个区域都无效,从而发出WM_PAINT消息,当然进行重画的工作由你自己在OnPaint或者OnDraw函数中做。
至于这一段“要在处理WM_PAINT消息时在更新的矩形外绘图,您可以在调用BEGINPAINT
之前使用 INVALIDATERECT(HWND,NULL,TRUE);”,那是因为可能无效矩形并不是整个窗口,用INVALIDATERECT(HWND,NULL,TRUE)就可以将整个客户区与更新矩形合并,就可以在整个客户区画图了
在消息处理函数处理WM_PAINT的时候,调用BeginPaint(hwnd,&ps)
你也看到了,这个ps中包含了无效区的信息,说穿了,ps知道无效区就是什么样的一个区域,你绘图的话,无论你怎么画,只能在无效区画,就是说,别的地方画了也不出来,没用的,只能在无效区域把你画的东东显示出来。
另外,调用BeginPaint确实会使无效区变的有效,这很正常啊,你想,你都在消息函数中处理了WM_PAINT消息,那这个无效区域还要来干什么呢。你看到书上说了吗,不让无效区有效的话,就会一直发送WM_PAINT消息的!
最后,INVALIDATERECT(HWND,NULL,TRUE)使整个客户区无效的话。
我不是说了吗??