第一種辦法(應該是最好的辦法,可以正對單個控制項來修改顏色,也許對其他類型的控制項也可通用):
首先我們在對話方塊中添加OnCtlColor訊息映射函數,函數作用/函數原型/參數解釋請看MSDN描述~
QUOTE:
CWnd::OnCtlColor See Also
CWnd Overview | Class Members | Hierarchy Chart | CDC::SetBkColor
The framework calls this member function when a child control is about to be drawn.
afx_msg HBRUSH OnCtlColor(
CDC* pDC,
CWnd* pWnd,
UINT nCtlColor
);
Parameters
pDC
Contains a pointer to the display context for the child window. May be temporary.
pWnd
Contains a pointer to the control asking for the color. May be temporary.
nCtlColor
Contains one of the following values, specifying the type of control:
CTLCOLOR_BTN Button control
CTLCOLOR_DLG Dialog box
CTLCOLOR_EDIT Edit control
CTLCOLOR_LISTBOX List-box control
CTLCOLOR_MSGBOX Message box
CTLCOLOR_SCROLLBAR Scroll-bar control
CTLCOLOR_STATIC Static control
Return Value
OnCtlColor must return a handle to the brush that is to be used for painting the control background.
然後我們在對話方塊上放置兩個STATIC控制項,ID分別為:IDC_STCCOLOR和IDC_STCTWO。然後在對話方塊的類中新增成員變數(別告訴我你不知道怎麼添加……),變數需要兩個,每個成員變數對應一個控制項~
ps:變數種類要選擇控制項變數~這要的控制項變數的類型一般是CStatic~
然後我們在剛才的那個訊息映射函數中寫下下列代碼:
QUOTE:
HBRUSH CMFCDialogDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (GetDlgItem(IDC_STCCOLOR) == pWnd)
{
pDC->SetTextColor(#ff0000);
}
else if (GetDlgItem(IDC_STCTWO) == pWnd)
{
pDC->SetTextColor(#0000ff);
}
return hbr;
}
這裡之所以要先判斷控制代碼,是因為我們要針對某一個控制項進行設定。如果你直接使用pDC->SetTextColor來設定,那麼MFC會遍曆表單的所有控制項,然後把顏色設定成一樣。
至於為什麼要添加控制項的成員變數,我們可以在對話方塊的CPP檔案中發現這段代碼:
QUOTE:
void CMFCDialogDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STCCOLOR, m_cstcColor);
DDX_Control(pDX, IDC_STCTWO, m_cstcTwo);
}
第二種辦法:
在實際的應用中,可以用WM_CTLCOLOR 訊息改變mfc中控制項的顏色,比如現在就來改變一個static text孔家的
背景色和字型
1 在對話方塊的類中添加兩個變數:
CBrush m_brush;
CFont m_font;
在OnInitDialog()函數中添加:
// TODO: 在此添加額外的初始化代碼
m_font.CreatePointFont(150,"華文行楷");
m_brush.CreateSolidBrush(#00ff00);
2 添加WM_CTLCOLOR 訊息響應,添加的方法為:
在對話方塊類中聲明:afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) ;
在訊息映射中添加: ON_WM_CTLCOLOR()
如:
BEGIN_MESSAGE_MAP(CtestEnvDlg, CDialog)
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3 添加響應函數:
HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(m_yourStatic.m_hWnd == pWnd->m_hWnd)
{
pDC->SetBkColor(#00ff00);
pDC->SelectObject(&m_font);
return m_brush;
}
return hbr;
}
這樣就可以改變static text的顏色和字型了