如果您觉得本文对您有用,可以收藏一波,方便日后查询;如果您有疑问,可以在文章后面留言,看到后我会尽快回复。
本文以CEdit控件为例来说明“如何修改CEdit的背景色和文字颜色”。
第1步,在“xxx.cpp”中添加消息映射:
BEGIN_MESSAGE_MAP(CUIConfirmVehicle, CBaseView)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
第2步,在头文件中声明消息响应函数,并定义一个CBrush类型的变量;:
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
...
CBrush m_editBrush;
第3步,在“xxx.cpp”中实现消息响应函数的代码,并在构造函数中或者其它合适的地方创建画刷:
CUIConfirmVehicle::CUIConfirmVehicle()
: CBaseView(IDD_VIEW_CONFIRMVEHICLE)
{
m_editBrush.CreateSolidBrush(RGB(255, 255, 255));
}
HBRUSH CUIConfirmVehicle::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CBaseView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
return hbr;
}
上面函数的实现代码是类向导自动生成的,未人为添加。
第4步,修改函数实现,修改之前必须要先了解一下此函数的几个参数的作用:
pDC
指向子窗口的显示上下文的指针。
pWnd
指向要修改颜色的控件的指针。
nCtlColor
包含以下值之一,指定控件类型:
-
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
通过第3个参数,我们知道要修改编辑框控件的颜色的话,就可以这样写了:
HBRUSH CUIConfirmVehicle::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CBaseView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
if (CTLCOLOR_EDIT == nCtlColor)
{
return m_editBrush;
}
return hbr;
}
同理如果要修改按钮控件的颜色,只需要把
if (CTLCOLOR_EDIT == nCtlColor)
替换成
if (CTLCOLOR_BTN == nCtlColor)
注意事项:
(1)这种方法会改掉某一类型的所有控件的颜色,比如上面的判断如果是“CTLCOLOR_EDIT ”,那么所有的界面上的所有CEdit控件的颜色都会被修改。
(2)必须返回一个CBrush类型的变量,该画刷的颜色就是控件的背景颜色,而且这个变量不能时临时变量,要定义成成员变量或者new出来。
那么如何只修改某一个CEdit控件的颜色,且不影响其它CEdit控件的颜色?
HBRUSH CUIConfirmVehicle::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CBaseView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if (pWnd->GetDlgCtrlID() == IDC_EDIT_02)
{
// 设置文字颜色为红色
pDC->SetTextColor(RGB(255, 0, 0));
//设置文字背景为透明的,这样整个编辑框的背景不会被文字的背景覆盖,但是我试了一下,有没有下面这行都没影响。
pDC->SetBkMode(TRANSPARENT);
return m_editBrush;
}
return hbr;
}
核心代码是:
if (pWnd->GetDlgCtrlID() == IDC_EDIT_02)
上面代码中的即为我们创建的CEdit控件的ID,不管我们是用代码手动创建的控件,还是在资源视图直接拖放到界面上的控件,都会有一个ID,如果不知道怎么查看ID的话,那就需要补充一下基本知识了。
因为每个控件的ID都不一样,所以通过对ID作判断,就可以单独设置某一个控件的颜色了。