拖动对话框大小时 自绘控件闪烁 能否有高手解决下?不是双缓冲问题

only_delusion 2010-09-09 03:30:20
就是我用透明PNG图片(一个小人,背景是透明的) 做了个自绘按钮..
当给他父窗体加上WS_CLIPCHILDREN属性后 主对话框拉动大小 它会有轻微闪烁
如果去掉WS_CLIPCHILDREN属性 那么强烈闪烁
我画图用的是双缓冲 选择不擦除背景 DeferWindowPos移动窗体 也不行
我看QQ的拖动大小问题 闪烁问题已经解决了 我想这问题 还是有方法解决的
能不能请高手 再次帮下忙?


为了能看的清晰点 我截图给大家看看

1。正常时候应该是下图这样的,背景是纯色的 比较好办 只要把 图片控件的背景也填充成这颜色就可以了
但是 如果背景是图片 或者是渐变色的话 就不行了
这小人按钮 是背景透明的png图片做的 正常情况下应该如下图


2。如果给他父窗口加上WS_CLIPCHILDREN属性 那么它背景部分 父窗口不会刷新 就变成这样了


3。如果去掉WS_CLIPCHILDREN属性 那么就是上面的情况了 在拖动父窗体大小的时候 会闪烁
特别轻微的闪烁 一个一个小细条的闪烁 不是整个图片都闪 只是图片上随机出现几个细条闪 特快
虽然很快 很小 但是很影响视觉
因为太快了 无法截图 大家可以想象下

我用了 不少的方法 都没有弄好 集思广益 如果有人有好的方法 在这里表示感激不尽

随便发言 也许你的一句话 就能打开我的思路了呢.....

1.双缓冲
2.禁止刷背景
3.DeferWindowPos代替移动和调大小
.
.
.
.
等 都不行 我已经绞尽脑汁了 还是不行 请高手指点迷津吧
...全文
633 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
only_delusion 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 pcubex 的回复:]
最后咋解决的啊?
[/Quote]
在主窗口背景图上 裁剪出控件位置的图片 作为控件的背景!
pcubex 2011-03-25
  • 打赏
  • 举报
回复
最后咋解决的啊?
fbi333444 2010-10-13
  • 打赏
  • 举报
回复
你使用了WS_CLIPCHILDREN这个属性后,父窗体将不绘制子窗体的这块区域。
要实现透明:截父窗体的那块背景(即:子窗体相对于父窗体的那块区域),会截到屏幕DC上去,
因此:使用的WS_CLIPCHILDREN这个属性后,如果子窗体的图片没有完全覆盖自身的区域,那会有屏幕DC上的
残余。

解决方法:1采用定位区域的方法,这种方法最好,从绘制的角度看,绘制的也最好,你用SPY++看QQ的实现,。
2:去掉父窗体的WS_CLIPCHILDREN这个属性,截取父窗体的DC,然后在绘制时,先覆盖父窗体对应的
位图,再在上面绘制
3:防止闪烁的方法。大致如下4步
only_delusion 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 visualeleven 的回复:]
你的对话框勾上了WS_CLIPCHILDREN属性了以后,那么你的子窗口(即你的透明Button)区域父窗口就不负责绘制,子窗口自行绘制,应该是你的子窗口(派生的CButton类)代码没有处理好,就要从你的继承的CButton类去做了。
[/Quote]
继承分了 好几次继承
我也知道WS_CLIPCHILDREN属性的作用 加了之后 一般的控件不会闪烁了
但是遇到透明控件 就没有办法了 父窗口不给刷新 子窗口就没背景...如果我在子窗口或者基类中做处理 加背景
那么也就没有办法能够使子控件显示父窗口的背景了 也就是无法达到透明效果  因为父窗口那区域都没有绘制 

算了  我看是常规方法解决不了了  我试试子窗口 重载ondraw函数 画图 画控件 会不会好点
实在不行 我就用alpha 做一个透明的不规则的子窗口 看看.....我就不信解决不了这问题

多谢 兔子党的几位的帮助 谢谢!.....
Eleven 2010-09-09
  • 打赏
  • 举报
回复
你的对话框勾上了WS_CLIPCHILDREN属性了以后,那么你的子窗口(即你的透明Button)区域父窗口就不负责绘制,子窗口自行绘制,应该是你的子窗口(派生的CButton类)代码没有处理好,就要从你的继承的CButton类去做了。
only_delusion 2010-09-09
  • 打赏
  • 举报
回复
我在codeproject找了一些例子 基本都会闪烁的.... 哎! 难道我一新手 上来就遇到了 这么麻烦的问题了么?
only_delusion 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
引用 10 楼 lin98666lin 的回复:
引用 9 楼 xianglitian 的回复:
引用 6 楼 fishion 的回复:
其实更好的方法是你不用标准的按钮控件,直接就在一个区域里的位置绘图,在这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了

这就是directUI的思想了

!! 主要就是我不想把项目的整体……
[/Quote]

恩 测试工程师挺麻烦的... 用到了gdi++库 而且还是3层的窗口
fishion 2010-09-09
  • 打赏
  • 举报
回复
搜下“VC transparentbutton” 不过这东西也不太好用,不过你可以看看它的实现原理
向立天 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lin98666lin 的回复:]
引用 9 楼 xianglitian 的回复:
引用 6 楼 fishion 的回复:
其实更好的方法是你不用标准的按钮控件,直接就在一个区域里的位置绘图,在这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了

这就是directUI的思想了

!! 主要就是我不想把项目的整体结构 改太多 如果改的体无完肤了... 还没改好 很……
[/Quote]
没说让你改
其实看到你的问题我第一反映就是这个方案
但是我并没有提
我在想应该有解决的办法
不过比较犯懒不想自己动手试
而且自己做个测试工程挺麻烦的
only_delusion 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]
引用 6 楼 fishion 的回复:
其实更好的方法是你不用标准的按钮控件,直接就在一个区域里的位置绘图,在这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了

这就是directUI的思想了
[/Quote]
!! 主要就是我不想把项目的整体结构 改太多 如果改的体无完肤了... 还没改好 很难恢复
项目代码太多.....
向立天 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fishion 的回复:]
其实更好的方法是你不用标准的按钮控件,直接就在一个区域里的位置绘图,在这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了
[/Quote]
这就是directUI的思想了
only_delusion 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lin98666lin 的回复:]
引用 6 楼 fishion 的回复:
其实更好的方法是你不用标准的按钮控件,直接就在一个区域里的位置绘图,在这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了

关键是 现在也不是太闪... 就是拖动大小的时候 特别轻微的闪烁 但是挺影响视觉的... 如果只是在窗体上来回切换图片的话 可能会简单点....
[/Quote]
但是需要改动的部分 太多了 可能会把程序改的体无完肤 还未必能解决问题
only_delusion 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fishion 的回复:]
其实更好的方法是你不用标准的按钮控件,直接就在一个区域里的位置绘图,在这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了
[/Quote]
关键是 现在也不是太闪... 就是拖动大小的时候 特别轻微的闪烁 但是挺影响视觉的... 如果只是在窗体上来回切换图片的话 可能会简单点....
fishion 2010-09-09
  • 打赏
  • 举报
回复
其实更好的方法是你不用标准的按钮控件,直接就在一个区域里的位置绘图,在这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了
fishion 2010-09-09
  • 打赏
  • 举报
回复
其实更好的方法是你不用标准的按钮控件,直接就会一个区域里的位置绘图,要这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了
向立天 2010-09-09
  • 打赏
  • 举报
回复
未必
父窗口应该是在子控件之前先完成绘制吧
fishion 2010-09-09
  • 打赏
  • 举报
回复
我发现,QQ里面的人头背景不是透明的
only_delusion 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xianglitian 的回复:]
可不可以通过一种方式获取按钮所在的位置的背景图片然后再按钮中再画一遍
[/Quote]
如果父窗口背景图是渐变图片 之类的 拖动大小的时候 图片也会变.... 那么获取背景图意义也不大了
向立天 2010-09-09
  • 打赏
  • 举报
回复
可不可以通过一种方式获取按钮所在的位置的背景图片然后再按钮中再画一遍

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧