我正在使用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);
}
答案 0 :(得分:3)
什么是SelectBitmap()
?
如果它是SelectObject()
的包装/别名,那么你就是在泄漏一个位图。
SelectBitmap(hdcMem, bkgMain);
在删除之前,您应该将旧位图选回DC:
此函数返回先前选定的指定对象 类型。应用程序应始终使用。替换新对象 完成使用new绘制后的原始默认对象 对象