在软件开发中,出于界面的美观或是别的目的我们需要修改对话框的颜色,这时我们可以通过如下方法来达到目的。
注:本例使用VC++2010测试, 以下第一种方法不适合该版本的VC++库。
1、 修改App类中的InitInstance函数来改变应用程序中所有的对话框颜色
本方法所用函数为CWinApp类的成员函数SetDialogBkColor,关于SetDialogBkColor的详细说明请参见MSDN;使用例子如下:
BOOL CImageApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CImageDlg dlg;
m_pMainWnd = &dlg;
//请注意下行的位置,一定要在dlg的DoModal函数之前
SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
注:此种方法将更改应用程序中所有对对话框的颜色
2、 在WM_PAINT消息(既OnPaint函数)中修改本对话框颜色
在Dlg类的WM_PAINT消息中修改本对话框颜色,既通过重载OnPaint函数来达到修改本对话框颜色的目的,使用例子如下:
void CImageDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
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则可能带来对话框的闪动等。所以在具体应用中用户可以根据自己的需求选用相应的方法。