MFC視窗各控制項的顏色和字型的設定 (2009-09-04 11:08:39) 轉載
很多人定義了基於MFC的程式項目,當設計介面使用控制項時,卻不知道如何對各控制項進行字型與顏色的設計;其實這些修改是需要動手添加代碼的,這方面的修改在控制項屬性裡是沒有現成的,這不同於.net定義的項目,它的是有直接屬性修改的。我在原文的基礎上做了修改與完善,也可參見原文
原文:http://www.study-code.com/visual-studio/vc/74759.htm
1、改變對話方塊的底色
在對話方塊的類中添加一個 private : CBrush m_brush;的成員變數。在類的建構函式中添加如下代碼:
m_brush.CreateSolidBrush(RGB(0,0,255)); //初始化為藍色
為對話方塊添加一個WM_CTLCOLOR訊息響應函數,專門為控制項著色的訊息響應函數,代碼如下:
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//return hbr;
return m_brush;
}
當然,.h檔案裡也要對函數進行預定義的;此時,該對話方塊的背景色已經全為藍色了。
2、如果我們要設定某一個對話方塊控制項的底色和文字顏色時只要將上面return m_brush;改為:
if (pWnd->GetDlgCtrlID()==IDC_LINE_STYLE)
{
pDC->SetTextColor(RGB(0,255,0));
//pDC->SetBkMode(TRANSPARENT);
pDC->SetBkColor(RGB(255,0,0));
return m_brush;
}
return hbr;
注意如果要設定單行EDIT的文字背景色,需要使用SetBkColor設定,而SetBkMode即使為透明,文字的背景仍為系統的預設色。按鈕控制項好像不能實現,大家可以試試,是不是按鈕真的不能實現這些顏色變化。
3、利用上面的原理,在對話方塊控制項響應OnPaint訊息時,將一個靜態文本顯示所設定字型的文字。添加一個靜態文字框,改名為IDC_TEXT。添加一個字型成員變數 private: CFont m_font;在對話方塊的建構函式中對字型進行初始化: m_font.CreatePointFont(200,"華文行楷");在2的return hbr;之前加入如下代碼:
if (pWnd->GetDlgCtrlID()==IDC_TEXT)
{
pDC->SelectObject(&m_font);
}
注意,因為OnPaint訊息響應函數是在控制項被繪製之前觸發的,它所返回的HBRUSH畫刷控制代碼,便攜帶了我們所設定的這些屬性。此時,靜態文字框的字型就變為你所需要的那種字型了。
4、如果要改變OK按鈕的文字顏色,靠上面的方式是不行的。我們需要建立一個新的從CButton類繼承的CTestBtn類,並添加一個類的DrawItem的虛函數,類與虛函數都可以用嚮導來定義,加入以下代碼:
// TODO: Add your code to draw the specified item
UINT uStyle = DFCS_BUTTONPUSH;
// This code only works with buttons.
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
// If drawing selected, add the pushed style to DrawFrameControl.
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;
// Draw the button frame.
::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,DFC_BUTTON, uStyle);
// Get the button's text.
CString strText;
GetWindowText(strText);
// Draw the button text using the text color red.
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
然後,右鍵選擇OK按鈕,用嚮導建立一個關聯的成員變數m_btnTest,從新建立的CTestBtn類繼承。在OK按鈕的屬性頁面-〉Styles-〉Owner Draw選中,否則OK按鈕仍然繼承預設的CButton類。 需要上色的按鈕分別都要建關聯成員變數與設定Owner Draw屬性;另外,如果要設不同的顏色,則分別在代碼中修改。