也许这是一个愚蠢的问题,我无法理解为什么我无法在以下代码中创建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()的调用返回一个NULL指针。然后,GetLastError()返回0! 有谁能猜到这里发生了什么事,拜托?
PS:在此之前没有调用内存分配或GDI例程...所以我认为应该排除内存泄漏。
答案 0 :(得分:6)
您错误地将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,但这不适用于指针。你必须先取消引用它。
答案 1 :(得分:4)
某些设备上下文不适用于CreateCompatibleDC()。 DC必须支持光栅操作。您可以将hdc提供给GetDeviceCaps()并检查RASTERCAPS。
但事实证明你所调用的GetDC是一个类的方法而不是我认为你的C绑定。 SoapBox有正确的答案。