Pregunta

Tal vez esto es una pregunta tonta, no veo por qué no puedo conseguir un DC creado en el código siguiente:

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

El mapa de bits hBMP está bien cargado y HDC tiene un valor válido. Pero la llamada a CreateCompatibleDC () devuelve un puntero NULL. Entonces, GetLastError () devuelve 0! Cualquiera puede adivinar lo que está pasando aquí, por favor?

PS: No hay asignaciones de memoria o rutinas GDI llamadas antes de éste ... así que creo que las pérdidas de memoria se deben descartar

.
¿Fue útil?

Solución

Se están emitiendo incorrectamente el resultado de GetDC() a un HDC. GetDC() devuelve un puntero a un objeto CDC.

Para hacer lo que desea, puede realizar una de las siguientes. Los primeros ataques elección más sobre cómo MFC le gusta hacer las cosas, pero ambos funcionan perfectamente:

CDC *pDC = GetDC();

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

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

Es importante tener en cuenta que la opción 2 no hace lo mismo que está haciendo actualmente mal. La clase CDC tiene un miembro operator HDC() que permite que sea convertido a un HDC, pero esto no se aplica al puntero. Debe eliminar la referencia en primer lugar.

Otros consejos

Ciertos contextos de dispositivo no funcionarán con CreateCompatibleDC (). El DC tiene para apoyar operaciones de trama. Se puede alimentar a la HDC a GetDeviceCaps () y RASTERCAPS de verificación.

Pero resulta que el GetDC que está llamando es un método en una clase y no la unión pensé que quería decir C. SoapBox tiene la respuesta correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top