2

私は C++ で Windows アプリケーションに取り組んでいます。LoadImage を使用して bmp ファイルを DC にロードすると、正しく表示されます。ただし、DeleteObject を呼び出すと、メモリが解放されないようです。(Windowsタスクマネージャーを使用してメモリ使用量を追跡しています)

WM_INITDIALOG 部分で、私はこれを行います:

static HBITMAP hBitmap = 0;
char* tempPath = "tabView.bmp";  
hBitmap = (HBITMAP)LoadImage(NULL,
                             tempPath,  // file containing bitmap
                             IMAGE_BITMAP,  // type = bitmap
                             0, 0,      // original size
                             LR_LOADFROMFILE);      // get image from a file
if(hBitmap)
{
    SendMessage(GetDlgItem(hwndDlg, IDC_PICTURE),
                STM_SETIMAGE,         // message to send
                (WPARAM)IMAGE_BITMAP, // bitmap type
                (LPARAM)hBitmap);     // bitmap handle
}

そのため、画像が DC に表示され、メモリが増加します。そしてボタンで私は:

int result = DeleteObject(hBitmap);

ボタンを押して結果を確認したところ、ゼロ以外の値だったので成功です。ただし、IDC_PICTURE は引き続き画像を表示し、メモリは同じままです。SendMessage() が hBitmap の参照カウントを増やす可能性があるかどうか疑問に思っています...

だから私の質問は次のとおりです。クリーンアップする適切な方法は何ですか?

4

1 に答える 1

1

使用しているWindowsのバージョンについては言及していません。とにかく、 STM_SETIMAGEの「重要な」部分を読むと、次に表示されます。

Windows XPでは、STM_SETIMAGEメッセージで渡されるビットマップにゼロ以外のアルファを持つピクセルが含まれている場合、静的コントロールはビットマップのコピーを取得します。このコピーされたビットマップは、次のSTM_SETIMAGEメッセージによって返されます。クライアントコードは、静的コントロールに渡されたビットマップを個別に追跡できますが、STM_SETIMAGEメッセージから返されたビットマップをチェックして解放しない場合、ビットマップはリークされます。

たぶん、これはWindows XPだけでなく、それ以降のバージョンのWindowsにも当てはまります。これがお役に立てば幸いです。

于 2012-04-11T20:02:12.363 に答える