OnCtlColorで作成したブラシの破棄方法

[戻る]
ごん 2011/09/09(金) 09:37:54
いつもお世話になっております。
現在VC++6.0、Windows XPにて開発しています。

暫くアプリを動かしていると、OnCtlColorで設定した背景色が
グレイになってしまうという現象が発生しています。

調べたところこちらの掲示板に以下のように対応策が記載されていました。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200403/04030054.txt
 >生成したブラシをそのまま返しているので,ブラシは破棄されずにリークし,
 >結果としてGDIリソースを使い切ってしまうのでしょう。
 >ブラシをクラスのメンバに持たせて,ちゃんと破棄できるようにする必要があります。

調べましたが具体的な記述がわかりません・・・。
どなたかご教授お願い致します。

ごん 2011/09/09(金) 09:52:59
すみません。書き漏れました。

1.メンバ変数を定義する。
2.OnInitDialogでブラシを作成する。
3.OnCtlColorでOnInitDialogで作成したブラシを使用する。

ここまでは合っていますでしょうか?
その後,どの部分でブラシの破棄をすればいいのかわかりません。

Blue 2011/09/09(金) 10:03:24
メンバ変数が

HBRUSH

であれば、OnDestoryとかで破棄する必要がありそうです。

CBrush

であれば、デストラクタが破棄してくれるので特に何もやらなくていいです。

ごん 2011/09/09(金) 10:28:15
[[解決]]
Blueさんありがとうございます。

CBrushでメンバ変数を作成し,破棄は省略しました。
背景がグレイにならないようになりました!
HBRUSHとCBrush,勉強しなくてはいけませんね・・・。

以下のようにしてみました。
<<MainDlg.h>>
    CBrush m_brWhite;

<<MainDlg.cpp>>
BOOL MainDlg::OnInitDialog()
{
    m_brWhite.CreateSolidBrush(RGB(255,255,255));
}

HBRUSH MainDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if (nCtlColor == CTLCOLOR_STATIC) {
        pDC->SetBkMode(TRANSPARENT);
        if (pWnd == &m_edit1) {
//          return ::CreateSolidBrush(RGB(255,255,255));
            return(HBRUSH)m_brWhite;
        }
    }
    return hbr;
}

Blue 2011/09/09(金) 10:34:02
白色のブラシなら、GetStockObject(WHITE_BRUSH)をつかうと破棄しなくてもいいですよ。

GetStockObject
http://msdn.microsoft.com/ja-jp/library/cc410411.aspx

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