Last Updated 2004/07/15
Visual C++ MFC SDI
SDI 背景色変更
2004/07/15

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 の背景色変更
前後のTips
SDI 背景色変更

DSS ProgrammingTipsCGI Ver1.02