Rôle de CreateCompatibleBitmap(...)

julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007 - 26 mai 2007 à 17:55
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 27 mai 2007 à 16:35
Bonjour, mon code est le suivant :

# // création DC et bitmap en mémoire
# HDC hMemDC = CreateCompatibleDC(hdc);
# HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, 100, 100);
# HBITMAP hOldMemBmp = (HBITMAP) SelectObject(hMemDC, hMemBmp);
#
# // effacement du fond en blanc
# HBRUSH hBrush = CreateSolidBrush(RGB(0xFF, 0xFF, 0xFF));
# FillRect(hMemDC, &rcClient, hBrush);
# DeleteObject(hBrush);
#
# // recopie du DC en mémoire, libération des ressources
# BitBlt(hdc, 0, 0, sizeDst.cx, sizeDst.cy, hMemDC, 0, 0, SRCCOPY);
# SelectObject(hMemDC, hOldMemBmp);
# DeleteObject(hMemBmp);
# DeleteDC(hMemDC);

Lorsque je met la ligne DeleteObject(hMemBmp); avant le BitBlt, je m'attends à ce que rien ne s'affiche comme prévu, seulement ca marche correctement (en apparance, j'imagine).
Je me dis alors que hMemBmp ne doit pas trop etre utile, alors j'enleve les lignes associés à ce HBITMAP, mais là s'affiche un rectangle noir (pas ce que je veux).

Je met demande alors, quel est le rôle de hMemBmp (donc de CreateCompatibleBitmap(...) ) ?
Merci

8 réponses

pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
26 mai 2007 à 18:08
CreateCompatibleBitmap crée une image de format BITMAP (evidemment lol) compatible avec le HDC que tu lui passe en parametre..en gros

Pepsidrinker
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
26 mai 2007 à 18:12
oui je sais bien, mais quel utilité ici ? Pourquoi je ne peux pas directement dessiner sur hMemDC ? Et surtout pourquoi je peux afficher le contenu de hMemDC aprés avoir supprimé hMemBmp ?
0
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
26 mai 2007 à 18:29
HDC est un "handle device contexte"
Tu ne peut dessiner sur un device context VIDE.
Il doit absolument etre associé avec une image sur laquelle dessiner.

On peut comparer HDC a une table...
et CreateCompatible a la feuille elle meme...
Tu ne peu dessiner sur la table...
place la feuille sur la table , et le tour est joué!

Pepsidrinker
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
26 mai 2007 à 18:36
Ok merci, je ne savais pas. Ceci étant dit ca n'explique pas pk je peux dessiner sur hMemDC aprés avoir supprimé hMemBmp ^_^ A moins que SelectObject(...) crée une copie de l'objet (hMemBmp en l'occurrence), et que l'original devienne alors inutile ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
26 mai 2007 à 18:40
Si je continue avec ta comparaison, je peux reformuler ma question ainsi ^^ :
pourquoi est ce que je peux dessiner sur le DC aprés avoir enlever la feuille ?
0
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
26 mai 2007 à 18:47
Tu ne peut pas utiliser DeleteObject() tant que le bitmap est associé avec le device contexte .(tant ke ta feuille est sur la table).
Tu doit aussi savoir que quand tu delete un BRUSH ou un PEN , le bitmap associé n'Est pas deleté, il doit l'etre indépendement .

Pepsidrinker
0
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
26 mai 2007 à 19:07
Je ne peux pas ... et pourtant c'est ce que je fais :

# // création DC et bitmap en mémoire
# HDC hMemDC = CreateCompatibleDC(hdc);
# HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, 100, 100);
# HBITMAP hOldMemBmp = (HBITMAP) SelectObject(hMemDC, hMemBmp);
#
# DeleteObject(hMemBmp); //Effacement de la "feuille" ici
#
# // ...Puis dessin sur la feuille là ... possible ??
# HBRUSH hBrush = CreateSolidBrush(RGB(0xFF, 0xFF, 0xFF));
# FillRect(hMemDC, &rcClient, hBrush);
# DeleteObject(hBrush);
#
# // recopie du DC en mémoire, libération des ressources
# BitBlt(hdc, 0, 0, sizeDst.cx, sizeDst.cy, hMemDC, 0, 0, SRCCOPY);
# SelectObject(hMemDC, hOldMemBmp);
# DeleteDC(hMemDC);
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
27 mai 2007 à 16:35
Salut,
J'ai déjà remarqué ce genre de comportement avec les régions. J'ai ensuite appris que Windows travaille avec une copie en mémoire de la région supprimée. Il est  probable que  ce  soit pareil  avec  les  autres  objets. 
0
Rejoignez-nous