背景の色が一定時間をすぎると変わらない

[戻る]
WT 2005/09/12(月) 21:10:06
初めまして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 2005/09/12(月) 21:59:23
>  return ((long)(HBRUSH)CreateSolidBrush(RGB(0,0,0))) ;

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

WT 2005/09/13(火) 10:36:08
[[解決]]
dairygoodsさんありがとうございます。
自分でも一晩考えてそこに到達しました。
ブラシを初期処理で作成し、戻り値に指定することで対応しました。
お手数をおかけしました。

古いスレッドには追加発言できません。