createCompatibledc的奇怪错误
-
04-10-2019 - |
题
也许这是一个愚蠢的问题,我看不出为什么我无法在以下代码中创建DC:
HBITMAP COcrDlg::LoadClippedBitmap(LPCTSTR pathName,UINT maxWidth,UINT maxHeight)
{
HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, pathName, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if (!hBmp)
return NULL;
HDC hdc = (HDC)GetDC();
HDC hdcMem = CreateCompatibleDC(hdc);
if (!hdcMem)
{
DWORD err = GetLastError();
}
...
...
...
位图HBMP加载良好,HDC具有有效的值。但是对CreateCompatibledc()的呼叫返回一个空指针。然后,getlastror()返回0!有人可以猜测这里发生了什么事吗?
PS:在此之前没有记忆分配或GDI例程...因此,我认为应该排除内存泄漏。
解决方案
您正在不当地施放 GetDC()
到一个 HDC
. GetDC()
将指针返回到 CDC
目的。
要做您想做的事情,您可以做以下任一项。第一选择更适合MFC喜欢做事,但两者都可以正常工作:
CDC *pDC = GetDC();
// Option 1
CDC memDC;
memDC.CreateCompatibleDC(pDC);
// Option 2
HDC hMemDC = CreateCompatibleDC((HDC)(*pDC));
重要的是要注意,选项2没有做与当前做错事的相同的事情。这 CDC
班级有一个 operator HDC()
可以将其转换为HDC的成员,但这不适用于指针。您必须先解释它。
其他提示
某些设备上下文无法与CreateCompatibledc()一起使用。 DC必须支持栅格操作。您可以将HDC馈送到GetDeviceCaps()并检查rastercaps。
但事实证明,您要调用的GETDC是一类方法,而不是我认为您的意思的C绑定。肥皂盒有正确的答案。
不隶属于 StackOverflow