我将win32用于2D动画。到目前为止,我的程序已加载从资源创建的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);
}

最佳答案

什么是SelectBitmap()
如果它是 SelectObject() 的包装器/别名,那么您正在泄漏位图。

SelectBitmap(hdcMem, bkgMain);

您应先将旧位图选择回DC中,然后再删除它:

10-02 09:48