WM_CTLCOLOR消息用來完成對EDIT, STATIC, BUTTON等控件設置背景和字體顏色, 其用法如下:
1.首先在自己需要設置界面的對話框上點擊右鍵-->建立類嚮導-->加入WM_CTLCOLOR消息-->自動生成OnCtlColor()函數, 此函數可以對本對話框的控件的界面外觀做修飾, 用法如下:
將類嚮導產生的函數做如下修改:
HBRUSH CDialogColor::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// 設置顯示字體
CFont * cFont=new CFont;
cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH&FF_SWISS,"Arial");
// 對特定的控件做修改
switch()
{
case CTLCOLOR_STATIC: //對所有靜態文本控件的設置
{
pDC->SetBkMode(TRANSPARENT);
//設置背景爲透明
pDC->SetTextColor(RGB(255,255,0)); //設置字體顏色
pWnd->SetFont(cFont); //設置字體
HBRUSH B = CreateSolidBrush(RGB(125,125,255));
//創建畫刷
return (HBRUSH) B; //返回畫刷句柄
}
case CTLCOLOR_EDIT: //對所有編輯框的設置
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,0));
pWnd->SetFont(cFont);
HBRUSH B = CreateSolidBrush(RGB(125,125,255));
return (HBRUSH) B;
}
default:
return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
}
}
注:case的類別有以下幾種:
CTLCOLOR_BTN 按鈕控件
CTLCOLOR_DLG 對話框
CTLCOLOR_EDIT 編輯框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滾動條
CTLCOLOR_STATIC 靜態文本
2.你可能覺得對所有的控件使用統一的界面設置覺得不自由, 其實VC同樣可以對特定的ID的控件進行設置, 方法如下:
switch (pWnd->GetDlgCtrlID())
{
//針對ID爲IDC_CTL1, IDC_CTL2和IDC_CTL3的控件進行同樣的設置
case IDC_CTL1:
case IDC_CTL2:
case IDC_CTL3:
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255, 0));
pWnd->SetFont(cFont);
HBRUSH B = CreateSolidBrush(RGB(125,125,255));
return (HBRUSH) B;
}
default:
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
HBrush用法
HBRUSH hbr;
第一種: hbr= CreateSolidBrush(RGB(255,0,0)); //單色的畫刷
第二種: hbr= (HBRUSH)GetStockObject(BLACK_BRUSH); //只能取特定顏色的畫刷,如BLACK_BRUSH,GRAY_BRUSH等刷
第三種: hbr= CreatePatternBrush(HBITMAP hbmp); //得到位圖畫刷
第四種: hbr = CreateHatchBrush(int fnStyle, COLORREF clrref) //創建一種帶陰影的畫刷
第五種: hbr= CreateBrushIndirect(LOGBRUSH); //通過LOGBRUSH結構體來取畫刷
typedef struct tagLOGBRUSH {
UINT lbStyle; //畫刷類型
COLORREF lbColor; //顏色
LONG lbHatch; //陰影
} LOGBRUSH, *PLOGBRUSH;
第六種: hbr= HBRUSH CreateDIBPatternBrush( //通過與設備無關位圖創建一個畫刷
HGLOBAL hglbDIBPacked, // handle to DIB
UINT fuColorSpec // color table data
);
例如:
HBRUSH CAfdView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if (pWnd->GetDlgCtrlID()==IDC_STATIC1)
{
pDC->SetTextColor(RGB(200,0,0));
pDC->SetBkColor(RGB(0,0,255));
static HBRUSH hBrush = CreateSolidBrush(RGB(222,0,255));
return hBrush;
}
// TODO: Return a different brush if the default is not desired
else
return hbr;
}
改變對話框背景色
HBRUSH CDqfDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
if(nCtlColor == CTLCOLOR_DLG)
{
CBrush *brush;
brush = new CBrush(RGB(221,221,221));
return (HBRUSH)(brush->m_hObject);
}
return hbr;
}
另外:
HBRUSH B = CreateSolidBrush(RGB(125,125,255));
return (HBRUSH) B;
可能會引起GDI資源泄漏,解決方法請參考:http://blog.csdn.net/seven407/article/details/7497550