我将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中,然后再删除它: