Domanda

Forse questa è una domanda sciocca, non riesco a capire perché non riesco a ottenere un DC creato nel seguente codice:

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

La bitmap HBMP va bene caricato e HDC ha un valore valido. Ma la chiamata a CreateCompatibleDC () restituisce un puntatore NULL. Poi, GetLastError () restituisce 0! Chiunque può indovinare che cosa sta succedendo qui, per favore?

PS: Non ci sono le allocazioni di memoria o routine GDI chiamati prima di questo ... quindi penso che le perdite di memoria dovrebbero essere escluse

.
È stato utile?

Soluzione

Si sta impropriamente colata il risultato di GetDC() a un HDC. GetDC() restituisce un puntatore ad un oggetto CDC.

Per fare ciò che si vuole si può fare una delle seguenti operazioni. I primi si inserisce scelta più in come MFC piace fare le cose, ma entrambi funzionano bene:

CDC *pDC = GetDC();

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

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

E 'importante notare che l'opzione 2 non fa la stessa cosa che si sta facendo male. La classe CDC ha un membro operator HDC() che gli permette di essere convertito in un HDC, ma questo NON si applica al puntatore. È necessario dereferenziarlo prima.

Altri suggerimenti

Alcuni contesti di periferica non funzioneranno con CreateCompatibleDC (). La DC deve supportare operazioni raster. È possibile alimentare il hdc a GetDeviceCaps () e RASTERCAPS di controllo.

Ma si scopre il GetDC si sta chiamando è un metodo su una classe e non vincolante ho pensato che volevi dire C. Soapbox ha la risposta giusta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top