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并且我的代码运行良好。
相关文章:
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 实现多类型算术运算符时如何解决"template argument deduction/substitution failure"
- Failure for Gdiplus::Bitmap::FromHICON
- 如何在Visual Studio中查看static_assert 'failure source'?
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- C++ 异常处理:异常与 ifstream::failure
- 动态数组"error code unspecified launch failure"
- C++指向对象删除的指针数组,"Debug assertion failure!"
- 为什么 getline() 在异常掩码未设置为 eofbit 时抛出'std::ios_base::failure'?
- "candidate template ignored: substitution failure:"编译器错误?
- Cython C++ 未定义对 std::ios_base::failure 的引用
- CreateCompatibleDC() failure
- ADODB::_RecordsetPtr::GetRecordCount() failure
- Catch-ios::failure保持循环
- 抛出 what() 的实例后调用的终止 'std::ios_base::failure': 基本
- Failure to find MyClass.cpp
- c++ Inline Function throw Exception: Run-Time Check Failure
- OpenProcess Failure (SeDebugPrivilege?)
- 相当于 "bool DllMain()" 的 c/c++ Linux - 但我需要将 failure 返回给 dlopen()
- c++ 收到错误"Run-Time check failure #2 - stack around variable sub was corrupted"