窗口绘制有关问题

窗口绘制问题
绘制了标题了,但为什么当打开CFileDialog弹出文件对话框的时候标题栏会闪出原来被覆盖的标题栏;怎么才可以让被覆盖的标题栏不闪出来;

本了是这样的
窗口绘制有关问题
但打开文件对话框后编程这样的了,但是一闪而过
窗口绘制有关问题

代码都在这里了,其它都是向导默认生成的;
LRESULT Ctest2Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
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 CDialogEx::WindowProc(message, wParam, lParam);
}


void Ctest2Dlg::DrawTitleBar(CDC *pDC)
{

CRect reWin;
GetWindowRect(reWin);
 CBitmap bit;
 bit.LoadBitmap(IDB_BITMAP1); 
CBrush brush(RGB(77, 77, 77));
pDC->SelectObject(brush);
pDC->PatBlt(0,0, reWin.Width(), GetSystemMetrics(SM_CYCAPTION)+10, PATCOPY);
//CDC memdc;
//memdc.CreateCompatibleDC(pDC);
//memdc.SelectObject(bit);
//pDC->StretchBlt(0,0,reWin.Width(), GetSystemMetrics(SM_CYCAPTION)+6,&memdc, 0,0,48,3,MERGECOPY);

}

void Ctest2Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog OpenFileDlg(TRUE,NULL,NULL,0);
if(OpenFileDlg.DoModal() == IDOK)
{
//........
}
return;
}

------解决思路----------------------
你这样绘制不乱才怪.不同的消息需要不同的处理,返回不同的值.
既然你自己绘制了,就得返回某些值,让系统不再处理相同消息才行.

比如WM_NCPAINT,你画一次,画完了调用WindowProc让系统再画一次?
应该直接返回0才对.

WM_NCACTIVATE 应该返回TRUE

另外:WM_NCPAINT中最好调用 GetDCEx 获取 DC
case WM_NCPAINT:
{
    HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW
------解决思路----------------------
DCX_INTERSECTRGN);
    // Paint into this DC
    ReleaseDC(hwnd, hdc);
    return 0;
}


具体查一下MSDN吧,每个消息都有详细说明,绝对不能这样乱用.
------解决思路----------------------
void CMyDlg::OnNcPaint() 
{
// TODO: Add your message handler code here
CDC* pWinDC = GetWindowDC();
CRect reWin;
GetWindowRect(reWin);
reWin.OffsetRect(-reWin.left,-reWin.top);
//reWin.bottom=reWin.top+23;
CBitmap bit;
bit.LoadBitmap(IDB_BITMAP1); 
CBrush brush;
brush.CreatePatternBrush(&bit);
pWinDC->SelectObject(brush);
pWinDC->PatBlt(3,3,reWin.Width()-6,GetSystemMetrics(SM_CYCAPTION),PATCOPY);
pWinDC->SetBkMode(TRANSPARENT);
pWinDC->TextOut(6,6,"SelfDraw Caption",16);
ReleaseDC(pWinDC);

// Do not call CDialog::OnNcPaint() for painting messages
}

void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
CDialog::OnActivate(nState, pWndOther, bMinimized);

// TODO: Add your message handler code here
OnNcPaint();
}