Efacer une bitmap en mémoire

cs_cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
- 7 févr. 2015 à 20:09
 Cheyenne - 16 févr. 2015 à 17:56
Bonjour,

J'utilise un buffer créé avec CreateCompatibleDC(GetDC(0)) et CreateCompatibleBitmap. Pour effacer la bitmap j'utilise FillRetct.
Il y a t-il un moyen plus simple que cette méthode ? J'ai bien penser à utiliser DeleteObject et recréer le CompatibeDC mais cela ne me semble pas très élégant.

Merci et bonne soirée.

Cheyenne
--

2 réponses

ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 7/02/2015 à 20:27
Bonjour,
sépare les choses :
titi = GetDC(0)
exemple : toto = CreateCompatibleDC(titi)
"zigouille" ensuite facilement toto ===>>
DeleteDc toto

Il te faut bien sur avoir également déclaré la fonction DeleteDc de la librairie "gdi32" de l'Api de Windows

idem pour la destruction d'un objet bitmap
tata = CreateCompatibleBitmap .......
DeleteObject tata

Il te faut bien sur avoir également déclaré la fonction DeleteObject de la librairie "gdi32" de l'Api de Windows

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Bonsoir ucfoutu,

Oui oui, tout est bien déclaré, bien sûr !
Je sais également qu'il faut supprimer tous les objets créés si l'on n'en a plus besoin ou bien qu'ils changent de valeur, sinon on arrive vite à une surcharge mémoir. Par exemple.lors de l'utilisation d'une Brush qui change de couleur, je fais DeleteObject(brush) : brush = CreateSolideBrush(couleur) .

Si je fais DeleteObject je ne peux plus m'en servir, il faut recréer le DC.
Or il s'agit d'un buffer pour une animation et j'en ai besoin en permanence, je ne peux donc pas le supprimer. Je cherche seulement le moyen d'effacer son "contenu". En fait je travaille avec un double buffer et fais à la fin des tracés un BitBlt sur Me.hdc mais la question reste la même , HI

Cheyenne
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 7/02/2015 à 21:19
Pourquoi donc effacer son contenu ?
Ce n'est pas utile, dès lors que tu le remplaces par un autre.
Il n'est utile que de le supprimer, dès que tu n'en as plus besoin.

Ceci étant dit : tu ne perds rien en mémoire à créer, supprimer, recréer.
S'il ne s'agit que de la volonté d'économiser du code ===>> une procédure paramétrée fera l'affaire, non ?

EDIT : 1) le "contenu" d'un bitmap, c'est le bitmap lui-même. Où il existe, ou il n'existe pas !
2) rien ne t'empêche de créer plusieurs bitmaps, si tu dois travailler de l'un à l'autre.
0
Cheyenne > ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018

8 févr. 2015 à 11:41
Bonjour ucfoutu

Les graphismes changeant toujours de position je suis bien obligé "d'effacer" comme on utilise Cls pour une PIctureBox.car Par exemple tu ne vas pas dessiner une horloge sans effacer la position précédente des aiguilles !
Ceci dit oui je pourrais supprimer et recréer à chaque fois la bitmap mais
je pensais qu'il y avait une autre solution..
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
8 févr. 2015 à 13:15
Je ne comprends alors pas (s'il ne s'agit que de repositionnement du bitmap) pourquoi tu ne le met pas tout simplement sans un container doté de hdc (tel une picturebox) pour ne déplacer ensuite que ce container !
0
Bonjour ucfoutu,

J'ai finalement trouvé deux solutions :
1) créer une autre CompatibleBitmap qui reste vierge et effacer la première avec la vierge par un BitBlt avec vbSRCopy

2) effacer la première bitmap par un BitBlt sur elle-même en utilisant vbSrcErase mais c'est plus deux fois plus long que la première solution.

Je préfère travailler avec des DC car c'est beaucoup plus rapide qu'avec les PictureBox surtout que j'utilise StretchBlt qui est assez lent. Mais avecdes DC c'est beaucoup plus rapide.

Cheyenne
0