代码: if (hwnd)
{
    HDC pDC = GetWindowDC(hwnd);
HBRUSH Brush = NULL;
HBRUSH pOldBrush = NULL; if(m_bActive){
Brush = ::CreateSolidBrush(RGB(150,100,255));     
}
else
{
Brush=::CreateSolidBrush(RGB(200,200,200));

}
        pOldBrush = (HBRUSH)::SelectObject(pDC,Brush);   CRect rtWnd, rtTitle, rtButtons;
GetWindowRect(m_hWnd,&rtWnd); 
//取得标题栏的位置
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE); CPoint point;
//填充顶部框架
point.x = rtWnd.Width();
point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME)+1;
PatBlt(pDC,0, 0, point.x, point.y, PATCOPY);
//填充左侧框架
point.x = GetSystemMetrics(SM_CXFRAME);
point.y = rtWnd.Height();
PatBlt(pDC,0, 0, point.x, point.y, PATCOPY);
//填充底部框架
point.x = rtWnd.Width(); 
point.y = GetSystemMetrics(SM_CYFRAME);
PatBlt(pDC,0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY);
//填充右侧框架
point.x = GetSystemMetrics(SM_CXFRAME);
point.y = rtWnd.Height();
PatBlt(pDC,rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY);
//填充菜单下部框架
point.x = rtWnd.Width();
point.y = GetSystemMetrics(SM_CYFRAME)-1;
PatBlt(pDC,0, GetSystemMetrics(SM_CYMENU)+GetSystemMetrics(SM_CYSIZE)+point.y, point.x, point.y, PATCOPY);
SelectObject(pDC,pOldBrush);
::DeleteObject(Brush);
pOldBrush = NULL;
::ReleaseDC(hwnd,pDC);
pDC = NULL;
}这段代码是在WM_NCPAINT里画标题栏的,BOOL m_bActive是不断变化的,根椐它值的不同画不同颜色,可是当m_bActive变为FALSE,选了颜色为RGB(200,200,200)Brush后,后面一直是画的这个颜色,再也画不出RGB(150,100,255)这个颜色了,我跟踪到代码里面,m_bActive变为TRUE后,Brush = ::CreateSolidBrush(RGB(150,100,255))这句代码也执行了,但画出来的总是RGB(200,200,200),真的好奇怪。

解决方案 »

  1.   

    建议你不要用单步调试跟踪,改用TRACE把调试的信息打印出来 bActive为true和false两个分支都打印出来看看,是否最后的一次绘制是走到了false的分支。
    楼主的编码风格跟我很像 哈哈
      

  2.   

    会不会m_bActive变为TRUE后 执行完后,又执行了FALSE的情况
      

  3.   

    确实,WM_NCACITVE的值好像不准。
      

  4.   

    http://www.vckbase.com/document/viewdoc/?id=317
    参考一下这里绘制标题栏的程序吧,可能有用
      

  5.   

    他应该是响应WM_NCACITVE消息得到的
    afx_msg BOOL OnNcActivate(
       BOOL bActive 
    );