也许我无法找到如何做到这一点的原因是因为它是不允许的。我的大脑现在很困惑,我无法独自解决这个问题。简而言之: 问题是,在运行时更改对话框的颜色。
#define NEW_COLOR 0x00C4FFFF
// the base class
class MyDialog : public CDialog
{
//...
COLORREF m_clrBkgnd;
virtual void RefreshColor();
}
void MyDialog::RefreshColor()
{
m_clrBkgnd = NEW_COLOR;
Invalidate();
RedrawWindow();
}
// the derived class
class CTest : public MyDialog
{
// no m_clrBkgnd
// no RefreshColor
}
// in main
CTest * m_pTestsDlg;
// here we decide to change the colours of all dialogs...
if (m_pTestsDlg != NULL)
{
m_pTestsDlg->RefreshColor();
}
它很好地运行到RefreshColor并更改m_clrBkgnd的值,但对话框不会改变颜色。
关键是,我有很多对话框,我想做RefreshColor而不用任何方式更改对话框代码。我有一种感觉,只需改变基类就可以做到这一点。在我的示例中,我只是改变了背景颜色,显然有按钮和东西,但如果我可以让它工作,我可以推断...... 另一方面,它可能只是根本不可能,这就是为什么我找不到答案。 有些对话框非常复杂,毕竟可能必须有自己的实现。
修改
以下是使用m_clrBkgnd
的地方:
HBRUSH MyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch (nCtlColor)
{
case CTLCOLOR_STATIC:
{
pDC->SetBkMode(OPAQUE);
pDC->SetTextColor(0,0,0);
pDC->SetBkColor(m_clrBkgnd);// to set the background color
return (HBRUSH) hbr;
break;
}
case CTLCOLOR_BTN:
{
pDC->SetBkMode(TRANSPARENT);
return HBRUSH(m_brushHollow);
break;
}
default:
return (HBRUSH) hbr;
}
}