CreateCompatibleDC() failure

CreateCompatibleDC() failure

本文关键字:failure CreateCompatibleDC      更新时间:2023-10-16

我正在使用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:

此函数返回指定对象的先前选择的对象 类型。应用程序应始终将新对象替换为 使用新对象完成绘制后的原始默认对象 对象。

我遇到了类似的问题,发现它是由从WM_CREATE调用CreateCompatibleDC引起的(在我的主窗口创建之前(。 我发现 GetDC(hwnd( 给了我一个主窗口的 HDC,但在WM_CREATE完成之前无法使用它。 我将代码重新定位到WM_PAINT并且我的代码运行良好。