背景の色が一定時間をすぎると変わらない – プログラミング – Home

背景の色が一定時間をすぎると変わらない
 
通知
すべてクリア

[解決済] 背景の色が一定時間をすぎると変わらない


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

初めましてWTといいます。
開発環境Win2000,VC++6.0 SDKでプログラムを行っているのですが、一定以上の時間起動
し続けるとCreateWindowExで作成したSTATICコントロールの背景の色が変更できなくなっ
てしまいます。また、ステータスバーが透明(再描写されていない?)状態になってしま
います。
これにはどのような理由が考えられるでしょうか?
ソースは以下のような感じです。
------------------------------------------------------------------------------
LRESULT CALLBACK WndDispPrc(HWND hChdWnd, UINT msg, WPARAM wp, LPARAM lp)
{

「「「「変数宣言部省略」」」」」」

switch (msg) {

/***************************/
// ウィンドウ作成時
/
************************/
case WM_CREATE:
// フォントを作成
「「「「「省略」」」」」」
//==================================================
// 画面の各パーツを作成
//==================================================
hLabelWnd = CreateWindowEx(0,
STATIC,

",
dwStyle |
SS_CENTER,
20,

10,
100,

25,

hChdWnd,

IDC_SD_LBL_JYOTAI,
phInstance,

NULL) ;

「「「「「省略」」」」」」

/************************/
// コントロールの色設定
/
************************/

case WM_CTLCOLORSTATIC:

// テキスト背景は透明
SetBkMode((HDC)wp, TRANSPARENT) ;
for (idx = 0 ; idx < SERIDAI_MAX ; idx++) {
if (pDispData[idx].hWnd == hChdWnd) { break ; }
}
if ( (HWND)lp == GetDlgItem(hChdWnd, IDC_SD_LBL_JYOTAI) ) {
idx = 0 ;
for (idx = 0 ; idx < SERIDAI_MAX ; idx++) {
if (pSeridaiData[idx].hWnd == hChdWnd) {
break ;
}
}
switch( pSeridaiSeriInfo[idx].status )
{
case 0:
SetTextColor((HDC)wp, RGB(255,255,255)) ;
return ((long)(HBRUSH)CreateSolidBrush(RGB
(0,0,0))) ;
break ;
case 1:
SetTextColor((HDC)wp, RGB(255,255,255)) ;
return ((long)(HBRUSH)CreateSolidBrush(RGB
(0,0,0))) ;
break ;
「「「「「省略」」」」」」
}
}
// デフォルト背景は子画面の背景と同じ
return ((long)(HBRUSH)GetStockObject(LTGRAY_BRUSH)) ;
break ;
/************************/
// 再描画
/
************************/
case WM_PAINT:
hDC = BeginPaint(hChdWnd, &ps) ;
EndPaint(hChdWnd, &ps) ;
break ;
/
************************/
// ウィンドウ破棄
/
************************/
case WM_DESTROY:
// 画面生成時に作成したオブジェクトの削除を行う

// フォント削除
DeleteObject(hLblFont) ;

DefWindowProc(hChdWnd, msg, wp, lp) ;
break ;

/************************/
// 電文受信時の処理
/
***************************/
case CASE_A:
//==============================
// 画面表示
//==============================
// せり情報インデックス取得
idx = wp ;
// ミューテックス取得
dwRes = WaitForSingleObject(pMutex[idx].hMutex, INFINITE) ;
if ( dwRes == WAIT_FAILED ) {
break ;
}

// ステータス
SetWindowText(GetDlgItem(hChdWnd, IDC_SD_LBL_JYOTAI)
, getSeriSttsStr_dai(pJotaiInfo
[idx].status)) ;
「「「省略」」」

// 画面更新
InvalidateRect(hChdWnd, NULL, FALSE) ;
UpdateWindow(hChdWnd) ;

// ミューテックス解放
ReleaseMutex(pMutex[idx].hMutex);
break ;
「「「「「省略」」」」」」
default:
return (DefWindowProc(hChdWnd, msg, wp, lp)) ;
}

return ( 0L ) ;
}

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

以上です。よろしくお願いします。


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

> return ((long)(HBRUSH)CreateSolidBrush(RGB(0,0,0))) ;

典型的なリソースリークですね。
背景を塗りつぶすたびに新しいブラシが作られ、
解放されること無く浪費されて行きます。


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

dairygoodsさんありがとうございます。
自分でも一晩考えてそこに到達しました。
ブラシを初期処理で作成し、戻り値に指定することで対応しました。
お手数をおかけしました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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