Viewクラスの背景色について

[戻る]
なお 2007/07/11(水) 17:34:10
お世話になります。なおと申します。
みなさんにご教示していだたきく、投稿させていただきました。

現在このような環境で、プログラムを組んでいます。
-----------------------------------------------------------------
WinXP+sp2 VS2005 MFC SDI

-----------------------------------------------------------------

現在、CMainFrame内において、複数のViewに分割しているのですが、このすべての
Viewに対して、背景色を変更したいと考えております。

色々なサイトなどをみたのですが、MainFrm.cpp内のPreCreateWindow内で、

CBrush m_brsh;

BOOL bret = m_brsh.CreateSolidBrush(RGB(0,0,0));

cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS,
                AfxGetApp()->LoadStandardCursor(IDC_ARROW),m_brsh,
               AfxGetApp()->LoadIcon(IDR_MAINFRAME));

と記述すれば背景色が変わるらしいのですが、変わりませんでした。


気になった事があったのですが、前にView事に背景色を変更しようと思った時に

***View::OnEraseBkgnd を使用して背景色の変更を試みたのですが、プログラムを
実行すると背景色が指定した色に変化していました。
しかし、そのViewに対して文字などを表示させると背景色が一行ずつ元の色(白色)
に戻っていってしまいます。
現在フォントの色も変更しているのですが、

***View::CtlColorを使用しています。
   pDC->SetTextColor(RGB(32,255,96));

      return (HBRUSH)GetStockObject(BLACK_BRUSH); ///この部分のBLACK_BRUSH

このGetStockObjectの引数は現在WHITE_BRUSHになっています。
これが、悪さをしているのでしょうか?

コメントアウトしたBLACK_BRUSHの部分なのですが、プログラムを起動した時は、
背景色は黒になるのですが、文字などを表示させると上に書いたのと同じ現象がおこります。
再描画関係ですかね・・。

長くなってしまったので、実現したい事をスマートに記載します。

プログラムを起動した直後に分割されているすべてのViewの背景色を黒で表示したいです。
もちろん文字などを表示させても背景色は変更しないようにしたいです。

みなさん ご教示宜しくお願いいたします。

たいちう 2007/07/11(水) 18:34:10
> 長くなってしまったので、実現したい事をスマートに記載します。
> 
> プログラムを起動した直後に分割されているすべてのViewの背景色を黒で表示したいで
す。
> もちろん文字などを表示させても背景色は変更しないようにしたいです。

これだけで良くない?

BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetClientRect(rect);
    pDC->FillSolidRect(rect, RGB(0, 0, 0));
    return FALSE;
}

void CMyView::OnDraw(CDC* pDC)
{
    pDC->SetTextColor(RGB(255, 0, 0));
    pDC->TextOut(10, 10, "sample text");
}

なお 2007/07/11(水) 19:21:23
たいちうさん ご回答ありがとうございます。

先ほど記述し忘れていたのですが、EditViewクラスを使用しています。

たいちうさんのご指摘通りに

>BOOL CMyView::OnEraseBkgnd(CDC* pDC)
>{
>    CRect rect;
>    GetClientRect(rect);
>    pDC->FillSolidRect(rect, RGB(0, 0, 0));
>    return FALSE;
>}

このようにOnEraseBkgndの中に記述した所、プログラムを起動すると
背景色は黒色になっていました。
しかし、文字を表示させるとその文字を表示させた一行だけの背景色が白色に
なってしまいます。2行表示させると2行目も白色になり、その内すべてが白色に
なっていってしまいます。

CEditViewなので、OnDrawを使用しておらず、=WM_CTLCOLORのCtlColorを使用して
います。

メッセージをViewに表示させることに白色の背景色で塗りつぶしていっているような
動きに見えるのですが・・。 わからないです。

ご教示宜しくお願いいたします。

たいちう 2007/07/11(水) 19:59:18
今、MFCを使える環境にないので試せませんが、
SetBkColorやSetBkModeで何とかなりませんか?

あと、「CEditView 背景色」でぐぐると、参考になるかも。

たいちう 2007/07/12(木) 09:32:24
ここの変更だけで良さそう。

HBRUSH CMyView::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
    pDC->SetBkColor(RGB(0, 0, 0));
    pDC->SetTextColor(RGB(0, 0, 255));
    return static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
}

なお 2007/07/12(木) 10:17:45
たいちうさん ご回答ありがとうございます。

返答遅れてしまって申し訳ありません。

>HBRUSH CMyView::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
>{
>    pDC->SetBkColor(RGB(0, 0, 0));
>    pDC->SetTextColor(RGB(0, 0, 255));
>    return static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
>}

たいちうさんのご指摘通り

pDC->SetBkColorを追加した所、文字をViewに出力したら背景色が固定されたまま
文字が表示されました。

ここは戻り値をstatic_castにしなければいけないのでしょうか?

たいちう 2007/07/12(木) 12:04:47
> ここは戻り値をstatic_castにしなければいけないのでしょうか?

HGDIOBJとHBRUSHは型が違うので、キャストをしないとエラーになります。
return (HBRUSH)GetStockObject(BLACK_BRUSH);と書かなかったのは、
(括弧)を使ったキャストは何でもありの古いキャストなので、
使わない方が良いと認識しているからです。

なお 2007/07/12(木) 13:00:03
[[解決]]
たいちうさん、ご回答ありがとうございます。

おかげさまで、上手く動きました。ありがとうございます。
またなにかありましたら、宜しくお願いいたします。

古いスレッドには追加発言できません。