这里以CStatic为例,其他的控件字体颜色的设置方法类似,如果需更多个性化设置,建议自绘控件,相关内容请在清泛网自行搜索。
由于CStatic没有现成的接口,要么自己继承CStatic然后重写WM_CTLCOLOR的响应函数。要么在父窗口重写WM_CTLCOLOR的响应函数,然后调用相应的接口来改变文字颜色,原理如下:
“在绘制控件前,Windows向该控件的父窗口发送一条WM_CTLCOLOR消息,目的是获得该控件的颜色”,在该响应函数中修改颜色的参数。
1、所有的CStatic控件设置颜色:
HBRUSH CAboutDig::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetTextColor(RGB(0,0,255));//设置字体颜色
pDC->SetBkMode(TRANSPARENT); //设置背景透明
}
}
2、你可能觉得对所有的控件使用统一的界面设置觉得不自由,其实VC同样可以对特定的ID的控件进行设置,方法如下:第三个参数OnCtlColor主要有以下的值:
CTLCOLOR_BTN 按钮控件
CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滚动条
CTLCOLOR_STATIC 静态文本
if(pWnd->GetDlgCtrlID() == IDC_STATIC1)
...
3、点某个按钮后,动态改变背景色
设置一个颜色变量,按钮事件中改变其颜色值,然后在OnCtlColor中进行设置:
void CctlfinalDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
m_bkcolor=RGB(0,255,0); //Green
GetDlgItem(IDC_STATIC)-> InvalidateRect(NULL);
}
HBRUSH CctlfinalDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if(pWnd->GetDlgCtrlID()==IDC_STATIC)
{
pDC->SetTextColor(m_bkcolor);
}
// TODO: Return a different brush if the default is not desired
return hbr;
}