Frage

Vielleicht ist dies eine dumme Frage, ich kann nicht sehen, warum ich keine DC erstellt im folgenden Code bekommen:

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

Das Bitmap HBMP geladen ist fein und hdc hat einen gültigen Wert. Aber der Ruf nach CreateCompatibleDC () gibt einen NULL-Zeiger. Dann GetLastError () 0 zurück! Jeder kann erraten, was hier vor sich geht, bitte?

PS: Es gibt keine Speicherzuordnungen oder Routinen GDI vor diesem namens ... so denke ich, Speicherlecks ausgeschlossen werden sollten

.
War es hilfreich?

Lösung

Sie werfen nicht ordnungsgemäß das Ergebnis GetDC() zu einem HDC. GetDC() gibt einen Zeiger auf ein Objekt CDC.

tun, was Sie möchten, können Sie eine der folgenden tun. Die erste Wahl passt mehr darüber, wie MFC mag Dinge zu tun, aber beide gut funktionieren:

CDC *pDC = GetDC();

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

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

Es ist wichtig zu beachten, dass die Option 2 nicht das gleiche tun, dass Sie zur Zeit falsch. Die CDC Klasse hat ein operator HDC() Element, das es zu sein umgewandelt in einen HDC erlaubt, aber dies auf den Zeiger gilt nicht. Sie müssen es zuerst dereferenzieren.

Andere Tipps

Bestimmte Gerätekontexte werden nicht mit CreateCompatibleDC () arbeiten. Die DC muss Rasteroperationen unterstützen. Sie können die hdc zu GetDeviceCaps Futtermittel () und die Prüfung RASTER.

Aber es stellt sich heraus, die GetDC Sie anrufen auf eine Klasse eine Methode und nicht die C-Bindung Ich dachte, Sie meinten. SoapBox hat die richtige Antwort.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top