在OnSize中依次调用每个控件的MoveWindow,结果在改变主窗口的大小时,客户区狂闪,跪求解决之道!!

解决方案 »

  1.   

    void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );
    有个bRepaint,设为FALSE,onsize结束作一次统一repaint试试看?
      

  2.   

    void CMyApp::OnEraseBkgnd()
    {
           return FALSE;
    }试试。记得添加消息映射
      

  3.   

    响应wm_erasebkgnd消息,然后直接返回FALSE
      

  4.   

    不好意思,手写的,犯了个错误。 -_-#
    BOOL CMyApp::OnEraseBkgnd()
    {
           return FALSE;
    }
      

  5.   

    if(m_edit.GetSafeHwnd())
    {
        m_edit.MoveWindow(...)
    }
      

  6.   

    to pomelowu(羽战士)为什么这样做?我的主窗口类是从CWnd继承的,CWnd::OnEraseBkgnd本来就是什么也没干。to bohut(伯虎)为什么这样做?只要m_edit已经成功create,m_edit.GetSafeHWnd不是一定返回非NULL吗?
      

  7.   

    为什么这样做?我的主窗口类是从CWnd继承的,CWnd::OnEraseBkgnd本来就是什么也没干。____________你如果不重载它,它由Framework调用,判断并设置窗口需要刷新的区域,并返回非零值。
    而如果强制让它返回0,那么framework将不会刷新窗口区域,也就避免了闪烁
      

  8.   

    在OnPaint里面放入MoveWindow试试看。
      

  9.   

    to pomelowu(羽战士)阁下的方法恐怕不行,假如主窗口不重刷背景,那么就会留下控件移动前的痕迹to aoosang(智慧的鱼)诚心请教TMD,我把VC的窗口大小狂变了一番,人家的就是不闪!!另外,对WM_ERASEBKGND十分抱有疑问。根据文档的说法,假如PAINTSTRUCT中的fErase为true,则在BeginPaint中会发送WM_ERASEBKGND,然后在OnEraseBkgnd中进行背景刷新工作。
    大家想一下,当窗口收到WM_PAINT,就会调用OnPaint,然后我在OnPaint中调用BeginPaint,并让其刷新背景,这时BeginPaint会发送WM_ERASEBKGND到进程消息队列。现在问题是,窗口要从消息队列中取得WM_ERASEBKGND并调用OnEraseBkgnd,恐怕得在OnPaint返回之后吧,然而那时,绘图操作已经完成,它在檫除背景,岂不是什么都没有了?但事实却并不是那样。这里面到底有什么玄机?
      

  10.   

    在移动前用ShowWindow(FALSE);让控件隐藏,MoveWindow()后用ShowWindow(TRUE);显示出来应该可以消除闪烁
      

  11.   

    to  laiyiling(最熟悉的陌生人):效果好象更差了,还比不上MoveWindow(&rect,false),然后再InvalidateRect,再UpdateWindow效果好。
      

  12.   

    我也遇到这样的问题!帮你 up N(N>=10000)次
      

  13.   

    SetRedraw(FALSE)
       DO SOMETHIS........
    SetRedraw(TRUE)