staticの色を変えたが画面がおかしくなるのですが? – プログラミング – Home

staticの色を変えたが画面がおかし...
 
通知
すべてクリア

[解決済] staticの色を変えたが画面がおかしくなるのですが?


hir
 hir
(@hir)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

すみません とっても初心者です。
画面に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分ぐらいで色が出なくなったり 画面がおかしくなったりしてしまいます。
上の方法で色を変えるのはダメなのでしょうか?
ご存知の方がいらしたら教えて下さい。


引用未解決
トピックタグ
kai
 kai
(@kai)
ゲスト
結合: 23年前
投稿: 64
 

>return CreateSolidBrush( RGB(255,255,255) );

これ、やったらダメなんです。リソースリークしています。
この関数にくるたびにブラシをつくり続けてしまうというわけです。

ブラシをメンバ変数にもってあげて、それを返してあげれば
簡単です。


返信引用
kai
 kai
(@kai)
ゲスト
結合: 23年前
投稿: 64
 

>ブラシをメンバ変数にもってあげて、それを返してあげれば
>簡単です。

追記です。

ブラシをメンバに持つ。
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  …
 }

です。


返信引用
hir
 hir
(@hir)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

すばやいご返答 ありがとうございます。
試してみましたところ、OKでした。
本当に ありがとうございました。


返信引用
Shimura
 Shimura
(@Shimura)
ゲスト
結合: 22年前
投稿: 36
 

解決されたというコトですが、別な一例。

>RGB(255,255,255)
白ですよね。

return static_cast<HBRUSH>( ::GetStockObject( WHITE_BRUSH));

これは、「システムが最初から持っている白のブラシ」を返してあげる
という別解です。

ウィンドウのデフォルト色という意味での白であれば答はまだ違ってきますが。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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