2

我正在使用 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);
}
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 回答