社区
C#
帖子详情
怎么让绘图时候Invalidate屏幕不要出现闪烁?
zyca
2007-09-03 08:39:31
我的程序中有一个功能,是让鼠标拖拽一些物体,这样在MouseMove事件中就得不停Invalidate一块区域,会出现闪烁现象,怎么才能避免这个现象?
...全文
212
3
打赏
收藏
怎么让绘图时候Invalidate屏幕不要出现闪烁?
我的程序中有一个功能,是让鼠标拖拽一些物体,这样在MouseMove事件中就得不停Invalidate一块区域,会出现闪烁现象,怎么才能避免这个现象?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zyca
2007-09-03
打赏
举报
回复
搞定了,原来要自己创建一个MyPanel类继承Panel,用这个来绘图.
public class MyPanel : System.Windows.Forms.Panel
{
public MyPanel()
{
this.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer, true);
this.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, true);
this.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, true);
}
}
zyca
2007-09-03
打赏
举报
回复
加了以后还是闪...我是在Form里的一个Panel上绘图的
sadever
2007-09-03
打赏
举报
回复
VS2005的话,在Form的构造函数里加这个:this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
双缓冲解决VC++
绘图
时
屏幕
闪烁
通常来说程序根据需要调用
Invalid
ate
(FALSE)使窗口客户区无效引起重绘,然后在窗口OnPaint函数(基于文档视图的程序则是OnDraw)中进行稳定
绘图
就行了。但是,我们在OnPaint中进行多重绘制(画背景、棋盘、棋子等),前后绘制的反差造成了
闪烁
现象。以前知道Java中解决
屏幕
闪烁
问题是用双缓冲的方法,现在发现在vc++中也是可以这么做的。简单来说,双缓冲就是先把需要绘制的东西全部一口气画在内存中,最后把内存中的数据搬到
屏幕
上显示。 最近做中国象棋,绘制界面时遇到些问题,
绘图
过程中
屏幕
闪烁
,估计都会想到利用双缓冲来解决问题,但查了下网上双缓冲的资料,发现基本是MFC的,转化为V
Invalid
ate
(TRUE)的闪屏问题
在使用
Invalid
ate
(TRUE)进行窗口重绘时,总是会遇到闪屏的问题。 一开始以为是
绘图
速度过慢照成的,但在对
绘图
时间做了一个测试之后发现,即使整个
绘图
过程只持续了几个毫秒,还是会看见很明显的
闪烁
,所以时间并不是造成
闪烁
的决定性因素。 那到底是什么原因呢?现在来看看
Invalid
ate
(TRUE)都干了些什么。其实,它只是间接向消息队列添加了WM_ERASEBKG
彻底解决MFC画面
闪烁
问题
闪烁
的原因 画面
闪烁
的原因是一方面画面更新的太快,另一方面,采用了
Invalid
ate
(),即先擦除全部图画,再进行绘画,两者结合,导致画面
闪烁
,具体原理是绘画的图像和背景相差较大,即面积较大,颜色相差较大且每帧图像变化不明显,再加上频繁重绘,界面反复的在背景和图画间切换,最后的结果就就是
闪烁
严重。 探索解决办法 网上很多文章提出了双缓冲
绘图
法,这种办法虽然能够一定的缓解
闪烁
,但是还是没有从根本上解决上述问题,
绘图
过快的时候还是可能
出现
闪烁
现象的,如果我们采用不擦除刷新,那么虽然每帧的图像差距不大了,不再闪
解决
绘图
时
闪烁
问题的一点经验
清除
屏幕
闪烁
(转自网上)由于作图过于复杂和频繁,所以时常
出现
闪烁
的情况,一些防止
闪烁
的方法,如下: (1)将
Invalid
ate
()替换为
Invalid
ate
Rect()。
Invalid
ate
()会导致整个窗口的图象重画,需要的时间比较长,而
Invalid
ate
Rect()仅仅重画Rect区域内的内容,所以所需时间会少一些。
不要
为一小块区域的重画就调用
Invalid
ate
(),不愿意自己去计算需要重画的Rect,事实上,如果你确实需要改善
闪烁
的情况,计算一个Rect所用的时间比起重画那些不需要重画的内容所需
MFC中
屏幕
刷新
闪烁
问题解决方法总结
在MFC中经常遇到
屏幕
刷新的问题,下面是几种解决方法。 1,刷新整个程序区域,有明显的
闪烁
情况
Invalid
ate
( TRUE ); Upd
ate
Window(); 2,刷新指定区域,该区域有
闪烁
情况,不过比上一种方法要好多了。
Invalid
ate
Rect( &m_rect, TRUE 0); Upd
ate
Window(); 3,还
C#
110,534
社区成员
642,575
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章