Question

Peut-être est une question stupide, je ne vois pas pourquoi je ne peux pas obtenir un DC créé dans le code suivant:

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

Le bitmap hBmp est bien chargé et hdc a une valeur valide. Mais l'appel à CreateCompatibleDC () renvoie un pointeur NULL. Puis, retourne GetLastError () 0! Tout le monde peut deviner ce qui se passe ici, s'il vous plaît?

PS: Il n'y a pas de mémoire ou allocations routines GDI appelé avant celui-ci ... donc je pense que les fuites de mémoire devraient être exclues

.
Était-ce utile?

La solution

Vous coulée de manière incorrecte le résultat de GetDC() à un HDC. GetDC() renvoie un pointeur vers un objet CDC.

Pour faire ce que vous voulez, vous pouvez le faire soit de ce qui suit. Le premier choix appartient plus sur la façon dont MFC aime faire les choses, mais les deux fonctionnent très bien:

CDC *pDC = GetDC();

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

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

Il est important de noter que l'option 2 ne fait pas la même chose que vous faites actuellement mal. La classe CDC a un membre de operator HDC() qui lui permet d'être converti en un HDC, mais cela ne vaut pas au pointeur. Vous devez déréférencer d'abord.

Autres conseils

Certains contextes de l'appareil ne fonctionnent pas avec CreateCompatibleDC (). Le DC doit prendre en charge les opérations de trame. Vous pouvez nourrir les hdc GetDeviceCaps () et contrôle RASTERCAPS.

Mais il se la GetDC vous appelez est une méthode sur une classe et non la C liant je pensais que vous vouliez dire. SoapBox a la bonne réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top