2010-05-26 152 views
4

也許這是一個愚蠢的問題,我不明白爲什麼我不能讓一個DC在下面的代碼創建:與CreateCompatibleDC奇怪的錯誤

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(); 
    } 
    ... 
    ... 
    ... 

位圖骨形態發生蛋白是加載罰款和HDC具有有效值。但是對CreateCompatibleDC()的調用返回一個NULL指針。然後,GetLastError()返回0! 有人可以猜到這裏發生了什麼事嗎?

PS:在這個之前沒有調用內存分配或GDI例程......所以我認爲應該排除內存泄漏。

回答

4

您錯誤地將GetDC()的結果轉換爲HDCGetDC()返回指向CDC對象的指針。

要做你想做的事情,你可以做以下任一項。第一種選擇更適合到MFC怎麼喜歡做的事情,但都工作得很好:

CDC *pDC = GetDC(); 

// Option 1 
CDC memDC; 
memDC.CreateCompatibleDC(pDC); 

// Option 2 
HDC hMemDC = CreateCompatibleDC((HDC)(*pDC)); 

要注意的是選擇2不這樣做,你現在正在做什麼錯同樣的事情是很重要的。 CDC類有一個operator HDC()成員,允許將其轉換爲HDC,但這不適用於指針。你必須先解除引用。

+0

你是完全正確的。這是錯誤。感謝所有人的幫助! – sevaxx 2010-05-26 01:46:45

2

某些設備上下文無法與CreateCompatibleDC()一起使用。 DC必須支持光柵操作。您可以將HDC提供給GetDeviceCaps()並檢查RASTERCAPS。

但事實證明,你調用的GetDC是一個類的方法,而不是我認爲你的意思的C綁定。 SoapBox有正確的答案。

+0

GetDeviceCaps(hdc,RASTERCAPS)返回0 ....這是否表示不支持光柵操作? – sevaxx 2010-05-26 01:34:13

+0

@sevaxx:那麼,文檔說GetDeviceCaps(hdc,RASTERCAPS)應該返回其中一個着名的位域值,所以零似乎意味着沒有柵格功能。當我用普通的窗口DC運行它時,它返回0x7E99 – JustJeff 2010-05-26 01:58:35