有时候,为了明了地显示一些状态,我们需要改变Static Text控件的背景色。
一种比较简单直接的方法是重写Dlg的OnCtlColor( )函数。
具体代码:
//CYourDlg.cpp
HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//红绿两种对应static text控件的画刷
static HBRUSH brush_red = ::CreateSolidBrush(RGB(255,0,0));
static HBRUSH brush_green = ::CreateSolidBrush(RGB(0,255,0));
enum STATIC_BKCOLOR
{
NULL_COLOR,
RED_COLOR,
GREEN_COLOR,
};
// TODO: Change any attributes of the DC here
STATIC_BKCOLOR static_BkColor = NULL_COLOR;
HBRUSH return_hbr = hbr;
switch (pWnd->GetDlgCtrlID())
{
case IDS_SERVER_STATE_COLOR:
static_BkColor = RED_COLOR;
break;
case IDS_GAME_STATE_COLOR:
static_BkColor = RED_COLOR;
break;
case IDS_PLAYER_EAST:
static_BkColor = RED_COLOR;
break;
case IDS_PLAYER_SOUTH:
static_BkColor = RED_COLOR;
break;
case IDS_PLAYER_WEST:
static_BkColor = NULL_COLOR;
break;
case IDS_PLAYER_NORTH:
static_BkColor = NULL_COLOR;
break;
default:
static_BkColor = NULL_COLOR;
}
// TODO: Return a different brush if the default is not desired
switch (static_BkColor)
{
case RED_COLOR:
pDC->SetTextColor(RGB(255,255,255));
pDC->SetBkColor(RGB(255,0,0));
return_hbr = (HBRUSH)brush_red;
break;
case GREEN_COLOR:
pDC->SetTextColor(RGB(255,255,255));
pDC->SetBkColor(RGB(0,255,0));
return_hbr = (HBRUSH)brush_green;
break;
case NULL_COLOR:
return_hbr = hbr;
break;
default:
return_hbr = hbr;
}
return return_hbr;
}
这样,只要在case中改变static_BkColor,Static Text控件(其实其他控件也可以以此方法控制)的背景颜色和字体颜色就轻松改变。要改变字体的话,请自行创建字体,选入,再SetFont( )。
本例只是针对控件的单独CTRL_ID进行了修改,如果想要修改某一种类型的控件,只要switch参数表里的nCtlColor即可,下面是nCtlColor对应的一些类型:
CTLCOLOR_BTN 按钮控件
CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滚动条
CTLCOLOR_STATIC 静态文本