2

MFC (2005) で MDIParent ウィンドウの背景色を変更する方法はありますか?

ON_WM_CTLCOLOR と ON_WM_ERASEBKGND を傍受しようとしましたが、どちらも機能しません。OnEraseBkgnd は機能しますが、標準の WM_CTL カラーによって上書きされます。

乾杯

4

4 に答える 4

4

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 で、基本クラスを呼び出し、無効化して再描画を強制します。

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

メインフレームで、メンバー CClientWnd (たとえば m_clientWnd) を宣言します。

メインフレームの OnCreate で、最初にスーパークラスを呼び出し、次に

m_clientWnd.SubclassWindow(m_hWndMDIClient);
于 2008-10-14T11:25:45.383 に答える
3

CMDIFrameWnd は、実際には MDIClient ウィンドウと呼ばれる別のウィンドウによって覆われています。これは、この MDIClient ウィンドウをサブクラス化し、背景色を変更する方法に関する Microsoft の記事です。私は自分で試してみましたが、うまくいきます。

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

于 2008-10-14T05:51:08.617 に答える
1

少なくとも VS2008 では、この問題に対する簡単な解決策があるようです。

CMainFrame::OnPaint()

{

..

// バックグラウンド ウィンドウの DC を取得します

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

CPaintDC dc1(pWnd) ;

//そして、この DC で draw または bitblt

}

于 2011-08-18T06:38:51.700 に答える
0

ここは推測ですが、ON_WM_PAINT を扱ってみてください。

于 2008-10-14T03:22:16.733 に答える