すみません とっても初心者です。
画面にstaticを10個ほど貼り、背景色を変更しました。
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if( nCtlColor==CTLCOLOR_STATIC ){
if( pWnd==&m_static01 ){
pDC->SetBkMode( TRANSPARENT );
return CreateSolidBrush( RGB(255,255,255) );
}else if …
}
で、最初はちゃんと出てるのですが、そのウインドウの上を通過しつづけるプログラム
(再表示のテストするためのプログラムです)を動かすと
3分ぐらいで色が出なくなったり 画面がおかしくなったりしてしまいます。
上の方法で色を変えるのはダメなのでしょうか?
ご存知の方がいらしたら教えて下さい。
>return CreateSolidBrush( RGB(255,255,255) );
これ、やったらダメなんです。リソースリークしています。
この関数にくるたびにブラシをつくり続けてしまうというわけです。
ブラシをメンバ変数にもってあげて、それを返してあげれば
簡単です。
>ブラシをメンバ変数にもってあげて、それを返してあげれば
>簡単です。
追記です。
ブラシをメンバに持つ。
CBrush m_brush;
ダイアログならOnInitDialog()あたりで
ビューならOnInitialUpdate()あたりで
m_brush.CreateSolidBrush( RGB(255,255,255) );
とします。
あと、デストラクタで
m_brush.DeleteObject();
としておけばよいと思います。
ここは
if( nCtlColor==CTLCOLOR_STATIC ){
if( pWnd==&m_static01 ){
pDC->SetBkMode( TRANSPARENT );
retur m_brush;
// return CreateSolidBrush( RGB(255,255,255) );
}else if …
}
です。
すばやいご返答 ありがとうございます。
試してみましたところ、OKでした。
本当に ありがとうございました。
解決されたというコトですが、別な一例。
>RGB(255,255,255)
白ですよね。
return static_cast<HBRUSH>( ::GetStockObject( WHITE_BRUSH));
これは、「システムが最初から持っている白のブラシ」を返してあげる
という別解です。
ウィンドウのデフォルト色という意味での白であれば答はまだ違ってきますが。