Rôle de CreateCompatibleBitmap(...)

Signaler
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
-
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
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

Messages postés
151
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2009

CreateCompatibleBitmap crée une image de format BITMAP (evidemment lol) compatible avec le HDC que tu lui passe en parametre..en gros

Pepsidrinker
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

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 ?
Messages postés
151
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2009

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
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

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 ?
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

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 ?
Messages postés
151
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2009

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
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

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);
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
11
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.