MFC闪屏 win10闪屏

在为连连看编一个时间条的时候,因为要响应WM_ONTIMER,发现屏幕闪烁得厉害到让人无法忍受的程度,用了双缓存也不行。
而在ATI绘图的时候就没有这种情况。
不晓得为什么,不知道是不是在OnTimer()里用了Invalidate()的缘故。
百度了下解决方案。发现有一个非常之有效。
MFC闪屏 win10闪屏
就 是重载OnEraseBkgnd(CDC *pDC),其功能相当于OnPaint()的自动重绘。但是要加入消息响应ON_WM_ERASEBKGND()。在OnPaint()中,必须自己创建一个DC(如CClientDC)才能调用bitblt()贴图。但是重载OnEraseBkgnd(CDC*pDC)因为传入了pDC,直接用pDC->bitblt()就OK了。很方便哪~
具体方法如下:

1) 在头文件中加个声明afx_msg BOOL OnEraseBkgnd(CDC*pDC);

2)加个ON_WM_ERASEBKGND() 消息响应,方法如下,在源文件中找到//{{AFX_MSG(CLs8_DlgMFCGameDlg),就是系统给你添加其他消息响应的地方。添加ON_WM_ERASEBKGND()

3)把要写在OnPaint()里的东西都挪到OnEraseBkgnd()里面。

哈哈!屏幕不闪了。但是却有令一个问题。发现时间条虽然在减少了,但是响应鼠标的绘图(比如在连连看牌上画方块)却没法长时间显示在屏幕上了。不怕不怕,听说过区域重绘,百度了下,发现用InvalidateRect(),试验了下。于是把OnTimer()里的Invalidate改成了InvalidateRect()。如下:

void CLs8_DlgMFCGameDlg::OnTimer(UINTnIDEvent)
{
// TODO: Add your message handler code here and/or calldefault
timer--;
CRect rect;
rect.SetRect(TIMERPOSX,TIMERPOSY,TIMERPOSX+600,TIMERPOSY+16);
InvalidateRect(rect,TRUE);
CDialog::OnTimer(nIDEvent);
}

运行了下,发现,安拉!!万事大吉!原来说得神乎其神的区域重画这么简单啊。原来是因为在响应鼠标的函数里也有个Invalidate()。这下两个重绘就可以分开了~

  

爱华网本文地址 » http://www.aihuau.com/a/25101011/73287.html

更多阅读

怎样在屏保恢复时设置密码保护 win10 屏保恢复密码

怎样在屏保恢复时设置密码保护——简介如果自己的电脑设置了屏保,一旦离开太久就会进入屏保,如果为了保护电脑就必须设置密码保护。怎样在屏保恢复时设置密码保护——工具/原料电脑怎样在屏保恢复时设置密码保护

电脑桌面一刷新就闪屏的解决办法 win7桌面闪屏怎么解决

  闪屏一般指电脑显示器上的显示问题,电脑在运行过程中,屏幕画面出现闪烁或不规则闪动,有时会出现横条线和竖条线。闪屏和雪花屏主要是显卡的问题造成的,雪花屏类似电视的雪花屏,闪屏就像显卡驱动有问题那样,画面完整,但眼睛看着极为不舒

浏览器蓝屏怎么办 ie闪退打不开网页

浏览器蓝屏怎么办——简介微软发布kb2670838更新补丁后,部分双显卡笔记本(目前发现为载有AMD独显的笔记本)出现了打开浏览器蓝屏的现象,蓝屏代码为:igdpmd64.sys用户打开IE浏览器或为IE内核的浏览器会出现蓝屏现象这篇经验小编为主的

显示器一闪一闪黑屏怎么办 显示器一闪一闪的黑屏

首先从电脑的软件上来解决问题:  1.可能是软件的兼容性问题,鉴于使用者是在玩游戏的时候会频繁出现,所以重点检查游戏软件与显卡驱动是否有不兼容的问题。解决的方法是更新显卡驱动程序。  2.由于使用者是“最近”出现的问题,可以看

CF如何设置全屏? win10如何设置cf全屏

CF如何设置全屏?——简介我们现在的笔记本基本上是16:9的宽屏,在我们玩穿越火线的时候旁边总有两道黑框,游戏不能铺满全屏,现在我们设置游戏全屏CF如何设置全屏?——工具/原料16:9的电脑穿越火线游戏CF如何设置全屏?——方法/步骤CF如何

声明:《MFC闪屏 win10闪屏》为网友视金钱如粪土分享!如侵犯到您的合法权益请联系我们删除