void CMainFrame::DrawTitleBar(CDC *pDC) { if (!m_hWnd) return; CRect rtWnd, rtTitle, rtButtons; GetWindowRect(&rtWnd); //整个Window的相对于屏幕的矩形 //取得整个Title bar的矩形 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); //重画Title Bar DrawBmpTitleBar(pDC, rtTitle); //重画icon HICON hIcon=(HICON)::GetClassLong(m_hWnd, GCL_HICON); m_rtIcon.left=rtTitle.right-GetSystemMetrics(SM_CYSMICON); m_rtIcon.top=rtTitle.top+1; m_rtIcon.right=m_rtIcon.left+GetSystemMetrics(SM_CXSMICON); m_rtIcon.bottom=m_rtIcon.top+GetSystemMetrics(SM_CYSMICON); ::DrawIconEx(pDC-> m_hDC, m_rtIcon.left, m_rtIcon.top,hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); m_rtIcon.OffsetRect(rtWnd.TopLeft()); //记录Icon屏幕位置 //重画最小button int nButtHeight=GetSystemMetrics(SM_CYSMSIZE); rtButtons.left=rtTitle.left; rtButtons.top=rtTitle.top+(GetSystemMetrics(SM_CYSIZE)-nButtHeight)/2; rtButtons.right=rtButtons.left+GetSystemMetrics(SM_CXSMSIZE); rtButtons.bottom=rtButtons.top+nButtHeight; pDC-> DrawFrameControl(&rtButtons, DFC_CAPTION, DFCS_CAPTIONMIN); m_rtButtMin=rtButtons; m_rtButtMin.OffsetRect(rtWnd.TopLeft()); //记录最小button屏幕位置 //重画最大或恢复button rtButtons.left=rtButtons.right; rtButtons.right=rtButtons.left+GetSystemMetrics(SM_CXSMSIZE); pDC-> DrawFrameControl(&rtButtons, DFC_CAPTION, IsZoomed() ? DFCS_CAPTIONRESTORE : DFCS_CAPTIONMAX); m_rtButtMax=rtButtons; m_rtButtMax.OffsetRect(rtWnd.TopLeft());//记录button屏幕位置 //重画关闭button rtButtons.left=rtButtons.right; rtButtons.right=rtButtons.left+GetSystemMetrics(SM_CXSMSIZE); pDC-> DrawFrameControl(&rtButtons, DFC_CAPTION, DFCS_CAPTIONCLOSE); m_rtButtExit=rtButtons; m_rtButtExit.OffsetRect(rtWnd.TopLeft());//记录关闭button屏幕位置 //重画caption int nOldMode=pDC-> SetBkMode(TRANSPARENT); COLORREF clOldText=pDC-> SetTextColor(RGB(0, 0, 0)); pDC-> SelectStockObject(ANSI_FIXED_FONT); rtTitle.right-=GetSystemMetrics(SM_CYSMICON); pDC-> DrawText((LPSTR) "自绘标题栏 ",-1, &rtTitle, DT_CENTER); pDC-> SetBkMode(nOldMode); pDC-> SetTextColor(clOldText); } void CMainFrame::OnNcLButtonDown(UINT nHitTest, CPoint point) { CFrameWnd::OnNcLButtonDown(nHitTest, point); //检测最小,最大和关闭按钮是否按到 if (m_rtButtExit.PtInRect(point)) SendMessage(WM_CLOSE); else if (m_rtButtMin.PtInRect(point)) SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y) ); else if (m_rtButtMax.PtInRect(point)) { if (IsZoomed()) SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y)); else SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y) ); } } void CMainFrame::DrawBmpTitleBar(CDC *pDC, CRect rcTitle) { CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP); CBrush brush; brush.CreatePatternBrush(&bmp); pDC-> FillRect(rcTitle,&brush); }