海外主机测评

您现在的位置是:首页 > 云服务器知识 > 正文

云服务器知识

invalidaterectinvalidaterect闪屏

cds8202023-05-18云服务器知识106
本文目录一览:1、用MFC开发单文档程序,用到了OnMouseMove消息,但是这个函数里的InvalidateRect一开始无效2、InvalidateRect(hWnd,NULL,

本文目录一览:

  • 1、用MFC开发单文档程序,用到了OnMouseMove消息,但是这个函数里的InvalidateRect一开始无效
  • 2、InvalidateRect(hWnd, NULL, FALSE);
  • 3、windows编程:关于InvalidateRect的第3个参数问题。
  • 4、VC写的一个窗口问题InvalidateRect无效

用MFC开发单文档程序,用到了OnMouseMove消息,但是这个函数里的InvalidateRect一开始无效

楼主如果想要在

OnMouseMove

里引起重绘 ,我建议楼主不要这样做,这样是不会引起重绘,不知道楼主有没有听到过线程消息队列,队列分为发送、登记、虚拟、刷新等队列,以上顺序都是如果有相应队列的消息下一级消息是不会处理的。

OnMouseMove鼠标移动消息是属于虚拟,也就是驱动设备产生的消息,如键盘,鼠标等,如果一直有虚拟消息你看下顺序,刷新就不会处理。明白了吧!

建议楼主设个标志吧,然后强制刷新下。

InvalidateRect(hWnd, NULL, FALSE);

Windows API的InvalidateRect(m_hWnd, lpRect, bErase),会向Windows添加一个无效区域,并发送一个WM_PAINT消息要求系统重绘这个无效区域rect,在OnPaint中,系统响应WM_PAINT消息,OnPaint将调用CPaintDC dc(this)以得到绘图设备上下文,CPaintDC::CPaintDC(CWnd* pWnd)是CPaint的构造函数,从其中可以看到系统将调用CDC* ::BeginPaint(m_hWnd = pWnd-m_hWnd, m_ps),其中m_ps是一个LPPAINTSTRUCT结构,它包含有一个rcPaint成员,它代表当前的剪取区域,也就是当前的无效区域,这里它等于InvalidateRect(rect,TRUE)传入的rect矩形区域,此时我们便可以且只能在这个矩形区域内绘图,也就是说如果我们此时绘制的图形超过了这个矩形区域,程序将自动截断超出部分,只在该区域内绘图,可以在InvalidateRect后,或在OnPaint中使用CRect brect;GetUpdateRect(brect)得到这个裁剪区域。也可以通过在OnPaint中得到dc后使用CRect mrect=dc.m_ps.rcPaint得到这个裁剪区域。如果没有显式的声明CPaintDC dc(this),系统将自己生成一个绘图设备上下文,此时也可以使用GetUpdateRect得到裁剪区域,但此时系统没有将我们需要的rect传递给rcPaint,所以此时得到的区域将是整个客户区,所以当在OnPaint中没有CPaintDC dc(this)时,程序将强制重画整个客户区,当有了CPaintDC dc(this)时,由于显式调用了带参数的构造函数,rect将传递给dc,此时强制绘图的区域将是rect。至于InvalidateRect(rect,TRUE)的第二个参数代表是否用背景重画,就是是否用背景颜色画刷填充剪取的无效区域rect,true代表用背景重画,flase代表不用背景重画。所以只要在OnPaint中显式地构造了一个CPaintDC设备上下文,程序就将得知当前的裁剪区域是rect,而如没有显示构造,系统将按默认的绘图方式绘制,此时裁剪区域是整个区域。

2,由此可见,如果想让InvalidateRect发生效果,应该在OnPaint函数中利用CPaintDC dc(this)声明的dc绘图,因为只有这个dc含有无效区域的信息。如果在OnPaint中另外声明的了一个dc(someDCelse),这个dc不是本窗口dc,理论上不会发生作用。但是如果由于InvalidateRect的调用引起本窗口重绘,也会引发OnPaint函数,这时用关联其他设备的dc绘图,会原封执行,从而给人一种被执行了的错觉。

windows编程:关于InvalidateRect的第3个参数问题。

InvalidateRect()的第三个参数是决定是否给程序发送WM_ERASEBKGND消息,为FALSE的话则不发送该消息。如果想改变背景,可以在该消息的处理过程中对背景做一些处理。拿上面的例子来说就是在switc语句中添加一条:"case WM_ERASEBKGND:。。。//处理过程"。

对于上面的程序为什么仍然会擦除背景是因为:InvalidateRect函数会给系统发送WM_PAINT消息,因此在程序中执行到该函数时则给程序发送WM_PAINT消息,即转到WM_PAINT消息处理里面里,然后由fState[x][y]决定是否画叉,具体fState数组刚开始内容应该为0,所以刚开始什么都没有,但当你处理WM_LBUTTONDOWN时静fState[x][y]与1异或了所以变成了1,然后WM_PAINT消息里面的if (fState [x][y]){};这条语句就执行了,也就是画了叉,当再点的时候1与1异或又变成0了,所以又把叉给擦了。

说的有点多啊,可能表述的不太清楚。总的来说就是你每点一次左键都会响应一次WM_PAINT消息,而WM_PAINT的处理函数是把整个窗口分成很多个小方框,用一个数组来决定小方框里面是否画叉,如果数组元素为1则画叉,如果为0则不画。每次处理WM_PAINT消息都要对数组进行遍历一次已决定是否画叉。

因此我感觉InvalidateRect的第三个参数是true还是false跟这个程序没啥关系。

VC写的一个窗口问题InvalidateRect无效

调用Invalidaterec会使整个窗口无效,导致重回

这时需要处理WM_PAINT消息,在这个消息里面进行绘图操作,你把WM_SIZE里面TextOut那一段移动到WM_PAINT里面就可以

invalidaterect的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于invalidaterect闪屏、invalidaterect的信息别忘了在本站进行查找喔。

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~