C ++使用基类函数来修改派生类

时间:2014-08-06 12:31:18

标签: c++ windows winapi

也许我无法找到如何做到这一点的原因是因为它是不允许的。我的大脑现在很困惑,我无法独自解决这个问题。简而言之: 问题是,在运行时更改对话框的颜色。

#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;
  }
}

0 个答案:

没有答案