SDI の背景色を変更するには,OnEraseBkgnd() にて処理を行う.
もともと背景色のデフォルトは白色なので黒を背景にした場合に非常にちらついてしまう.
(再描画を行う為)
そこで,OnEraseBkgnd() を処理して,親クラスの OnEraseBkgnd() を呼ばなければ背景を白で塗られることはない.
BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
CBrush * pOldBrush = (CBrush*)pDC->SelectStockObject( BLACK_BRUSH );
CRect rect;
pDC->GetClipBox( &rect );
pDC->PatBlt( rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject( pOldBrush );
return TRUE;
// return CView::OnEraseBkgnd(pDC);
}
ウィンドウクラスの登録時でも背景色の変更は可能である.
BOOL CFooView::PreCreateWindow(CREATESTRUCT& cs)
{
WNDCLASS wc;
GetClassInfo( AfxGetInstanceHandle(), "AfxFrameOrView40d", &wc );
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszClassName = "MyViewClass";
RegisterClass(&wc);
cs.lpszClass = wc.lpszClassName;
return CView::PreCreateWindow(cs);
}
しかしこれには注意が必要.
GetClassInfo() で使用するクラス名がコンパイルにより変わるからである.
AfxFrameOrView40d MFC ダイナミックリンク デバッグバージョン
AfxFrameOrView40 MFC ダイナミックリンク リリースバージョン
AfxFrameOrView40sd MFC スタティックリンク デバッグバージョン
AfxFrameOrView40s MFC スタティックリンク リリースバージョン
また AfxRegisterWndClass() にて背景ブラシが指定可能である.
BOOL MyWindow::OnEraseBkgnd(CDC* pDC)
{
// 描画色の例
const COLORREF colorBkgnd = RGB(0xFF, 0x00, 0x00);
CRect rectClip; // 描画すべき領域
const int nClip = pDC->GetClipBox( &rectClip );
if( nClip != ERROR && nClip != NULLREGION )
pDC->FillSolidRect( &rectClip, colorBkgnd );
return TRUE;
}
参照
MDI 親ウィンドウ背景色変更
FormView の背景色変更