2012-04-11 5 views
2

私はC++を使ってWindowsアプリケーションを開発しています。 LoadImageを使用してbmpファイルをDCにロードすると、正しく表示されます。しかし、DeleteObjectを呼び出すと、メモリが解放されていないように見えます。私はこれを行うWM_INITDIALOGの一部でLoadImageとDeleteObjectの使い方は?

(私はメモリ使用量を追跡するために、Windowsのタスクマネージャを使用):

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に表示され、メモリが増加します。そして、ボタンで私はそうです:

私がボタンを押すと、私は結果をチェックし、それは成功していますゼロ以外の値です。しかし、IDC_PICTUREはまだ画像を表示し、メモリは同じままです。 SendMessage()がhBitmapのrefカウントを増加させるかどうか疑問に思っています...

私の質問は次のとおりです。どのような方法でクリーンアップできますか?

+1

タスクマネージャは、漏れているかどうかを確認するのには適していません。永遠に走るループに入れて、メモリが足りなくなったかどうか確認してください。 –

答えて

1

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

Windows XPの場合、STM_SETIMAGEメッセージで渡されたビットマップに0以外のアルファベットのピクセルが含まれていると、スタティックコントロールはビットマップのコピーを取ります。このコピーされたビットマップは、次のSTM_SETIMAGEメッセージによって戻されます。クライアントコードはスタティックコントロールに渡されるビットマップを個別に追跡することがありますが、STM_SETIMAGEメッセージから返されたビットマップをチェックして解放しないと、ビットマップがリークします。

これは、Windows XPだけでなく、それ以降のバージョンのWindowsにも当てはまります。これがあなたを助けることを願っています。

+0

ありがとう!!それはまさに何が起こっているのかです。しかし、リソースを扱うこのような奇妙な方法... "このコピーされたビットマップは、次のSTM_SETIMAGEメッセージによって返されます"。別のSTM_SETIMAGEを送信したくない場合はどうすればいいですか? – laishiekai

+0

元の戻り値を覚えておき、イメージを取り除く準備ができたらそれを送り返すことができます。 –

関連する問題