我做了一个可以改变大小的Dlg,里面有个TreeCtrl,他的大小随窗口的大小改变,但改变大小时屏幕总是闪烁,如何解决?

解决方案 »

  1.   

    先用ShowWindow(SW_HIDE)隐藏,然后再ShowWindow(SW_SHOW);显示控件
      

  2.   

    在你的主窗体里面设置属性
    选中Clip Siblings和Clip Children
    或者
    SetWindowLong(hWnd,SWL_STYLE,CLIBSIBLINGS|CLIPCHILDREN);
    其中hWnd 为你的DLG的WND
      

  3.   

    没用的。应当是你硬件处理能力有限导致,你拿到一个配置强的机器上试试,保准不会闪!另外,你是用SetWindowPos函数吗?
      

  4.   

    我的机器还可以吧,p4 2.4的,另外我看QQ的消息管理器就不闪阿,我用的是MoveWindow不是用的SetWindowPos,有什么区别吗?
      

  5.   

    楼上的没有做过这方面的东西,就这里乱指点人家,闪跟机器的配置有什么关系??当你拖动窗口的时候,窗口上所有的控件都要重新绘制,肯定是要狂闪了,如果想做到像realone播放器那样,无闪屏拖动,那种一般界面都是一个图片,然后动态的修改布局.网上关于减轻闪屏的解决方法都是采用什么双缓冲,在内存中先画好你的屏幕,然后拷贝到屏幕上,
    我试过了,效果也不理想,
    我可以给楼主提供一个方法,你不要让你界面的随着你的拖动时时的改变,你可以这样,当你拖动的时候,你可以先显示一个虚框,当停止拖动的时候,在调整界面上的布局,这样你的控件只move一次就可以了,就没有闪屏了,所以,你就不要响应WM_SIZING消息了,你在WM_SIZE消息里处理就可以
      

  6.   

    aoosang(智慧的鱼):我的问题是控件改变大小而引起的闪烁,不是图片阿,并且
    我确实是在WM_SIZE里改变大小的,可就是闪!!!你说的双缓冲技术我也看过,不过对于处理图片的显示好用,对于控件我还真没试过,不知是否是一个道理的,理解不了!!!
      

  7.   

    闪烁是因为你改变大小时触发了重绘造成。如果不介意的话,把代码发给我,我试试:
    [email protected]
      

  8.   

    界面上窗口很多,而且改变大小时很多窗口都要移动和改变大小,如果使用MoveWindow或者SetWindowPos两个API来
    改变窗口的大小和位置,由于他们是等待窗口重画完成后才返回,所以过程很慢,这样视觉效果就可能会闪烁。解决方法:使用以下API来处理窗口移动,BeginDeferWindowPos, DeferWindowPos,EndDeferWindowPos
    先调用 BeginDeferWindowPos 设定需要移动的窗口的个数
    使用DeferWindowPos,来移动窗口,这个API并不真的造成窗口移动
    EndDeferWindowPos 一次性完成所有窗口的大小和位置的改变。有个地方要特别注意,要仔细计算清楚要移动多少个窗口,BeginDeferWindowPos设定
    的个数一定要和实际的个数一致,否则在Win9x下,如果实际移动的窗口数多于调用BeginDeferWindowPos
    时设定的个数,可能会造成系统崩溃。在Windows NT系列下不会有这样的问题。
      

  9.   

    我还是认为:
       
        引起闪烁是“因为你改变大小时触发了重绘造成”。
        并不是“如果使用MoveWindow或者SetWindowPos两个API来
        改变窗口的大小和位置,由于他们是等待窗口重画完成后才返回,
        所以过程很慢,这样视觉效果就可能会闪烁。”
      

  10.   

    因为控件附着在窗体上、甚至控件之间也有重叠,重绘时要先绘制窗体再绘制控件所以会产生闪烁,
    我使用的方法是在OnMouseMove中使用局部刷新(InvalidateRect)的方法,效果很不错
      

  11.   

    改变大小必然会让后面的窗口刷新,背后窗口的内容多好象都会闪烁。要让它不闪烁可能要对后面窗口的刷新进行一些优化处理。
    这是我个人的认为,我也遇到这样的问题。我想把后面窗口的内容用hdcmem从缓存里重显,只是还没去实现,也不知道是否会好一点。
    -----------------------------
    我流落在凄凉的世界里-孤苦伶仃
    我过着动荡无助的生活-四处漂泊
    我在死亡线上苦苦挣扎-度日如年
      

  12.   

    erben(我好你也好)说的对,我过去就是这样做的。
      

  13.   

    "我使用的方法是在OnMouseMove中使用局部刷新(InvalidateRect)的方法,效果很不错",
    具体怎么做啊,给个例吧,我的整个程序框架一改变大小,就闪个不停,头疼得很。