在软件开发中,出于界面的美观或是别的目的我们需要修改对话框的颜色,这时我们可以通过如下方法来达到目的。
注:本例使用VC++2010测试, 以下第一种方法不适合该版本的VC++库。
1、 修改App类中的InitInstance函数来改变应用程序中所有的对话框颜色
本方法所用函数为CWinApp类的成员函数SetDialogBkColor,关于SetDialogBkColor的详细说明请参见MSDN;使用例子如下:
BOOL CImageApp::InitInstance()
m_pMainWnd = &dlg;
//请注意下行的位置,一定要在dlg的DoModal函数之前
SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
注:此种方法将更改应用程序中所有对对话框的颜色
2、 在WM_PAINT消息(既OnPaint函数)中修改本对话框颜色
在Dlg类的WM_PAINT消息中修改本对话框颜色,既通过重载OnPaint函数来达到修改本对话框颜色的目的,使用例子如下:
void CImageDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
// 更给对话框背景颜色
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(255,255,255)); //设置为白色背景
CDialogEx::OnPaint();
}
}
3、 在WM_CTLCOLOR消息(既OnCtlColor函数)中修改本对话框颜色
本方法通过响应对话框的WM_CTLCOLOR消息来达到修改本对话框颜色,既通过重载OnCtlColor来达到此目的,使用例子如下:
HBRUSH CImageDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if( nCtlColor == CTLCOLOR_DLG )
hbr = m_hBrush;
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
注:上面的m_hBrush为CHBRUSH类实例;可以在对话框中的OnInitDialog函数中创建本实例,如:m_hBrush.CreateSolidBrush(RGB(255, 255, 255));
说明:
上述方法均有各自的优缺点,如方法1将更改应用程序中所有对话框类的颜色,而方法2则可能带来对话框的闪动等。所以在具体应用中用户可以根据自己的需求选用相应的方法。