Windows2000 SP4 VC++6.0 MFC
初めまして。
ボタンを押すとBMPを読み込みPictureboxに表示させているのですが、
何回も上の処理をするとメモリがたまってしまいます。
10Mずつくらいの割合で増えます。
(windowsタスクマネージャーで確認済み)
メモリ解放を行っているつもりですが、どこか見逃しているようです。
どなたかご教授お願いします。
void CTest::BMPOPEN(CString FilePass)
{
CRect ClientRect;//フォームのクライアント領域を取得する
CDC* pDC;//メモリデバイスコンテキストの取得と作成
GetDlgItem(IDC_MASTER1)->GetClientRect(ClientRect);
//メモリデバイスコンテキストの取得と作成
pDC = GetDlgItem(IDC_MASTER1)->GetDC();
//ビットマップファイルを読み込むためにCBitmapクラスオブジェクトを作成
BITMAP BMP;
RECT rectt;
HBITMAP h_BMP = (HBITMAP)LoadImage(
AfxGetApp()->m_hInstance, // ロードするインスタンスハンドル
_T(FilePass), // ロードする画像ファイル名
IMAGE_BITMAP, // ロードする画像ファイルのタイプ
0, // アイコンやカーソルの幅をピクセル
0, // 高さ(上に同じ)
LR_LOADFROMFILE); //
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
//ビットマップオブジェクトを選択
HBITMAP h_OLD_BMP = (HBITMAP)::SelectObject( MemDC.m_hDC, h_BMP );
//ビットマップの情報を取得
::GetObject(h_BMP,sizeof(BITMAP),&BMP);
GetDlgItem(IDC_DISPLAY)->GetWindowRect(&rectt);
ScreenToClient(&rectt);
int DISPLAYWIDTH = rectt.right-rectt.left; //560 座標で表したBMP幅
int DISPLAYHEIGHT = rectt.bottom-rectt.top;//465 座標で表したBMP高さ
//座標からピクセルに変換処理
//ピクセルXYの倍率を求める
float PixelX_Bai = (float)BMP.bmWidth / (float)DISPLAYWIDTH;
float PixelY_Bai = (float)BMP.bmHeight / (float)DISPLAYHEIGHT;
float BMP_haba=((float)lastP.x - (float)startP.x)*PixelX_Bai;
float BMP_takasa=((float)lastP.y - (float)startP.y)*PixelY_Bai;
int haba=Int_Float(BMP_haba);
int takasa=Int_Float(BMP_takasa);
//スタート位置をピクセルに変換
float sabun_X=(float)rectt.left;
float sabun_Y=(float)rectt.top;
float start_X=((float)startP.x-sabun_X)*PixelX_Bai;
float start_Y=((float)startP.y-sabun_Y)*PixelY_Bai;
int za_haba=Int_Float(start_X);
int za_takasa=Int_Float(start_Y);
//画像を縮小する&アイテム配置
pDC->StretchBlt(
0, // 転送先のBMPの左上隅の論理x座標
0, // 転送先のBMPの左上隅の論理y座標
ClientRect.right, // 転送先のBMPの幅
ClientRect.bottom, // 転送先のBMPの高さ
&MemDC, // CDCオブジェクトのポインタ
za_haba, // 転送元のBMPの左上隅の論理x座標 0
za_takasa, // 転送元のBMPの左上隅の論理y座標 0
haba, // 転送元のBMPの幅 (ピクセル)
takasa, // 転送元のBMPの高さ(ピクセル)
SRCCOPY); // ラスタオペレーションコード
// オブジェクトを元に戻す
::SelectObject(MemDC.m_hDC, h_OLD_BMP );
MemDC.DeleteDC();
//メモリ解放
ReleaseDC(pDC);
}
ビットマップを削除していないようです。
DeleteObject(h_BMP);
を追加したらメモリー解放無事完了しました。
dairygoodsさんありがとうございます。