MFC (2005) で MDIParent ウィンドウの背景色を変更する方法はありますか?
ON_WM_CTLCOLOR と ON_WM_ERASEBKGND を傍受しようとしましたが、どちらも機能しません。OnEraseBkgnd は機能しますが、標準の WM_CTL カラーによって上書きされます。
乾杯
MFC (2005) で MDIParent ウィンドウの背景色を変更する方法はありますか?
ON_WM_CTLCOLOR と ON_WM_ERASEBKGND を傍受しようとしましたが、どちらも機能しません。OnEraseBkgnd は機能しますが、標準の WM_CTL カラーによって上書きされます。
乾杯
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);
CMDIFrameWnd は、実際には MDIClient ウィンドウと呼ばれる別のウィンドウによって覆われています。これは、この MDIClient ウィンドウをサブクラス化し、背景色を変更する方法に関する Microsoft の記事です。私は自分で試してみましたが、うまくいきます。
少なくとも VS2008 では、この問題に対する簡単な解決策があるようです。
の
CMainFrame::OnPaint()
{
..
// バックグラウンド ウィンドウの DC を取得します
CWnd* pWnd = CWnd::FromHandle(m_hWndMDIClient) ;
CPaintDC dc1(pWnd) ;
//そして、この DC で draw または bitblt
}
ここは推測ですが、ON_WM_PAINT を扱ってみてください。