解决MFC绘图过程中的闪烁

合集下载

+MFC+GDI双缓冲避免图形闪烁

+MFC+GDI双缓冲避免图形闪烁

// TODO: Add your specialized creation code here SetTimer(1,10,NULL); return 0; } 利用定时器直接进行 10 毫秒的屏幕刷新,这样效果会出现不停的闪烁的情况. 解决方法利用双缓冲,首先触发 WM_ERASEBKGND,然后修改返回 TRUE; 定义变量: CBitmap *m_pBitmapOldBackground ; CBitmap m_bitmapBackground ; CDC m_dcBackground; //绘制背景 if(m_dcBackground.GetSafeHdc()== NULL|| (m_bitmapBackground.m_h Object == NULL)) {
MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 ^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的 大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也可以用自己应该用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图 MemDC.MoveTo(……); MemDC.LineTo(……);
} 说到这里可能又有人要说了 , 为什么一个简单图形看起来没有复杂图形那么闪呢? 这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉 害一些,但是闪烁频率要低。 那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁 是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间的 差异很小所以看起来不闪 。 如果不信 , 可以在动画的每一帧中间加一张纯白的帧 , 不闪才怪呢。 2、如何避免闪烁 在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉 MFC 提 供的背景绘制过程了。实现的方法很多, * 可以在窗口形成时给窗口的注册类的背景刷付 NULL * 也可以在形成以后修改背景 static CBrush brush(RGB(255,0,0)); SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRU SH)brush); * 要简单也可以重载 OnEraseBkgnd(CDC* pDC)直接返回 TRUE. 这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,变 得一团乱。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有图 形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存 中绘制好 , 然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去 (这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便 用什么反差大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为 内存中最终的图形与屏幕显示图形差别很小 (如果没有运动 , 当然就没有差别) , 这样看起来就不会闪。 3、如何实现双缓冲 首先给出实现的程序,然后再解释,同样是在 OnDraw(CDC *pDC)中: CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备

C#Picturebox控件上画图闪烁问题的解决方案

C#Picturebox控件上画图闪烁问题的解决方案
gg.DrawLine(bi, p1, p2); gg.DrawLine(bi, p2, p3); gg.DrawLine(bi, p3, p4); gg.DrawLine(bi, p4, p1);
} gg.Dispose();
//将要绘制的内容绘制到dc上
g.DrawImage(b, 0, 0); gg.Dispose(); }
Bitmap b = new Bitmap(this.Width, this.Height); Graphics dc = Graphics.FromImage((System.Drawing.Image)b);
//将要绘制的内容绘制到dc上
g.DrawImage(b, 0, 0); dc.Dispose();
Bitmap b = new Bitmap(this.Width, this.Height); Graphics gg = Graphics.FromImage((System.Drawing.Image)b); Pen bi = new Pen(Color.Blue, 2); for (int i = 0; i < 1; i++) {
请求出错错误代码400请尝试刷新页面重试
C#Picturebox控 件 上 画 图 闪 烁 问 题 的 解 决 方 案
引用:
Graphics g = e.Graphics;
//注意,这里千万不可用Graphics g = this.CreateGraphics() 获得绘图变量。否则闪烁将非常厉害。
使用实例:
private void pictureBox1_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;

经验总结之防止窗口闪烁的方法

经验总结之防止窗口闪烁的方法

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(bineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)//处理后的rgn1只包括了Edit框之外的客户区域,这样,Edit将不会被我的背景覆盖而导致重画。

于双缓冲技术的GDI无闪烁绘图

于双缓冲技术的GDI无闪烁绘图
*
Abstract: Graphics flickering is an intractable common problem when programming Windows forms applications by using GDI + . On the basis of profound analysis on the model of form redrawing, the essentials of graphics flickering were explained in this paper. Two flickerfree GDI + drawing methods were proposed based on double buffering built in the . NET framework. To take analog clock as an example, it is shown that these two methods are very easytouse and effective. Key words: double buffering; flickerfree drawing; graphics flickering; GDI + ; . NET framework; analog clock
基于双缓冲技术的 GDI + 无闪烁绘图
江建国 ,温少营,张瑞楠
( 辽宁师范大学 数学学院, 辽宁 大连 116029 ) ( * 通信作者电子邮箱 jjgbox@ sina. com)
*
要: 图形闪烁是使用 GDI + 编写 Windows 窗体应用程序时经 常 遇 到的 一 个 问题。 在 深 入 分析 窗 体重 绘 模型 阐述了图形闪烁的本质原因。利用. NET框架 中 内 置 的 双 缓 冲 技术, 提出了 两 种 GDI + 无 闪烁 绘 图方 法。 以 基础上, 模拟时钟程序为例, 说明了这两种方法都非常简便且有效。 关键词: 双缓冲; 无闪烁绘图; 图形闪烁; GDபைடு நூலகம் + ; . NET框架; 模拟时钟 中图分类号: TP391. 41 文献标志码: A

[C#开发小技巧]解决WinForm控件TabControl闪烁问题

[C#开发小技巧]解决WinForm控件TabControl闪烁问题

[C#开发⼩技巧]解决WinForm控件TabControl闪烁问题在⽤C#开发WinForm程序时,常发现TabControl出现严重的闪烁问题,这主要是由于TabControl控件在实现时会绘制默认的窗⼝背景。

其实以下⼀段简单的代码可以有效的缓解该问题的发⽣。

这就是技巧的作⽤,不需要理解太多的知识,但需要多多积累,就能做到事半功倍的效果。

1using System;2using System.Collections.Generic;3using System.Text;4using System.Windows.Forms;5namespace WfGUI.Forms6{7///<summary>8///不会闪烁的TabContriol9///</summary>10public class NoFlashTabControl : TabControl11 {12///<summary>13///构造函数,设置控件风格14///</summary>15public NewTabControl()16 {17 SetStyle18 ( ControlStyles.AllPaintingInWmPaint //全部在窗⼝绘制消息中绘图19 | ControlStyles.OptimizedDoubleBuffer //使⽤双缓冲20 , true);21 }22///<summary>23///设置控件窗⼝创建参数的扩展风格24///</summary>25protected override CreateParams CreateParams26 {27get28 {29 CreateParams cp = base.CreateParams;30 cp.ExStyle |= 0 x02000000;31return cp;32 }33 }34 }35 }标签: C#, TabControl, WinForm, 控件, 程序开发。

VC窗口闪烁问题的解决

VC窗口闪烁问题的解决

一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。

先来谈谈闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。

一般显卡的刷新周期是1/80秒左右,具体数字可以自己设置的。

这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个刷新周期内完成,那么给人的视觉感受就是,先看到只有背景色的图像,然后看到画上内容的图像,这样就会感觉闪烁了。

解决方法:尽量快的输出图像,使输出在一个刷新周期内完成,如果输出内容很多比较慢,那么采用内存缓冲的方法,先把要输出的内容在内存准备好,然后一次输出到显存。

要知道一次API 调用一般可以在一个刷新周期内完成。

对于GDI,用创建内存DC的方法就可以了原因二:复杂的界面有多层窗口组成,当windows在窗口改变大小的时候是先重画父窗口,然后重画子窗口,子父窗口重画的过程一般无法在一个刷新周期内完成,所以会呈现闪烁。

我们知道父窗口上被子窗口挡住的部分其实没必要重画的解决方法:给窗口加个风格WS_CLIPCHILDREN ,这样父窗口上被子窗口挡住的部分就不会重画了。

如果同级窗口之间有重叠,那么需要再加上WS_CLIPSIBLINGS 风格原因三:有时候需要在窗口上使用一些控件,比如IE,当你的窗口改变大小的时候IE会闪烁,即使你有了WS_CLIPCHILDREN也没用。

原因在于窗口的类风格有CS_HREDRAW 或者CS_VREDRAW,这两个风格表示窗口在宽度或者高度变化的时候重画,但是这样就会引起IE闪烁解决方法:注册窗口类的时候不要使用这两个风格,如果窗口需要在改变大小的时候重画,那么可以在WM_SIZE的时候调用RedrawWindow。

原因四:界面上窗口很多,而且改变大小时很多窗口都要移动和改变大小,如果使用MoveWindow 或者SetWindowPos两个API来改变窗口的大小和位置,由于他们是等待窗口重画完成后才返回,所以过程很慢,这样视觉效果就可能会闪烁。

一种基于自定义剪切区集合的MFC程序GDI绘图优化方法-浙江中控技术股份有限公司

一种基于自定义剪切区集合的MFC程序GDI绘图优化方法-浙江中控技术股份有限公司

一种基于自定义剪切区集合的MFC程序GDI绘图优化方法罗幸明,徐伟强浙江中控技术股份有限公司,浙江杭州,310053摘要:传统MFC程序GDI绘图仅考虑屏幕刷新闪烁的优化,而对于绘图内容本身的优化考虑有限。

常规应用下,GDI绘图本身确实不会成为程序的性能瓶颈,但在高分辨率、复杂画面的绘制显示时,这个问题就不得不考虑了。

通常我们会使用系统剪切区进行优化控制,但是实际应用发现当分辨率或者画面复杂度大于一定程度后,该优化的性能提升有限。

鉴于此,本文提出了一种简单可行的基于自定义剪切区集合判断的MFC程序GDI绘图优化方法,可以有效解决高分辨率、复杂画面的GDI绘图性能问题。

关键词:自定义剪切区、MFC、GDI、绘图One Optimizing Design Based On Custom Clipping Region Sets Of MFC Programs Drawing With GDILuo Xingming,Xu WeiqiangZhejiang SUPCON Co.,Ltd, Hangzhou, Zhejiang, 310053Abstract:When drawing with GDI of traditional MFC programs,the most considering things is the screen flashing problems but not drawing itself.Normally drawing performance will not be the choke point,but it really will be when screen resolution is high enough or graphics is complex enough.It is usual to resolve this problem by using system clipping region,but after some industial practice we found that the benefits from this optimizing is limited.Based on this situation,this paper presents a simple effective and practical optimizing design based on custom clipping region sets which can effectivly improve drawing performance of complex graphics in industrial field. Keyword:Custom Clipping Region Sets, MFC, GDI, Drawing基金项目“石化、轨道交通行业分布式综合监控系统(SCADA)研发及应用示范”资助1.GDI概述GDI(Graphics Device Interface)是Windows操作系统的传统图形子系统,负责与设备无关的图形绘制,Win32 API为应用程序提供了丰富的绘图函数和功能,而MFC又对他们进行了C++类的封装。

双缓冲

双缓冲
三、双缓冲图形刷新技术的原理
双缓冲图形刷新技术顾名思义是采用双缓存实现的。传统的绘图方式实际上是一种单缓冲。在windows中每一种设备都在内存中有一个设备描述表与其对应,这个设备描述表实际上就是一个内存缓冲区。传统的绘图中我们是将图形绘制在设备描述表缓冲区中,然后由gdi自动的将设备描述表中的图像拷贝到显存中进行显示。这样一个自动的拷贝过程屏蔽了传统的绘图方式是单缓冲的实质,使我们感觉到我们是在直接操纵显存一样。双缓冲图形刷新技术在内存中有两片缓存,除了设备描述表以外还有一个需要手动建立的与设备描述表缓冲区(前端缓冲区)相兼容的后备缓冲区。绘图过程中,首先将图形绘制在后备缓冲区中,然后在手动的将后备缓冲区中的图像拷贝到前端缓冲区中,再由gdi自动将前端缓冲区中的图像拷贝到显存完成图形的显示过程。
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);
//将后备缓冲区中的图形拷贝到前端缓冲区
1、编写一个刷新速度很慢的应用程序,可以设计为通过点击鼠标来进行屏幕刷新。通过该试验可以发现即使屏幕的刷新速度很慢,但是在每次刷新的时候仍然存在屏幕的问题,只是闪烁不是很明显。
2、编写一个刷新速度很快的应用程序,并在程序中应用双缓冲图形刷新技术。通过该试验可以发现虽然屏幕刷新速度很快,但是采用了双缓冲图新刷新技术以后,屏幕不存在闪烁。
CBitmap MemBitmap;
//建立与屏幕设备描述表(前端缓冲区)兼容的内存设备描述表句柄(后备缓冲区)

VC实现波形不闪烁动态绘图

VC实现波形不闪烁动态绘图

::首页>> 文档中心>> 在线杂志>> 位图与调色板[ 在线杂志第32期][ 原创文档本文适合中级读者已阅读9601次]VC实现波形不闪烁动态绘图作者:重庆大学通信工程学院吴华下载源代码一、程序运行时波形效果二、在信号处理中,通常需要把采集信号的实时波形显示出来。

如果直接在屏幕上动态绘图的话,会出现闪烁现象,为了克服这个问题,本文采用的就是先在内存绘图,然后再拷贝到屏幕,从而实现动态绘图而不闪烁。

详细介绍如下:2.1首先在头文件中定义以下私有变量,并在对话框资源中放置一个picture控件private:CDC *pDC; //屏幕绘图设备CDC memDC; //内存绘图设备int m_High; //绘图起点int m_Low; //绘图终点int m_lCount[1024]; //数据存储数组int m_now; //记录波形当前点2.2在实现文件中初始化变量,并设置定时器BOOL CDrawTest::OnInitDialog()?{CDialog::OnInitDialog();// TODO: Add extra initialization herem_Low = 0;m_High = 1024;m_now =0;SetTimer(1,100,NULL);return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}2.3在定时器里创建内存绘图设备,并调用绘图函数在内存设备中绘图,绘图完毕后把内存设备中图拷贝到屏幕void CDrawTest::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCRect rect;// 获取绘制坐标的文本框CWnd* pWnd = GetDlgItem(IDC_COORD);//获得对话框上的picture的窗口句柄pWnd->GetClientRect(&rect);// 指针pDC = pWnd->GetDC();pWnd->Invalidate();pWnd->UpdateWindow();//内存绘图CBitmap memBitmap;CBitmap* pOldBmp = NULL;//创建内存绘图设备memDC.CreateCompatibleDC(pDC);memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);pOldBmp = memDC.SelectObject(&memBitmap);memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);//自定义绘图函数,详细见源程序DrawWave(&memDC);//把内存绘图拷贝到屏幕pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);memDC.SelectObject(pOldBmp);memDC.DeleteDC();memBitmap.DeleteObject();CDialog::OnTimer(nIDEvent);}最新评论[发表评论][文章投稿]查看所有评论推荐给好友打印我是作者,感谢大家的宝贵意见,尤其感谢successq!我现在一边攻读硕士,一边在公司兼职做课题,比较忙,但我会尽快抽时间添加打印功能和实现任意地方绘制!封装成一个MFC扩展类! ( superlamster 发表于2005-2-7 18:48:00)文章写的很好,很实用。

ondraw函数的运用

ondraw函数的运用
OnDraw中可以绘制用户区域。OnPaint中只是当窗口无效时重绘不会保留CClientDC绘制的内容。
这两个函数有区别也有联系:
1、区别:OnDraw是一个纯虚函数,定义为virtual void OnDraw( CDC* pDC ) = 0;而OnPaint是一个消息响应函数,它响应了WM_PANIT消息,也是是窗口重绘消息。
如下所示
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
以上本來是會呼叫CDialog::OnEraseBkgnd()但是如果我們不呼叫的話
程式便不會畫上灰色的底色了
Q:基于对话框的程序中如何重载OnEraseBkGnd()函数
A:这是一个消息WM_ERASEBKWND
{
CMyDoc* pDoc = GetDocument();
CString s = pDoc->GetData();
GetClientRect( &rect ); // Returns a CString CRect rect;
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
都挺简单的.
在MFC中任何一個window元件的繪圖都是放在這兩個member function中
在設定上OnEraseBkgnd()是用來畫底圖的而OnPaint()是用來畫主要物件的
舉例說明一個按鈕是灰色的上面還有文字
則OnEraseBkgnd()所做的事就是把按鈕畫成灰色
而OnPaint()所做的事就是畫上文字
1)在mfc结构里OnPaint是CWnd的成员函数. OnDraw是CView的成员函数.

SWT中消除重绘闪烁问题

SWT中消除重绘闪烁问题

在使用SWT 进行绘图时,我们经常会用到画布(org.eclipse.swt.Canvas) 。

开发者既可以通过类Canvas 来进行绘图,也可以通过它来自定义一个特制的Control 。

画布默认的行为是在其更新自己之前,首先填充整个绘图区域的背景色,而这可能导致用户在原背景和将要填充的背景之间看到闪烁。

其中一种解决方法是让画布的样式设成SWT.NO_BACKGROUND,但是此时我们需要负责整个图形的绘制。

另外一种情况时,当我们变化其大小时,这也会触发重画事件。

特定情况下可以设定SWT.NO_REDRAW_RESIZE 样式来减少闪烁(例如仅仅缩小),但是并不是每一种情况下都适用。

如何解决这些现象呢?目前流行的方法是采取双缓冲区或者多缓冲区的方法。

导致闪烁的原因是画布首先绘制其背景色,然后才绘制其他内容。

双缓冲区的其中一种实现机制就是首先把背景色和其他内容保存在一幅图形当中,当收到重新绘图的时候,将整个图形设置到需要重画的区域,这样来达到消除闪烁的目的。

还有一种更简单的方法,Eclipse 3.1 Release 之后,SWT 提供了样式SWT.DOUBLE_BUFFERED,开发者是需要设置此样式就可以轻松的使用双缓冲区。

(推荐使用)
canvas = new Canvas(shell, SWT.NO_BACKGROUND | SWT.DOUBLE_BUFFERED);。

[转载]MFC绘制动态曲线,用双缓冲绘图技术防闪烁

[转载]MFC绘制动态曲线,用双缓冲绘图技术防闪烁

[转载]MFC绘制动态曲线,⽤双缓冲绘图技术防闪烁先上效果图随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新。

⼀、如何绘制动态曲线 所谓动画,都是⼀帧⼀帧的图像连续呈现在⽤户⾯前形成的。

所以如果你掌握了如何绘制静态曲线,那么学会绘制动态曲线也不远啦,只需要创建⼀个定时器(⽐如调⽤MFC中的SetTimmer函数),每隔⼀定时间(⽐如1ms),调⽤OnPaint或者OnDraw函数,绘制当前帧图像即可。

这⾥需要注意的是,绘制图像的代码需要写在OnPaint或者OnDraw函数中,因为当窗⼝失效(⽐如最⼩化)恢复后,会重新绘制当前窗⼝,窗⼝之前的⾃绘图像会丢失。

⽽把绘图代码写在OnPaint或者OnDraw中就是为了让窗⼝每次重绘时也能重绘你⾃⼰画的图像,避免出现窗⼝最⼩化再恢复后,⾃⼰画的图像丢失的尴尬情况。

另外绘制当前帧图像之前,记得⽤InvalidateRect函数清除上⼀帧图像,不然各帧图像会背景的堆叠。

⽐如我想清除窗⼝中(0,0)和(100,100)这两点确定的矩形中的图像,代码如下:CRect Rect;Rect.top = 0;Rect.left = 0;Rect.bottom = 100;Rect.right = 100;InvalidateRect(Rect); 根据上⾯的思路,我们每隔⼀定时间绘制⼀幅图像,可是如果每次绘制的图像都是完全相同的,那么图像看起来也是静态的。

如何让曲线动起来呢?我们需要为⾃⼰绘图的代码设计⼀个输⼊,即在当前时刻曲线上各个点的坐标信息。

随着时间的推移,令曲线上各个点的坐标随之变化,这样每次绘图都是基于当前时刻的曲线坐标绘制的,控制好曲线坐标的变化,也就能让你绘制的曲线乖乖的动起来。

上⾯提到了曲线上各个点的坐标信息,这个信息可以⽤多种数据结构储存,不过笔者推荐使⽤STL中的deque数据结构储存。

为什么呢?需求决定选择。

让我们先想想在绘制图像的过程中需要对这个数据进⾏哪些操作。

clistctrl excludecliprect闪烁 -回复

clistctrl excludecliprect闪烁 -回复

clistctrl excludecliprect闪烁-回复clistctrl 是一个MFC(Microsoft Foundation Classes)类库中的控件,用于实现列表控件。

而excludecliprect 是clistctrl 的一个函数,用于设置列表控件中不绘制的矩形区域,以减少闪烁。

本文将以这个主题为中心,逐步解释闪烁问题以及如何使用excludecliprect 解决闪烁问题。

第一部分:闪烁问题的原因和影响(300-400字)闪烁是指在图形界面中,由于快速的更新过程或者不适当的绘制方式而导致显示出现明显的闪烁感觉。

对于用户来说,闪烁会影响视觉体验,使界面看起来不够流畅,甚至可能对用户的操作造成困扰和不适。

在控件编程中,闪烁是一个常见的问题,特别是在列表控件中。

在MFC 框架中,列表控件是一个重要的界面元素,常用于显示大量的数据,如文件列表、表格等。

列表控件的界面更新通常需要频繁地重新绘制整个控件或其部分区域,这就增加了闪烁的可能性。

当控件中的数据改变时,由于控件的刷新方式不当,或者控件的绘制过程非常耗时,就会出现明显的界面闪烁问题。

闪烁会对用户产生不良的视觉影响,导致用户感到界面不稳定,视觉疲劳,甚至影响工作效率。

解决闪烁问题对于提高用户体验、提升软件品质非常重要。

第二部分:控件绘制原理和闪烁出现的原因(500-700字)要理解如何解决闪烁问题,首先需要了解列表控件的绘制原理以及闪烁问题产生的原因。

在MFC 框架中,控件的绘制过程是通过重写OnPaint 函数来实现的。

当需要更新控件的视图时,MFC 框架会自动调用OnPaint 函数进行绘制。

然而,在绘制过程中,如果不适当地更新控件的绘制区域,或者绘制的过程中没有合理地利用绘图技巧,就容易引起闪烁问题。

闪烁问题通常是由于重绘过程中的两次绘制间产生的。

在进行控件重绘时,往往是先擦除原来的绘制内容(用背景色填充),然后再绘制新的内容。

双缓存实验报告

双缓存实验报告

一、实验目的1. 理解双缓存技术的原理和作用;2. 掌握双缓存技术的实现方法;3. 分析双缓存技术在实际应用中的优缺点;4. 通过实验验证双缓存技术在实际绘图过程中的效果。

二、实验仪器1. PC机一台;2. 编程软件(如Visual Studio等);3. 调试工具(如Debug等)。

三、实验步骤1. 创建实验环境:打开Visual Studio,创建一个新的MFC项目。

2. 实现双缓存原理:(1)在MFC项目中,找到CMainFrame类,并添加一个成员变量,用于存储内存设备上下文(HDC)。

(2)在CMainFrame类的构造函数中,创建内存设备上下文。

(3)在CMainFrame类的析构函数中,释放内存设备上下文。

(4)在绘图函数中,使用内存设备上下文进行绘图。

3. 实现双缓存绘图:(1)在MFC项目中,找到CMainFrame类,添加一个成员变量,用于存储屏幕设备上下文(HDC)。

(2)在CMainFrame类的析构函数中,释放屏幕设备上下文。

(3)在绘图函数中,使用屏幕设备上下文进行绘图。

4. 实现滚动条:(1)在MFC项目中,找到CMainFrame类,添加一个成员变量,用于存储滚动条句柄(HWND)。

(2)在CMainFrame类的构造函数中,创建滚动条。

(3)在CMainFrame类的析构函数中,销毁滚动条。

(4)编写滚动条消息处理函数,用于处理滚动条事件。

5. 实现视口转换:(1)在MFC项目中,找到CMainFrame类,添加一个成员变量,用于存储视口转换矩阵。

(2)在绘图函数中,使用视口转换矩阵进行绘图。

6. 编写测试程序:(1)在MFC项目中,创建一个窗口类,继承自CMainFrame。

(2)在窗口类中,实现双缓存、滚动条、视口转换等功能。

(3)运行程序,观察绘图效果。

四、实验结论1. 双缓存技术可以有效地解决绘图过程中的闪烁问题,提高绘图效率。

2. 在实际应用中,双缓存技术可以实现平滑的滚动条、鼠标拖动等操作。

电脑中画面闪烁的原因及解决方法

电脑中画面闪烁的原因及解决方法

电脑中画面闪烁的原因及解决方法如下是关于电脑中画面闪烁的原因及解决方法的文章:电脑中画面闪烁的原因及解决方法电脑是现代生活中不可或缺的工具,我们在日常工作和娱乐中都会使用到它。

然而,有时我们可能会遇到电脑中画面闪烁的问题,这不仅会影响我们的使用体验,还可能对我们的眼睛健康造成不良影响。

本文将探讨电脑中画面闪烁的原因以及解决方法。

一、原因分析1. 显示器问题:首先,问题可能出在显示器上。

显示器的老化、屏幕材质不良、亮度调节不当等因素都可能导致画面闪烁。

2. 显卡故障:显卡是电脑输出图像信号的重要组件。

如果显卡出现故障,也会导致画面闪烁。

3. 驱动问题:电脑的显示器驱动程序负责控制显示器的输出,如果驱动程序损坏或不兼容,也会引起画面闪烁。

4. 电源问题:电脑的电源问题也可能导致画面闪烁。

电源稳定性差、电压不稳定等情况都会对显示效果产生影响。

5. 病毒感染:某些病毒恶意攻击电脑系统,可能导致画面闪烁以及其他各种问题。

二、解决方法1. 更换显示器:如果显示器老化或损坏,建议及时更换新的显示器。

在选择新显示器时,要注意品牌信誉和性能,以确保画面质量和稳定性。

2. 调整亮度和分辨率:如果画面闪烁是因为亮度过高或分辨率不适宜,可以尝试适当调整亮度和分辨率的设置。

最好选择适合自己眼睛舒适的亮度和分辨率。

3. 更新驱动程序:如果发现画面闪烁是由于显示器驱动程序问题引起的,可以尝试更新驱动程序。

可以通过官方网站或驱动程序更新工具获取最新的驱动程序版本。

4. 检查显卡:若怀疑是显卡故障引起的画面闪烁,可以检查显卡是否连接良好,或者考虑更换新的显卡。

5. 定期清理电脑:保持电脑内部清洁,定期清理尘埃和杂物,可以减少电脑硬件故障的可能性。

6. 安装杀毒软件:为了防止病毒感染导致画面闪烁等问题,建议安装可靠的杀毒软件,并定期更新病毒库。

7. 稳定电源供应:使用稳定的电源供应器,以避免画面闪烁问题。

在选购电源时,应选择品牌优良的产品,并注意电源功率是否满足电脑硬件需求。

解决显示器闪烁和色彩不准问题的技巧

解决显示器闪烁和色彩不准问题的技巧

解决显示器闪烁和色彩不准问题的技巧如果你在使用电脑的过程中遇到显示器闪烁或色彩不准的问题,不用担心!这些问题是常见的,并且有一些简单的技巧可以帮助你解决。

在本文中,我们将介绍几种解决显示器闪烁和色彩不准问题的方法,让你的电脑使用体验更加顺畅。

1.调整刷新率和分辨率你可以尝试调整显示器的刷新率和分辨率。

刷新率表示显示器每秒刷新像素的次数,而分辨率则指显示器的像素密度。

如果刷新率设置得过低或分辨率过高,可能会导致显示器闪烁或色彩不准。

你可以在电脑的设置菜单中找到这些选项,根据你的需求进行调整。

2.检查电源连接显示器闪烁或色彩不准问题可能与电源连接有关。

确保显示器的电源线和视频线牢固连接,并且没有松动或接触不良。

如果发现有任何问题,可以尝试重新连接或更换线缆,看看是否能解决问题。

3.检查驱动程序显示器闪烁或色彩不准问题还可能与显示器的驱动程序有关。

确保你的电脑中安装了最新版本的显示器驱动程序。

你可以访问显示器生产商的官方网站,下载并安装最新的驱动程序。

还可以尝试更新显卡驱动程序,因为显卡与显示器之间的通信也可能影响显示效果。

4.调整显示器的亮度和对比度如果显示器的亮度过高或对比度设置不当,可能会导致闪烁和色彩不准。

通过菜单按钮或电脑设置界面,你可以调整显示器的亮度和对比度,让其适应你的使用环境和个人喜好。

5.检查磁场干扰磁场干扰也是导致显示器闪烁和色彩不准的常见原因之一。

你可以将显示器远离电视、音响、电磁炉等可能产生磁场干扰的电子设备,或者使用磁场屏蔽罩来降低干扰。

6.定期清洁显示器表面显示器表面上的灰尘、污渍等也可能影响显示效果。

定期清洁显示器表面可以帮助消除这些问题,并保持画面清晰。

使用柔软的布料和专门的清洁剂,避免使用含酒精或化学气味的清洁剂,以免损坏显示器。

以上是几种解决显示器闪烁和色彩不准问题的技巧。

当然,每个人的情况可能不同,可能需要尝试多种方法才能找到最适合自己的解决方案。

如果以上方法都无效,建议联系专业的技术支持人员,他们会给予更进一步的帮助。

C#自定义控件-消除闪烁

C#自定义控件-消除闪烁
一个打开双缓冲。这个功能是Control类提供的,自定义控件都是直接或间接继承Control类,所以直接使用此功能是很方便的。在自定义控件的构造函数内增加下列代码即可。
view plaincopy to clipboardprint?01.this.SetStyle(erPaint, true);
这个方法虽然方便,但是不能使我们明白其工作原理。
另一个方法就是自己实现双缓冲。
首先定义一个私有变量Bitmap _backBuffer,此变量初始化成自定义控件的大小,并用此位图生成一个绘图表面g,先讲控件绘制到g上,最后将位图_backBuffer一次绘制到e.Graphics绘图表面,也就是屏幕上。示例代码如下:
view plaincopy to clipboardprint?01.if (_backBuffer == null)
02.{
03. _backBuffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
04.}
05.Graphics g = Graphics.FromImage(_backBuffer);
06.OwnerDraw(g);
07.g.Dispose();
08.pe.Graphics.DrawImageUnscaled(_backBuffer, 0, 0);
Байду номын сангаасC#自定义控件-消除闪烁
开始学习制作自定义控件的时候,自定义控件在重绘时总是发生闪烁。这是因为直接向屏幕绘图导致的。自己绘制控件的外观首先要重载OnPaint事件处理函数,该函数的一个简单示例如下:
view plaincopy to clipboardprint?01.protected override void OnPaint(PaintEventArgs pe)

解决MFC绘图过程中的闪烁

解决MFC绘图过程中的闪烁

如何解决绘图过程中的闪烁在VC中进行绘图过程处理时,如果图形刷新很快,经常出现图形闪烁的现象。

利用先在内存绘制,然后拷贝到屏幕的办法可以消除屏幕闪烁,具体的方法是先在内存中创建一个与设备兼容的内存设备上下文,也就是开辟一快内存区来作为显示区域,然后在这个内存区进行绘制图形。

在绘制完成后利用BitBlt函数把内存的图形直接拷贝到屏幕上即可。

具体的代码实现为:(1)创建内存区域CDC* pMem=new CDC;CBitmap* pBmp=new CBitmap;CBitmap* pOldBmp;CDC* pDC=GetDC();CRect rectTemp;为绘图区域pMem->CreateCompatibleDC(pDC);pBmp->CreateCompatibleBitmap(pDC, rectTemp.Width(), rectTemp.Height());pOldBmp=pMem->SelectObject(pBmp);(2)进行图形绘制pMem->LineTo(...); 进行绘图处理(3)拷贝到屏幕pDC->BitBlt(rectTemp.left,rectTemp.top,rectTemp.Width(),rectTemp.Height(),pMem,0,0,SRCCO PY);pMem->SelectObject(pOldBmp);pBmp->DeleteObject() ;pMem->DeleteDC();====================================================================== ==========================双缓存机制解决VC++绘图时的闪烁问题显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。

而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。

C++中MFC画图

C++中MFC画图

MFC双缓存画图在使用MFC画图时,使用Invalidate()函数重画客户区,尤其是使用频繁的时候,我们可以感觉到整个客户区在不停地闪烁,导致我们的界面的效果特别差,那么怎样能防止这一现象发生呢?我们可以有以下几种方法:∙局部重画:就是说,客户区画图时,我们把刚刚的有过改动的区域确定,然后只改变这一小区域,而不是把整个客户区重画。

不过这样做还是不能彻底解决闪烁的现象。

因为重画的局部还是会闪烁。

∙异或画图:学计算机的人都知道,异或逻辑是相同为0,相异1。

异或画图就是利用这一特性,在原来的图形的基础上重新再画一次,与前一次的处处都相同,这种方法相当于擦除了原来的图形,然后再画自己想要的图形。

我个人觉得这个技术在画类似橡皮筋等东西时很有用。

∙双缓存画图:下面我们重点讲解这种技术。

MFC画图的闪烁原因不在于在屏幕上把图像画出来,而在于怎么去画。

也就是说,如果原来有这么一张已经画好的图,而要计算机把这张图片画出来,这就不会有闪烁现象发生了。

双缓存技术利用的就是这个原理。

双缓存主要就是在内存中间重新开辟一个空间,在内存中先把要画的图该怎么画先画出来,而屏幕上的东西暂时不去动它,待图像在内存中画好之后,把画好的图像直接拷贝到屏幕上去,这样就几乎不需要时间去计算,也就不会有闪烁的现象发生。

具体框架代码如下:BOOL CDataStructureView::OnEraseBkgnd(CDC* pDC){CRectrc;CDC dcMem;GetClientRect(&rc);CBitmap bmp; //内存中承载临时图象的位图dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DCbmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());//创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)CBitmap *pOldBit=dcMem.SelectObject(&bmp);dcMem.FillSolidRect(rc,RGB(255,255,255));//按原来背景填充客户区,不然会是黑色//画图,添加你要画图的代码,不过用dcMem画,而不是pDC;......pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台//绘图完成后的清理dcMem.DeleteDC(); //删除DCbmp.DeleteObject(); //删除位图return true;//这里一定要用return true,如果用自动生成的,会调用基类,把画出来的覆盖,就什么结果也没有了}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何解决绘图过程中的闪烁在VC中进行绘图过程处理时,如果图形刷新很快,经常出现图形闪烁的现象。

利用先在内存绘制,然后拷贝到屏幕的办法可以消除屏幕闪烁,具体的方法是先在内存中创建一个与设备兼容的内存设备上下文,也就是开辟一快内存区来作为显示区域,然后在这个内存区进行绘制图形。

在绘制完成后利用BitBlt函数把内存的图形直接拷贝到屏幕上即可。

具体的代码实现为:(1)创建内存区域CDC* pMem=new CDC;CBitmap* pBmp=new CBitmap;CBitmap* pOldBmp;CDC* pDC=GetDC();CRect rectTemp;为绘图区域pMem->CreateCompatibleDC(pDC);pBmp->CreateCompatibleBitmap(pDC, rectTemp.Width(), rectTemp.Height());pOldBmp=pMem->SelectObject(pBmp);(2)进行图形绘制pMem->LineTo(...); 进行绘图处理(3)拷贝到屏幕pDC->BitBlt(rectTemp.left,rectTemp.top,rectTemp.Width(),rectTemp.Height(),pMem,0,0,SRCCO PY);pMem->SelectObject(pOldBmp);pBmp->DeleteObject() ;pMem->DeleteDC();====================================================================== ==========================双缓存机制解决VC++绘图时的闪烁问题显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。

而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。

MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。

我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点。

1、显示的图形为什么会闪烁?我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。

当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。

如果将背景刷设置成NULL,这样无论怎样重绘图形都不会闪了。

当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了新的图形。

有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。

例如在OnDraw(CDC *pDC)中这样写:pDC->MoveTo(0,0);pDC->LineTo(100,100);这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见闪烁。

其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。

比如:清楚屏幕时间为1s绘图时间也是为1s,这样在10s内的连续重画中就要闪烁5次;如果清楚屏幕时间为1s不变,而绘图时间为9s,这样10s内的连续重画只会闪烁一次。

这个也可以试验,在OnDraw(CDC *pDC)中这样写:for(int i=0;i<100000;i++){pDC->MoveTo(0,i);pDC->LineTo(1000,i);}呵呵,程序有点变态,但是能说明问题。

说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉害一些,但是闪烁频率要低。

那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。

因为动画的连续两个帧之间的差异很小所以看起来不闪。

如果不信,可以在动画的每一帧中间加一张纯白的帧,不闪才怪呢。

2、如何避免闪烁在知道图形显示闪烁的原因之后,对症下药就好办了。

首先当然是去掉MFC提供的背景绘制过程了。

实现的方法很多,* 可以在窗口形成时给窗口的注册类的背景刷付NULL* 也可以在形成以后修改背景static CBrush brush(RGB(255,0,0));SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);* 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,变得一团乱。

怎么办?这就要用到双缓存的方法了。

双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制。

我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。

这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。

当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。

3、如何实现双缓冲首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:CDC MemDC; //首先定义一个显示设备对象CBitmap MemBitmap;//定义一个位图对象//随后建立与屏幕显示兼容的内存显示设备MemDC.CreateCompatibleDC(NULL);//这时还不能绘图,因为没有地方画 ^_^//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);//将位图选入到内存显示设备中//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);//先用背景色将位图清除干净,这里我用的是白色作为背景//你也可以用自己应该用的颜色MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));//绘图MemDC.MoveTo(……);MemDC.LineTo(……);//将内存中的图拷贝到屏幕上进行显示pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//绘图完成后的清理MemBitmap.DeleteObject();MemDC.DeleteDC();上面的注释应该很详尽了,废话就不多说了。

4、如何提高绘图的效率我主要做的是电力系统的网络图形的CAD软件,在一个窗口中往往要显示成千上万个电力元件,而每个元件又是由点、线、圆等基本图形构成。

如果真要在一次重绘过程重画这么多元件,可想而知这个过程是非常漫长的。

如果加上了图形的浏览功能,鼠标拖动图形滚动时需要进行大量的重绘,速度会慢得让用户将无法忍受。

怎么办?只有再研究研究MFC 的绘图过程了。

实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。

裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。

因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是pDC 中的裁剪区了。

因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。

但是这个裁剪区是MFC设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。

可以先用 pDC->GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。

如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。

====================================================================== ================================================================================================= =================================================VC++大数据量绘图时无闪烁刷屏技术实现引言当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过程序主动地刷新用户区,强制Windows发送一条WM_PAINT消息,这将引发视类OnDraw函数简单地将所有的图形对象重画,这样才完成了图形的显示工作,但在刷新的同时会引起较明显的闪烁尤其是当画面面积较大、图像元素过多时尤为明显甚至达到无法正常工作的地步。

因此,我们需要做相应的处理。

本文介绍了采用先在内存中绘制图形,然后再把绘好的图形以位图方式从内存拷贝到窗口客户的消除刷屏闪烁的一种方法。

WM_PAINT消息和无效区·在用户移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。

·用户改变窗口的大小。

·滚动窗口用户区。

·程序调用InvalidateRect或InvalidateRgn函数显式地发送一条WM_PAINT消息。

当上面情况之一发生时,就要求应用程序一定刷新其用户区的一部分或全部,Windows会向窗口函数发送一条WM_PAINT消息。

另外,当 Windows删除覆盖窗口部分区域的对话框或消息框时和菜单下拉出来又被释放时窗口用户区被临时覆盖,系统会试图保存显示区域,但是不一定能成功,可能向窗口函数发送一条WM_PAINT消息,要求应用程序刷新其用户区。

需要说明的是:光标或图符穿过窗口用户区时,也可能覆盖显示内容,但这种情况下,系统一定能保留并恢复被覆盖的区域,所以此时并不会发送WM_PAINT消息来要求应用程序去刷新其显示区。

相关文档
最新文档