2010-05-26 5 views
4

Peut-être que c'est une question stupide, je ne vois pas pourquoi je ne peux pas obtenir un DC créé dans le code suivant:erreur étrange avec 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(); 
    } 
    ... 
    ... 
    ... 

Le bitmap hBmp est bien chargé et hdc a une validité valeur. Mais l'appel à CreateCompatibleDC() renvoie un pointeur NULL. Ensuite, GetLastError() renvoie 0! Tout le monde peut deviner ce qui se passe ici, s'il vous plaît? PS: Il n'y a pas d'allocation de mémoire ou de routines GDI appelées avant celle-ci ... donc je pense que les fuites de mémoire devraient être exclues.

Répondre

4

Vous ne reproduisez pas correctement le résultat GetDC() en HDC. GetDC() renvoie un pointeur vers un objet CDC.

Pour faire ce que vous voulez, vous pouvez effectuer l'une des opérations suivantes. Le premier choix correspond 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 pas faire la même chose que vous faites actuellement mal. La classe CDC a un membre operator HDC() qui lui permet d'être converti en HDC, mais cela ne s'applique PAS au pointeur. Vous devez d'abord le déréférencer.

+0

Vous avez parfaitement raison. C'était l'erreur. Reconnaissant à tous pour l'aide! – sevaxx

2

Certains contextes de périphérique ne fonctionneront pas avec CreateCompatibleDC(). Le contrôleur de domaine doit prendre en charge les opérations de trame. Vous pouvez envoyer le fichier hdc à GetDeviceCaps() et vérifier RASTERCAPS.

Mais il s'avère que le GetDC que vous appelez est une méthode sur une classe et non la liaison C que je pensais que vous vouliez dire. SoapBox a la bonne réponse.

+0

GetDeviceCaps (hdc, RASTERCAPS) retourné 0 .... cela signifie-t-il pas de support pour les opérations raster? – sevaxx

+0

@sevaxx: bien, la documentation dit que GetDeviceCaps (hdc, RASTERCAPS) devrait retourner une de ces fameuses valeurs de champ de bit, donc zéro ne semblerait pas impliquer de capacités de raster. Quand je l'ai juste couru avec une fenêtre simple DC, il a renvoyé 0x7E99 – JustJeff