0

だから、私はWinAPIに非常に慣れていないので、矢印キーで移動できるスプライトをロードすることに成功しました。私の先生は、「メモリ リーク」に非常に注意するように私に言いました。コンソール プログラミングを行っていたときに C++ がメモリを解放してくれたため、正しい方法でメモリを解放する方法がわかりません。プログラムを実行したところ、キャラクターをしばらく動かした後、コンピューターが 1 分間フリーズしたので、何か間違ったことをしたと思います。メモリを適切に解放する方法 (間違っていた場合) と、最適化が必要なビットマップ メソッドに問題があるかどうかを教えてもらえますか? ありがとう!これがコードです。

void LoadAndBlitBitmap(LPCSTR szFileName, HWND hwnd, HDC winDC, int xPos, int yPos)
{
//DEFINITIONS

/*TransparentBlt(destDC, destXpos, destYpos, sizeX, sizeY, srcDC, 0, 0, sizeX, sizeY, RGB(a, b, c)) = TRANSPARENT BITMAP BLIT. Ex. RGB(255, 255, 255) if background is white*/
/*BitBlt(destDC, destXpos, destYpos, sizeX, sizeY, srcDC, 0, 0, SRCCOPY);                           = SOLID BITMAP BLIT WITH NO TRANSPARENCY*/ 

//END DEFINITIONS

//-----Get the size of the window---------
RECT rect;
int win_width   = 0;
int win_height  = 0;
if(GetWindowRect(hwnd, &rect))
{
    win_width   = rect.right - rect.left;   //Subtracting the right coordinate with the left gives the width
    win_height  = rect.bottom - rect.top;   //Subtracting the bottom coordinate with the top gives the height
}
//----------------------------------------

HDC     hdcMem  = CreateCompatibleDC(winDC);                                //Create the DC that will hold the off-screen printing. (Double Buffering "Anti-Flicker" Method)
HBITMAP hbmMem  = CreateCompatibleBitmap(winDC, win_width, win_height);     //Create the bitmap with the size of the window
HANDLE  hOld    = SelectObject(hdcMem, hbmMem);                             //Set the paintable bitmap to the off-screen DC


//Draw to the off-screen DC
HBITMAP bitmap = (HBITMAP)LoadImage(NULL, szFileName, IMAGE_BITMAP, 69, 69, LR_LOADFROMFILE);       //Load the .bmp from a file
HDC blockDC = CreateCompatibleDC(NULL);                                                             //Create a DC to hold the .bmp
SelectObject(blockDC, bitmap);                                                                      //Select the .bmp to the DC
TransparentBlt(hdcMem, xPos, yPos, 69, 69, blockDC, 0, 0, 69, 69, RGB(255, 255, 255));              //Blit the .bmp to the DC*/


//Transfer off-screen DC to the screen
BitBlt(winDC, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);

// Uninitialize and deallocate resources
SelectObject(hdcMem, hOld);
DeleteDC(hdcMem);
SelectObject(blockDC, hOld);
DeleteDC(blockDC);
DeleteObject(bitmap);
}
4

1 に答える 1

2

次の 2 つの点が間違っています。

SelectObject(blockDC, hOld);

hOldから来たのではなくblockDC、から来たhdcMem。から古いビットマップを保存していませんblockDC。への変更:

HBITMAP hOld2 = SelectObject(blockDC, bitmap);
// and
SelectObject(blockDC, hOld2);

hbmMem第二に、どこにも削除していません。下部に、次を追加します。

DeleteObject(hbmMem);

実際には、3 つ目の点も間違っています。API 呼び出しの失敗をチェックしていません。CreateCompatibleDCNULL が返されるかどうかを確認し、そうであれば中止してクリーンアップする必要があります。

于 2013-09-25T23:30:28.107 に答える