1. 程式人生 > >MFC設定視窗背景顏色(很全很強大)

MFC設定視窗背景顏色(很全很強大)

如何修改frame視窗的背景顏色?   

MDI視窗的客戶區是由frame視窗擁有的另一個視窗覆蓋的。為了改變frame視窗背景的顏色,只需要這個客戶區的背景顏色就可以了。你必須自己處理WM_ERASEBKND訊息。下面是工作步驟:

  建立一個從CWnd類繼承的類,就叫它CMDIClient吧; 

在CMDIFrameWnd中加入CMDIClient變數;(具體情況看下面的程式碼) 

#include "MDIClient.h"
class CMainFrame : public CMDIFrameWnd
{
...
protected:
CMDIClient m_wndMDIClient;
}

  過載CMDIFrameWnd::OnCreateClient,下面是這段程式碼,請注意其中的SubclassWindow();

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if ( CMDIFrameWnd::OnCreateClient(lpcs, pContext) )
{
m_wndMDIClient.SubclassWindow(m_hWndMDIClient);
return TRUE;
}
else
return FALSE;
}

  最後要在CMDIClient中加入處理WM_ERASEBKGND的函式。

如何改變view的背景顏色? 

若要改變CView,CFrameWnd或CWnd物件的背景顏色需要處理WM_ERASEBKGND訊息,下面就是一個範例程式碼:

BOOL CSampleView::OnEraseBkgnd(CDC* pDC)
{

//設定brush為希望的背景顏色
CBrush backBrush(#ff8080);

//儲存舊的brush
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect);

//畫需要的區域
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);

return TRUE;

}

若要改變CFromView繼承類的背景顏色

下面是一個範例程式碼:

HBRUSH CMyFormView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{

 switch (nCtlColor)
{

  case CTLCOLOR_BTN:
case CTLCOLOR_STATIC:
{

   pDC->SetBkMode(TRANSPARENT);
//不加任何處理或設定背景為透明

  }
case CTLCOLOR_DLG:
{

   CBrush* back_brush;
COLORREF color;
color = (COLORREF) GetSysColor(COLOR_BTNFACE);
back_brush = new CBrush(color);
return (HBRUSH) (back_brush->m_hObject);

  }

 }

 return(CFormView::OnCtlColor(pDC, pWnd, nCtlColor));

}

如何修改frame視窗的背景顏色?

  MDI視窗的客戶區是由frame視窗擁有的另一個視窗覆蓋的。為了改變frame視窗背景的顏色,只需要這個客戶區的背景顏色就可以了。你必須自己處理WM_ERASEBKND訊息。下面是工作步驟:

  建立一個從CWnd類繼承的類,就叫它CMDIClient吧; 

在CMDIFrameWnd中加入CMDIClient變數;(具體情況看下面的程式碼) 

#include "MDIClient.h"
class CMainFrame : public CMDIFrameWnd
{
...
protected:
CMDIClient m_wndMDIClient;
}

  過載CMDIFrameWnd::OnCreateClient,下面是這段程式碼,請注意其中的SubclassWindow();

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if ( CMDIFrameWnd::OnCreateClient(lpcs, pContext) )
{
m_wndMDIClient.SubclassWindow(m_hWndMDIClient);
return TRUE;
}
else
return FALSE;
}

  最後要在CMDIClient中加入處理WM_ERASEBKGND的函式。

如何改變view的背景顏色? 

若要改變CView,CFrameWnd或CWnd物件的背景顏色需要處理WM_ERASEBKGND訊息,下面就是一個範例程式碼:

BOOL CSampleView::OnEraseBkgnd(CDC* pDC)
{

//設定brush為希望的背景顏色
CBrush backBrush(#ff8080);

//儲存舊的brush
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect);

//畫需要的區域
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);

return TRUE;

}

若要改變CFromView繼承類的背景顏色

下面是一個範例程式碼:

HBRUSH CMyFormView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{

 switch (nCtlColor)
{

  case CTLCOLOR_BTN:
case CTLCOLOR_STATIC:
{

   pDC->SetBkMode(TRANSPARENT);
//不加任何處理或設定背景為透明

  }
case CTLCOLOR_DLG:
{

   CBrush* back_brush;
COLORREF color;
color = (COLORREF) GetSysColor(COLOR_BTNFACE);
back_brush = new CBrush(color);
return (HBRUSH) (back_brush->m_hObject);

  }

 }

 return(CFormView::OnCtlColor(pDC, pWnd, nCtlColor));

}