2

私は2Dアニメーションにwin32を使用しています。これまでの私のプログラムは、リソースから作成されたHBITMAPオブジェクトの配列をロードします。以下のコードの「OnUpdate()」からCreateCompatibleDC()を呼び出すと、アニメーション中に問題が発生します。OnUpdate関数を何度も呼び出した後、HDCオブジェクトは作成されません(メモリに割り当てられていない可能性があります)。これにより、DeleteDC()が呼び出されてHDCオブジェクトが削除されると、予期しない結果が発生します。main.cppからの更新関数コードは次のとおりです。

    void OnUpdate(
             HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd,&ps);
    if(!hdc)
    {
        MessageBox(NULL, L"Failed to Create Compatible DC - 'hdc' in OnUpdate()", L"ALERT", MB_OK);
        PostMessage(hwnd, WM_DESTROY, NULL, NULL);
    }
    HPALETTE hpalT = SelectPalette(hdc,hpal,FALSE);

    BITMAP bm;
    HDC hdcMem = CreateCompatibleDC(hdc);
    if(!hdcMem)
    {
        MessageBox(NULL, L"Failed to CreateCompatibleDC - 'hdcMem' in OnUpdate()", L"ALERT", MB_OK);
        PostMessage(hwnd, WM_DESTROY, NULL, NULL);
    }
    SelectBitmap(hdcMem, bkgMain);
    GetObject(bkgMain, sizeof(bm), &bm);
    BitBlt(backDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

    // Clean up.
    if(!DeleteDC(hdcMem))
    {
        MessageBox(NULL, L"Failed to DeleteDC - 'hdcMem' in OnUpdate()", L"ALERT", MB_OK);
        PostMessage(hwnd, WM_DESTROY, NULL, NULL);
    }
    SelectPalette(hdc,hpalT,FALSE);
    EndPaint(hwnd,&ps);
}
4

2 に答える 2

3

SelectBitmap()ですか?それがラッパー/エイリアスであるSelectObject()場合は、ビットマップがリークしています。

SelectBitmap(hdcMem, bkgMain); 

削除する前に、古いビットマップを選択してDCに戻す必要があります。

この関数は、指定されたタイプの以前に選択されたオブジェクトを返します。アプリケーションは、新しいオブジェクトでの描画が終了した後、常に新しいオブジェクトを元のデフォルトのオブジェクトに置き換える必要があります。

于 2012-05-18T10:39:42.137 に答える
0

同様の問題が発生しましたが、これはWM_CREATEからCreateCompatibleDCを呼び出したことが原因であることがわかりました(メインウィンドウが作成される前)。GetDC(hwnd)がメインウィンドウ用のHDCを提供してくれたのですが、WM_CREATEが終了するまで使用できませんでした。コードをWM_PAINTに再配置しましたが、コードは正常に機能しました。

于 2021-12-27T19:54:47.630 に答える