我已经用的是内存画图,然后在显示的。怎么还会这样?

解决方案 »

  1.   

    有很多消息(事件)都能引起WM_NCPAINT,一定是你没有处理所有的这些消息
      

  2.   

    message == WM_MOVE || message == WM_NCPAINT ||message == WM_NCACTIVATE ||message == WM_NOTIFY
    这些都处理了,还少什么马?
      

  3.   

    WM_ACTIVATE也要处理!大概还有WM_WINDOWPOSCHANGED?这个没试过
      

  4.   

    当然这个是程序自动会执行的,因为其它的对话框出来,WINDOW是不是要重绘整个区域,当然就会执行到OnPaint(),所以就会出现你上面的情况!
    具体有很多种方法可以解决!
    1.加变量不让其绘制就是一种!
      

  5.   

    模式对话框出来的时候
    会向父窗口发送WM_ENABLE消息,
    这个时候可能会引起一条WM_NCPAINT消息
    然后父窗口执行EnableWindow(FALSE)
    又会引起一条WM_NCPAINT消息
    所以出现你说的闪烁
      

  6.   

    to fz_zhou(vcfan):就算如你所说,可是他是先画在内存DC上,然后再BitBlt的,应该不会有闪烁,所以我还是认为是他没有处理全部可能引起非客户区重绘的消息而导致的
      

  7.   

    请在自画函数开始处调用BeginPaint,画完结束时调用EndPaint,看看是否还会闪烁。
      

  8.   

    WM_ACTIVATE ,WM_WINDOWPOSCHANGED单独和同时加上,都试过,不行。
    BeginPaint,EndPaint也试过,也不行。
    siphonelee说的对,就是闪烁两次。
      可是怎么解决,我不是第一个碰到类似情况的人吧?
      

  9.   

    这样吧,
    设置一个全局变量BOOL erase = TRUE;
    在WM_NCPAINT事件中:
    if(erase)
    {  //正常操作
    }
    else

      return;
    //避免重画非客户区引起闪烁
    }在对话框domodal之前erase = FALSE即可
      

  10.   

    不知道怎么搞得我这样做了,但是还是有闪烁我是这样处理的:
    LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    LRESULT lrst=CFrameWnd::DefWindowProc(message, wParam, lParam);

    if (!::IsWindow(m_hWnd))
    return lrst;

    if (message == WM_MOVE ||message == WM_NCACTIVATE ||message == WM_NOTIFY)
    {

    CDC* pWinDC = GetWindowDC();
    if (pWinDC)
    DrawTitleBar(pWinDC);
    ReleaseDC(pWinDC);


    }
     if(message == WM_NCPAINT)
     {
     if(Erase)
    {
    CDC* pWinDC = GetWindowDC();
       if (pWinDC)
    DrawTitleBar(pWinDC);
        ReleaseDC(pWinDC);
    }
       }
    return lrst;
    }
       
       在对话框建立的程序是这样的
           CAboutDlg aboutDlg;
    Erase=false;
    aboutDlg.DoModal();
    Erase=true;
        到底是怎么搞得的?