vc中关于屏幕闪烁问题解决的小结

也许我们都碰到过这种情况,当你想重画某个窗口的时候,或你需要每隔一段时间要进行重画窗口,窗口会不停的闪烁。那么如何消除闪烁呢?借鉴了别人的经验,自己也总结一下,现将总结的几种方法介绍一下,供大家参考。
1、将Invalidate()替换为InvalidateRect()。

   因为Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所需时间会少一些。所以替换之后在很大程度上会减少闪烁。如果你确实需要改善闪烁的情况,计算一个Rect所用的时间比起重画那些不需要重画的内容所需要的时间要少得多。

2、不要让系统擦除你的窗口。

   系统在需要重画窗口的时候会帮你用指定的背景色来擦除窗口。可是,也许需要重画的区域也许非常小。或者,在你重画这些东西之间还要经过大量的计算才能开始。这个时候你可以禁止系统擦掉原来的图象。直到你已经计算好了所有的数据,自己把那些需要擦掉的部分用背景色覆盖掉(如:dc.FillRect(rect,&brush);rect是需要擦除的区域,brush是带背景色的刷子),再画上新的图形。要禁止系统擦除你的窗口,可以重载OnEraseBkgnd()函数,让其直接返回TRUE就可以了。
如BOOL CMyWin::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
//return CWnd::OnEraseBkgnd(pDC);//把系统原来的这条语句注释掉。
}

3、有效的进行擦除。
   擦除背景的时候,不要该擦不该擦的地方都擦。比如,你在一个窗口上放了一个很大的Edit框,几乎占了整个窗口,那么你频繁的擦除整个窗口背景将导致Edit不停重画形成剧烈的闪烁。事实上你可以CRgn创建一个需要擦除的区域,只擦除这一部分。如
GetClientRect(rectClient);
rgn1.CreateRectRgnIndirect(rectClient);
rgn2.CreateRectRgnIndirect(m_rectEdit);
if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)//处理后的rgn1只包括了Edit框之外的客户区域,这样,Edit将不会被我的背景覆盖而导致重画。

{
ASSERT(FALSE);
return ;
}
brush.CreateSolidBrush(m_clrBackgnd);
pDC->FillRgn(&rgn1,&brush);
brush.DeleteObject();

   注意:在使用这个方法的时候要同时使用方法二。

4、使用MemoryDC先在内存里把图画好,再复制到屏幕上。

   这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快,而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东东从左画到右的情况。

void CMyWin::OnPaint()
{
CPaintDC dc1(this); // device context for painting
dcMemory.CreateCompatibleDC(&dc1);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height());
dcMemory.SelectObject(&bmp);

//接下来你想怎么画就怎么画吧。
//dcMemory.FillRect(rectClient,&brush);

dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY);
dcMemory.DeleteDC();
// Do not call CWnd::OnPaint() for painting messages
}

时间: 2024-08-03 22:08:01

vc中关于屏幕闪烁问题解决的小结的相关文章

双缓冲解决VC++绘图时屏幕闪烁_C 语言

通常来说程序根据需要调用Invalidate(FALSE)使窗口客户区无效引起重绘,然后在窗口OnPaint函数(基于文档视图的程序则是OnDraw)中进行稳定绘图就行了.但是,我们在OnPaint中进行多重绘制(画背景.棋盘.棋子等),前后绘制的反差造成了闪烁现象.以前知道Java中解决屏幕闪烁问题是用双缓冲的方法,现在发现在vc++中也是可以这么做的.简单来说,双缓冲就是先把需要绘制的东西全部一口气画在内存中,最后把内存中的数据搬到屏幕上显示. 最近做中国象棋,绘制界面时遇到些问题,绘图过程

一些C语言中字符串的算法问题解决实例小结_C 语言

    字符串问题是面试中经常出现的问题,这类问题有很多,难以不一.下面是几道字符串的题目,网上都能找到解答,自己实现了一下,供网友参考.感觉算法重要的是要有正确的思路,实现起来不是问题.自己一定要多思考,这样收获可能会更多一点.         问题1:找两个字符串的最长公共子串.         具体描述,如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串.注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中.请编写一个函数,输入两个字

vc中播放mp3文件的方法小结

一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1.      使用mci   #include <windows.h> #include <stdio.h> #include <mmsystem.h> #include <shellapi.h> #include <AFXCOM_.H>   #pragma comment(lib,"winmm.lib"

vc双画布消除屏幕闪烁

在vc中贴图时,直接贴图到屏幕的CDC,会因为图面贴入的时间不同而造成屏幕的闪烁.解决这个问题的办法是先把图面画到内存画布上,在一次画到屏幕,内存映射到屏幕很快,所以不会造成闪烁. CDC m_dcMem; //创建内存画布 CBitmap m_bmpMemDC; //创建内存画布的 //初始化内存画布 CDC* pDC = GetDC(); if(pDC->GetSafeHdc()) { if(!m_dcMem.CreateCompatibleDC(pDC)) { ReleaseDC(pDC)

mfc中如何解决屏幕闪烁

问题描述 mfc中如何解决屏幕闪烁 void CTestView::OnDraw(CDC* pDC) { CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rect; GetClientRect(&rect);//获取客户区大小 //画背景 棋盘等 static bool i=0; if(!i) { bmpbegin.LoadBitmap(ID

VC中基于Windows的精确定时

在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精确定时操作. 众所周知,Windows 是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的. 这样就带来了一些问题,如一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列 中的消息就暂时被挂起,得不到实时处理.因此,不能简单地通过Windows消息引发一个对定时要求

VC++中的一个不足及其改善方法

使用C语言编程序,有时需要把一种数值(如float类型的数值)转换成另一种类型(如int类型)的数值使用,这时,我们就要用到类型强制转换运算符,如(int).(float)等.但是在VC++中,当把一个float类型的数值转换成int类型时,有时会出现比较大的误差.我在工作过程中就碰到过,当我把一个值为1140.00的float型变量ftemp使用如下方法转换成int类型, itemp=(int)ftemp; 这时,int型变量itemp的值为1139,误差1(在本文中,我称这种误差为"1误差&

如何在VC中显示动态的GIF

如果是使用VB,也许这个话题是多余的,因为VB有一个图象控件可以非常容易地实现各种格式的图象显示功能,然而对于VC却没有一个象样的控件可以达到这种效果,怎么办?经过一段日子的研究,发现只需要实现两步工作,就可以在VC中实现如同VB中一样的gif动态效果. 本文将介绍的两部分是IPicture接口的使用和gif的储存格式,好象一听到储存格式,读者就不想再看下去了!其实不然,这里只须用到其最基本的一部分,请读者耐心地往下看. 一.IPicture接口 IPicture接口是一个com类,其成员函数可

电脑屏幕闪烁怎么办

开机却出现电脑屏幕闪烁,电脑屏幕抖动!看屏幕上的字很费眼,小编把会导致电脑屏幕闪烁,电脑屏幕抖动的原因也总结下. 电脑屏幕闪烁怎么办?出现这种情况,常见的有四类原因: 1接触不良和信号干扰类; 2屏幕刷新频率太低和显卡驱动; 3劣质电源; 4硬件问题.电脑屏幕下方闪烁.黑屏.电脑屏幕抖动,除了会让你感觉眼睛很快就疲劳,时间长了会给使用者带来眼疾以外.如果不及时解决会对你的系统造成损坏,因为可能是系统本身隐藏的问题反映在屏幕抖动的现象上.其实有很多原因可以导致屏幕出现抖动的现象,实际上解决起来也不