初めまして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 ) ;
}
------------------------------------------------------------------------------
以上です。よろしくお願いします。
> return ((long)(HBRUSH)CreateSolidBrush(RGB(0,0,0))) ;
典型的なリソースリークですね。
背景を塗りつぶすたびに新しいブラシが作られ、
解放されること無く浪費されて行きます。
dairygoodsさんありがとうございます。
自分でも一晩考えてそこに到達しました。
ブラシを初期処理で作成し、戻り値に指定することで対応しました。
お手数をおかけしました。