代码之家  ›  专栏  ›  技术社区  ›  JamesSugrue

设置背景色Cmdiframewnd

  •  2
  • JamesSugrue  · 技术社区  · 16 年前

    在mfc(2005)中,是否有方法更改mdiparent窗口的背景颜色?

    我试过在wm-ctlcolor和erasebkgnd上截取,但都没用。OneraseBKGND确实有效,但随后它会被标准的wm_ctl颜色覆盖。

    干杯

    4 回复  |  直到 13 年前
        1
  •  3
  •   Adam Pierce    16 年前

    CmdiFramewnd实际上被另一个名为mdiclient窗口的窗口覆盖。下面是一篇关于如何子类化MDiclient窗口和更改背景颜色的Microsoft文章。我自己试过,效果很好。

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

        2
  •  3
  •   Aidan Ryan    16 年前

    创建派生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中调用超类,然后使其无效以强制重新绘制。


    在大型机中,声明成员cclientwnd(例如m_clientwnd)

    在大型机的onCreate中,首先调用超类,然后

    m_clientWnd.SubclassWindow(m_hWndMDIClient);
    
        3
  •  1
  •   Richard    13 年前

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

    cmainframe::onpaint()。

    {

    //获取后台窗口的dc

    cwnd*pwnd=cwnd::fromhandle(m_hwndmdiclient);

    CPAITDC DC1(PWND);

    //然后在此DC中绘制或bitblt

    }

        4
  •  0
  •   Mark Ransom    16 年前

    猜猜看,但试着处理油漆。