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也没有什么意义。

实在想不到什么好办法了,请各路大仙指导一下吧,谢谢了。
展开
 我来答
龚炜林
推荐于2016-08-03 · TA获得超过1560个赞
知道大有可为答主
回答量:1102
采纳率:66%
帮助的人:582万
展开全部
试一下这几个:
1.在对话框ON_CTLCOLOR(名称大概是这个长相)消息响应函数中,你搜一下怎么判断子控件ID的,返回空画刷(不是NULL,一个叫GetStock...的函数)

2。你再仔细研究一下父窗口什么时候刷新,ValidateRect可以让指定子窗口“绘图区有效”,也就不会刷新那个控件B的背景了。

3,。有个叫绘图区裁剪的,你在更新背景前CreateRectRgn
,然后SelectClipRgn,就可以让你的子控件所占区域不被重新绘制,就不会闪了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式