OnCtlColorで作成したブラシの破棄方法 – プログラミング – Home

OnCtlColorで作成したブラシの...
 
通知
すべてクリア

[解決済] OnCtlColorで作成したブラシの破棄方法


ごん
 ごん
(@ごん)
ゲスト
結合: 23年前
投稿: 24
Topic starter  

いつもお世話になっております。
現在VC++6.0、Windows XPにて開発しています。

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

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

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


引用未解決
トピックタグ
ごん
 ごん
(@ごん)
ゲスト
結合: 23年前
投稿: 24
Topic starter  

すみません。書き漏れました。

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

メンバ変数が

HBRUSH

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

CBrush

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


返信引用
ごん
 ごん
(@ごん)
ゲスト
結合: 23年前
投稿: 24
Topic starter  

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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

白色のブラシなら、GetStockObject(WHITE_BRUSH)をつかうと破棄しなくてもいいですよ。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました