對於對話框,只需要重載默認的消息處理函數就行了:
// 重載默認的消息處理函數,主要處理WM_MOVE WM_PAINT WM_NCPAINT WM_NCACTIVATE WM_NOTIFY這// 幾個消息就可以了
LRESULT CMyDialog::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) DrawBorder(pWinDC); ReleaseDC(pWinDC); } return lrst; //return CDialog::DefWindowProc(message, wParam, lParam); }
// 重畫邊框的具體代碼 void CMyDialog::DrawBorder(CDC *pDC) { if (m_hWnd ) { CBrush Brush(RGB(255, 0, 0)); CBrush* pOldBrush = pDC->SelectObject(&Brush); CRect rtWnd; GetWindowRect(&rtWnd); CPoint point; //填充頂部框架 point.x = rtWnd.Width(); point.y = GetSystemMetrics(SM_CYFRAME)+1; pDC->PatBlt(0, 0, point.x, point.y, PATCOPY); //填充左側框架 point.x = GetSystemMetrics(SM_CXFRAME); point.y = rtWnd.Height(); pDC->PatBlt(0, 0, point.x, point.y, PATCOPY); //填充底部框架 point.x = rtWnd.Width(); point.y = GetSystemMetrics(SM_CYFRAME) + 1; pDC->PatBlt(0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY); //填充右側框架 point.x = GetSystemMetrics(SM_CXFRAME); point.y = rtWnd.Height(); pDC->PatBlt(rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY); } }
以上代碼雖然是針對對話框的,不過,對於一般的窗口,稍微修改一下,估計也是可以的。
如果出現對話框的邊框顏色沒有修改,可以用:
InvalidateRect(NULL); // 在邊框改變的對話框中
或者如果有父窗口,在父窗口中調用:
RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN );
這樣應該就差不多了。
---------------------------------------------------------------------------------------------------------------------
以下為修改對話框背景顏色方法:
重載OnPaint(),即WM_PAINT消息。有關代碼如下(以上例工程為准):
void CExampleDlgDlg::OnPaint() { if (IsIconic()) … else { CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.FillSolidRect(rect,RGB(0,255,0)); //設置為綠色背景 CDialog::OnPaint(); }
或者在OnInitDialog函數中調用
SetBackgroundColor(RGB(0,255,0));