【问题标题】:Setting Background Color CMDIFrameWnd设置背景颜色 CMDIFrameWnd
【发布时间】:2010-09-17 00:36:15
【问题描述】:

有没有办法在 MFC (2005) 中更改 MDIParent 窗口的背景颜色?

我曾尝试拦截 ON_WM_CTLCOLOR 和 ON_WM_ERASEBKGND 但均无效。 OnEraseBkgnd 确实有效,但随后会被标准 WM_CTL 颜色覆盖。

干杯

【问题讨论】:

  • 老兄,我没有给出实际答案而不是答案链接吗?

标签: c++ user-interface mfc colors


【解决方案1】:

这里只是猜测,但尝试处理 ON_WM_PAINT。

【讨论】:

    【解决方案2】:

    CMDIFrameWnd 实际上被另一个称为 MDIClient 窗口的窗口所覆盖。这是一篇关于如何子类化此 MDIClient 窗口并更改背景颜色的 Microsoft 文章。我自己试过了,效果很好。

    http://support.microsoft.com/kb/129471

    【讨论】:

      【解决方案3】:

      创建一个派生CWnd的类(例如CClientWnd)

      在您的 CWnd 派生类句柄中

      afx_msg BOOL OnEraseBkgnd(CDC* pDC);
      afx_msg void OnPaint(void);
      afx_msg void OnSize(UINT nType, int cx, int cy);
      

      您需要以下消息映射条目:

      ON_WM_ERASEBKGND()
      ON_WM_PAINT()
      ON_WM_SIZE()
      

      在 OnEraseBkgnd 中只返回 TRUE,您将在 OnPaint 中完成所有工作

      在 OnPaint 中,随心所欲。要填充颜色,您可以这样做

      CBrush brush;
      brush.CreateSolidBrush(COLORREF(RGB( 80, 160, 240 )));
      
      CRect clientRect;
      GetClientRect(clientRect);
      
      CPaintDC dc(this);
      dc.FillRect(clientRect, &brush);
      

      在 OnSize 中,调用基类,然后使 invalidate 强制重绘:

      CWnd::OnSize(nType, cx, cy);
      Invalidate(FALSE);
      

      在您的大型机中,声明一个成员 CClientWnd(例如 m_clientWnd)

      在你的大型机的OnCreate中,先调用超类,然后

      m_clientWnd.SubclassWindow(m_hWndMDIClient);
      

      【讨论】:

        【解决方案4】:

        至少在 VS2008 中似乎有一个简单的解决方案:

        CMainFrame::OnPaint()

        {

        ..

        //获取背景窗口的dc

        CWnd* pWnd = CWnd::FromHandle(m_hWndMDIClient) ;

        CPaintDC dc1(pWnd) ;

        //然后在这个DC中绘制或bitblt

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-25
          • 2018-07-15
          • 2014-09-04
          • 2010-11-10
          • 2013-08-04
          • 1970-01-01
          • 2014-12-10
          • 1970-01-01
          相关资源
          最近更新 更多