也许这是一个愚蠢的问题,我看不出为什么我无法在以下代码中创建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绑定。肥皂盒有正确的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top