就是我用透明PNG图片(一个小人,背景是透明的) 做了个自绘按钮..
当给他父窗体加上WS_CLIPCHILDREN属性后 主对话框拉动大小 它会有轻微闪烁
如果去掉WS_CLIPCHILDREN属性 那么强烈闪烁
我画图用的是双缓冲 选择不擦除背景 DeferWindowPos移动窗体 也不行
我看QQ的拖动大小问题 闪烁问题已经解决了 我想这问题 还是有方法解决的
能不能请高手 再次帮下忙?
为了能看的清晰点 我截图给大家看看1。正常时候应该是下图这样的,背景是纯色的 比较好办 只要把 图片控件的背景也填充成这颜色就可以了
但是 如果背景是图片 或者是渐变色的话 就不行了 
这小人按钮 是背景透明的png图片做的 正常情况下应该如下图
2。如果给他父窗口加上WS_CLIPCHILDREN属性 那么它背景部分 父窗口不会刷新 就变成这样了
3。如果去掉WS_CLIPCHILDREN属性 那么就是上面的情况了 在拖动父窗体大小的时候 会闪烁
特别轻微的闪烁 一个一个小细条的闪烁 不是整个图片都闪 只是图片上随机出现几个细条闪 特快
虽然很快 很小 但是很影响视觉
因为太快了 无法截图 大家可以想象下 我用了 不少的方法 都没有弄好 集思广益 如果有人有好的方法 在这里表示感激不尽随便发言 也许你的一句话 就能打开我的思路了呢.....1.双缓冲
2.禁止刷背景
3.DeferWindowPos代替移动和调大小
.
.
.
.
等 都不行 我已经绞尽脑汁了 还是不行 请高手指点迷津吧

解决方案 »

  1.   

    其实更好的方法是你不用标准的按钮控件,直接就会一个区域里的位置绘图,要这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了
      

  2.   

    其实更好的方法是你不用标准的按钮控件,直接就在一个区域里的位置绘图,在这个区域里根据鼠表的状态来修改绘制的图,这样你用InvalidateRect来刷新这一部分的话,就不会太闪了
      

  3.   

    搜下“VC transparentbutton” 不过这东西也不太好用,不过你可以看看它的实现原理
      

  4.   


    恩 测试工程师挺麻烦的... 用到了gdi++库 而且还是3层的窗口
      

  5.   

    我在codeproject找了一些例子 基本都会闪烁的.... 哎! 难道我一新手 上来就遇到了 这么麻烦的问题了么?
      

  6.   

    你的对话框勾上了WS_CLIPCHILDREN属性了以后,那么你的子窗口(即你的透明Button)区域父窗口就不负责绘制,子窗口自行绘制,应该是你的子窗口(派生的CButton类)代码没有处理好,就要从你的继承的CButton类去做了。
      

  7.   

    继承分了 好几次继承 
    我也知道WS_CLIPCHILDREN属性的作用 加了之后 一般的控件不会闪烁了
    但是遇到透明控件 就没有办法了 父窗口不给刷新 子窗口就没背景...如果我在子窗口或者基类中做处理 加背景
    那么也就没有办法能够使子控件显示父窗口的背景了 也就是无法达到透明效果  因为父窗口那区域都没有绘制 算了  我看是常规方法解决不了了  我试试子窗口 重载ondraw函数 画图 画控件 会不会好点
    实在不行 我就用alpha 做一个透明的不规则的子窗口 看看.....我就不信解决不了这问题多谢 兔子党的几位的帮助 谢谢!..... 
      

  8.   

    你使用了WS_CLIPCHILDREN这个属性后,父窗体将不绘制子窗体的这块区域。
     要实现透明:截父窗体的那块背景(即:子窗体相对于父窗体的那块区域),会截到屏幕DC上去,
    因此:使用的WS_CLIPCHILDREN这个属性后,如果子窗体的图片没有完全覆盖自身的区域,那会有屏幕DC上的
    残余。 解决方法:1采用定位区域的方法,这种方法最好,从绘制的角度看,绘制的也最好,你用SPY++看QQ的实现,。
    2:去掉父窗体的WS_CLIPCHILDREN这个属性,截取父窗体的DC,然后在绘制时,先覆盖父窗体对应的
       位图,再在上面绘制
    3:防止闪烁的方法。大致如下4步