• 締切済み

MFC FormViewの背景色

MFCで開発してます。 CFormViewのクライアント領域を4分割して、右上だけ背景色を他の領域とは違う色にしたいのですが、 InvalidateRect(NULL, TRUE)の後のOnEraseBkgnd()とOnDraw()で、FillSolidRect()で右上だけ塗りつぶしても色が変わりません。 何が原因と考えられるでしょうか? よろしくお願いします。

みんなの回答

回答No.2

 こんばんは。  一つのCFormViewの中の右上と言う事でしょうか。  恐らく、OnEraseBkgnd()辺りが悪さをしているのではないでしょうか。  その他、座標計算が間違っている事も考えられます。  取り敢えずは、OnEraseBkgnd()を削って見ては如何でしょう。  以下はOnDraw()のみオーバーライドして確認しています。参考になれば。 void CMyFormView::OnDraw(CDC* pDC) { // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 RECT rc = {0}; //クライアント領域を取る this->GetClientRect(&rc); //座標を右上に設定 rc.left = rc.right / 2; rc.bottom/= 2; //緑色で塗ってみる pDC->FillSolidRect(&rc, 0xff00); }

real_neo
質問者

お礼

ありがとうございます。 最初はOnDraw()の中で塗りつぶしてたんですけど、うまくいかないので、 OnEraseBkgnd()をオーバーライドしてみました。 4分割でうまくいかないので、2分割でやってみると、これはうまくいきました。 FillSolidRect()に渡すパラメータがおかしいのかなぁ。 何度も見直したんですけど。。。 ちなみに塗りつぶす順番は、左上→右上→左下→右下です。 もう少し調べてみます。

回答No.1

>InvalidateRect(NULL, TRUE)の後のOnEraseBkgnd()とOnDraw()で、 >FillSolidRect()で右上だけ塗りつぶしても色が変わりません。 InvalidateRect()で無効化したウィンドウはOnPaint()で描画します。(言い換えれば、InvalidateRect()するとOnPaint()が発生し、OnPaint()の処理を書き換えずにデフォルトの処理のままにすると、デフォルトの背景しか描画されず、OnPaint()以外で行った描画はすべて「無かった事」になります) また、OnEraseBkgnd()は、ウィンドウをリサイズした際にしか呼ばれません。 さらに http://www.bnote.net/sdk_mfc/mfc1.shtml には 「SDIやMDIアプリケーションの描画処理は OnDraw() で行い(印刷や印刷プレビューも)。 ダイアログベースでは OnPaint()で描画処理を行うようです。 」 と書いてあります。

real_neo
質問者

お礼

ありがとうございます。 参考にさせていただきます。

関連するQ&A