代码如下:
//消息响应
LRESULT CXXXDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
// TODO: Add your specialized code here and/or call the base class
if (!::IsWindow(m_hWnd))
return CDialog::DefWindowProc(message,wParam,lParam);

if(message == WM_MOVE|| message == WM_NCPAINT||message == WM_NCACTIVATE||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if(pWinDC)
{
DrawTitleBar(pWinDC);
  ReleaseDC(pWinDC);
}
} return CDialog::DefWindowProc(message,wParam,lParam);
}运行时会先闪过默认的windows蓝色标题栏然后才变成自绘的标题栏,跟踪发现产生WM_NCACTIVATE消息时,
在drawTitle之前默认的标题栏已经出现,然后drawtitle有效,但马上又变成默认的标题栏,WM_NCPAINT时也是如此,
之后2种标题栏交替出现,最后变成自绘标题栏。
请问为什么会出现这种情况 求解决方法 !

解决方案 »

  1.   

    LRESULT CTitleBarDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
         {
          LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);
          if (!::IsWindow(m_hWnd))
          return lrst;
         if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||
         message== WM_NCACTIVATE ||message == WM_NOTIFY)
          {
          CDC* pWinDC = GetWindowDC();
          if (pWinDC)
          DrawTitleBar(pWinDC);
          ReleaseDC(pWinDC);
          }
          return lrst;
         }他的不会闪烁
    http://www.vckbase.com/document/viewdoc/?id=317
      

  2.   

    LRESULT CXXXDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)  

    // TODO: Add your specialized code here and/or call the base class 
    if (!::IsWindow(m_hWnd)) 
    return CDialog::DefWindowProc(message,wParam,lParam); if(message == WM_MOVE ¦ ¦ message == WM_NCPAINT ¦ ¦message == WM_NCACTIVATE ¦ ¦message == WM_NOTIFY) 

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

    DrawTitleBar(pWinDC); 
      ReleaseDC(pWinDC); 
    return 0; // 这里返回。

    } return CDialog::DefWindowProc(message,wParam,lParam); 
      

  3.   

      你们的方法我都试过了,并没有解决问题, 你们在drawtitlebar这里打个断点 然后观察窗口创建
     当message == WM_NCPAINT ¦ ¦message == WM_NCACTIVATE 时 已经先激活了默认标题栏 然后才自绘标题栏
    当程序很小的时候几乎看不出来闪烁。我现在的项目比较大,可以明显看到蓝色标题栏一闪而过
      

  4.   

    LRESULT CRecPlayerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
    LRESULT lrst;
    if(message != WM_NCACTIVATE)// && message != WM_NCPAINT)
    lrst=CDialog::DefWindowProc(message, wParam, lParam); if (!::IsWindow(m_hWnd))
    return lrst;

    if (message == WM_MOVE || message == WM_NCACTIVATE ||message == WM_NOTIFY ||message == WM_NCPAINT )
    {
    CDC* pWinDC = GetWindowDC();
    if (pWinDC)
    {
    DrawTitleBar(pWinDC);
    ReleaseDC(pWinDC);
    }
    }
    return lrst;
    }这是我现在修改后的代码 当message == WM_NCACTIVATE 时已经不会激活默认标题栏,如果加上message == WM_NCPAINT的话一直不会出现蓝色标题栏,
    但是WM_NCPAINT也不会绘菜单了,需要鼠标点上去才会有菜单显示 
      

  5.   

    //默认标题栏闪屏未解决
    //消息响应
    LRESULT CRecPlayerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if (!::IsWindow(m_hWnd))
    return CDialog::DefWindowProc(message, wParam, lParam);;

    if (message == 0xae || message == WM_MOVE || message == WM_NCACTIVATE ||message == WM_NOTIFY ||message == WM_NCPAINT )
    {
    CDC* pWinDC = GetWindowDC();
    if (pWinDC)
    {
    DrawTitleBar(pWinDC);
    ReleaseDC(pWinDC);
    }
    return 1;
    }
    return CDialog::DefWindowProc(message, wParam, lParam);;
    }
    添加红字代码后 运行程序时已经不闪屏了,但单步调试时还会出现一次蓝标题栏 无语 
    求高手指点原因
      

  6.   

     是返回TRUE 与这个无关吧,在刷新背景前就已经画出默认标题栏了
      

  7.   

    通常只需要处理WM_NCACTIVATE和WM_NCPAINT 就可以了,不知道你具体遇到了什么特殊情况。
    或者你可以考虑不要WS_CAPTION风格,自己在客户区上面画一个假的标题栏,并响应WM_NCHITTEST消息。