mfc对话框子控件闪烁的问题,请教一下各位。
有一个对话框A,对话框上有一个子控件B。对话框A不需要显示什么东西,所以只要刷刷背景就好了。子控件B要显示的内容比较复杂,而且跟对话框背景差异比较大。于是每次缩放对话框时...
有一个对话框A,对话框上有一个子控件B。
对话框A不需要显示什么东西,所以只要刷刷背景就好了。
子控件B要显示的内容比较复杂,而且跟对话框背景差异比较大。
于是每次缩放对话框时窗口闪动的就很厉害。
我自己研究了一下,发现就是WM_PAINT消息发生后,程序会先调用对话框A的OnPaint函数,把背景刷掉(包括子控件B),然后再调用子控件B的OnPaint函数画一些复杂的东西(耗时相对较长),这样一来就发生闪烁了。
解决方法我也想到过,但是都不太完美。
其中一个就是:对话框A的OnPaint函数什么都不做OnErasebkgnd函数返回true。这样一来子控件B就不会被背景刷掉,闪烁问题是解决了。另一个问题出现了,对话框A除了子控件B之外的其它位置也跟着不会刷新了,被别的程序窗口覆盖过就会显示其他窗口的东西。
另一个解决方法就是双缓冲,我在其它场合用过挺多次的,效果不错。大概就是准备一个内存DC,刷好背景颜色,再把子控件B的内容也画到内存DC中,最后把内存DC给BitBlt一下就好了。但这里很难应用,因为对话框A和子控件B的OnPaint函数都是分开由系统调用的,而且是先对话框A再子控件B,这样即使在A的OnPaint函数中获得了B的DC也没有什么意义。
实在想不到什么好办法了,请各路大仙指导一下吧,谢谢了。 展开
对话框A不需要显示什么东西,所以只要刷刷背景就好了。
子控件B要显示的内容比较复杂,而且跟对话框背景差异比较大。
于是每次缩放对话框时窗口闪动的就很厉害。
我自己研究了一下,发现就是WM_PAINT消息发生后,程序会先调用对话框A的OnPaint函数,把背景刷掉(包括子控件B),然后再调用子控件B的OnPaint函数画一些复杂的东西(耗时相对较长),这样一来就发生闪烁了。
解决方法我也想到过,但是都不太完美。
其中一个就是:对话框A的OnPaint函数什么都不做OnErasebkgnd函数返回true。这样一来子控件B就不会被背景刷掉,闪烁问题是解决了。另一个问题出现了,对话框A除了子控件B之外的其它位置也跟着不会刷新了,被别的程序窗口覆盖过就会显示其他窗口的东西。
另一个解决方法就是双缓冲,我在其它场合用过挺多次的,效果不错。大概就是准备一个内存DC,刷好背景颜色,再把子控件B的内容也画到内存DC中,最后把内存DC给BitBlt一下就好了。但这里很难应用,因为对话框A和子控件B的OnPaint函数都是分开由系统调用的,而且是先对话框A再子控件B,这样即使在A的OnPaint函数中获得了B的DC也没有什么意义。
实在想不到什么好办法了,请各路大仙指导一下吧,谢谢了。 展开
1个回答
展开全部
试一下这几个:
1.在对话框ON_CTLCOLOR(名称大概是这个长相)消息响应函数中,你搜一下怎么判断子控件ID的,返回空画刷(不是NULL,一个叫GetStock...的函数)
2。你再仔细研究一下父窗口什么时候刷新,ValidateRect可以让指定子窗口“绘图区有效”,也就不会刷新那个控件B的背景了。
3,。有个叫绘图区裁剪的,你在更新背景前CreateRectRgn
,然后SelectClipRgn,就可以让你的子控件所占区域不被重新绘制,就不会闪了。
1.在对话框ON_CTLCOLOR(名称大概是这个长相)消息响应函数中,你搜一下怎么判断子控件ID的,返回空画刷(不是NULL,一个叫GetStock...的函数)
2。你再仔细研究一下父窗口什么时候刷新,ValidateRect可以让指定子窗口“绘图区有效”,也就不会刷新那个控件B的背景了。
3,。有个叫绘图区裁剪的,你在更新背景前CreateRectRgn
,然后SelectClipRgn,就可以让你的子控件所占区域不被重新绘制,就不会闪了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询