[api] Image qui s'efface

Résolu
cs_hoGan Messages postés 20 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 7 décembre 2005 - 5 nov. 2005 à 19:55
cs_hoGan Messages postés 20 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 7 décembre 2005 - 22 nov. 2005 à 22:05
Bonjour, voilà ce que je voudrais faire:

lorsque j'appuie sur un bouton, faire apparaître une image, et faire en
sorte que celle-ci ne disparaisse pas dès que j'abaisse la fenêtre !
Est-ce que je me fais bien comprendre? :P



Alors, je sais que l'image ne disparaît pas si on l'affiche quand
on reçoit le message WM_PAINT, mais je ne vois pas comment coupler
WM_PAINT et WM_COMMAND (rappelez-vous, je veux cliquer sur un bouton
avant)



Une recherche sur ce forum m'a indiqué ceci, un message de "BruNews" qui date de deux ans, mais c'est du charabia total ^^ :

" avant creation et affichage du dialoxbox, tu copies l'image dans un
memDC et c'est dedans que tu crees l'image resultante. Traite affichage
de fenetre par un simple BitBlt depuis memDC vers DC de fenetre, sera
hyper rapide."

Qui peut traduire?



Merci

8 réponses

cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007
8 nov. 2005 à 01:39
salut,

donc on change l'état de bButton à chaque WM_COMMAND, puis on met à jour l'affichage avec InvalidateRect...

case WM_COMMAND:

case ID_BOUTON:
if(bButton) bButton FALSE; // if(bButoon TRUE)
else bButton = TRUE;

// TRUE ou FALSE, on met à jour l'affichage
InvalidateRect(hwnd, NULL, FALSE); // WM_PAINT dans la file des messages

// break; si autre case

return 0; // pour WM_COMMAND

un BitBlt avec MERGECOPY fait un AND entre la couleur source de chaque pixel et le brush sélectionné dans le DC destination, pour une copie c'est SRCCOPY
bye.
3
cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007
6 nov. 2005 à 00:27
salut, traduction : c'est la technique du back buffer

quand une zone non visible est de nouveau visible, un message WM_PAINT est envoyé pour redessiner cette zone.

deux choix :

1- toutes les opérations dans WM_PAINT et si c'est long, l'affichage est pas top

2- création et dessin d'un back buffer, qui est un DC mémoire, en dehors du message WM_PAINT et WM_PAINT intégre uniquement un BitBlt du DCmem vers DC

pour l'histoire de l'image et du bouton, back buffer ou pas, c'est une variable BOOL qu'il faut, soit static dans WndProc, soit globale

static BOOL bButton;

avec WM_COMMAND : si bButton égal TRUE, bButton = FALSE
sinon bButton = TRUE
on met à jour l'affichage

avec WM_PAINT : si bButton égal TRUE création d'un DCmem pour copie du bmp ou
BitBlt d'un DCmem éxistant vers DC si technique back buffer

pour le back buffer, un peu de code ici :
http://www.cppfrance.com/forum.v2.aspx?ID=592514
et mon source :
http://www.cppfrance.com/code.aspx?ID=34308
bye.
0
cs_hoGan Messages postés 20 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 7 décembre 2005
6 nov. 2005 à 13:07
Salut

est-ce que tu pourrais un peu détailler l'utilisation des hdc, hdcMem?
Juste expliquer le principe en français, pas forcément refaire tout le
code.

Parce que j'ai été voir les liens indiqués et ai essayé de les adapter à ce que je voulais faire, sans résultat :::
0
cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007
6 nov. 2005 à 18:39
salut,
c'est plus un problème de bmp et de bouton ça...

DC = Device Context

définition traduite de MSDN:
"Un contexte de périphérique est une structure qui définit un jeu d'objets graphiques et leurs attributs associés".

si on souhaite dessiner un bmp sur la fenêtre de l'application:
1- on obtiens un handle du DC de la fenêtre de l'application
2- on obtiens un handle de DC compatible avec le DC précédent
3- on sélectionne l'objet BITMAP dans le DC compatible
4- BitBlt entre le DC compatible et le DC de la fenêtre de l'application
5- destruction de l'objet BITMAP et fermeture des DCs

dans le technique du back buffer, on commence de la même manière, sauf que l'on ne fais pas de BitBlt et on ferme uniquement le DC de la fenêtre de l'application.

donc il nous reste un DC avec un bmp sélectionné... c'est notre DCmem, notre back buffer, et il est possible d'en avoir plusieurs.

ensuite, dans WM_PAINT avec BeginPaint on obtiens un handle (hDc) du DC de la fenêtre de l'application, donc forcément compatible avec notre ou nos DCmems.

1- si l'application a une image de fond, BitBlt du hDcBackPicture vers hDc,
2- si bButton est TRUE BitBlt du hDcBmp vers hDc
si hButton est FALSE, il y aura seulement un BitBlt de l'image de fond (si image de fond il y a)

chapitre 5 : The Device Context
chapitre 14 : Bitmaps and Bitblts
et tout le reste !!
CP5 & CP5sources
http://brunews.free.fr/brunews/index.htm
bye.
0

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

Posez votre question
cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007
7 nov. 2005 à 01:22
mince, évidemment c'est "on obtient", au départ c'était "tu obtiens"...bref...
0
cs_hoGan Messages postés 20 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 7 décembre 2005
7 nov. 2005 à 20:09
Salut Chris, merci beaucoup de t'intéresser à mon cas

Alors j'ai effectivement maintenant un problème de bouton, bien que je pense voir où tu veux en venir avec ton histoire de bool:

- créer une variable globale booléenne bButton, qui servira de "marqueur"

- lorsqu'on reçoit WM_COMMAND(c'est-à-dire lorsqu'on clique sur le
bouton), traiter l'état de bButton (TRUE ou FALSE - c'est ici que je
coince, je vais y venir plus loin)

- dans le WM_PAINT, faire:

if(bButton == TRUE) //le bouton est cliqué

{

BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight,

hdcMem, 0, 0, MERGECOPY);

}

Bon, j'espère ne pas déjà me tromper jusqu'ici (dis-le moi si c'est le
cas)...mais je n'arrive pas à comprendre comment traiter bButton...

tu avais écrit:

"avec WM_COMMAND : si bButton égal TRUE, bButton = FALSE

sinon
bButton = TRUE"

alors si je retranscris :

case WM_COMMAND:

//...


case ID_BOUTON: //le bouton
en question


if(bButton == TRUE)


{


bButton = FALSE;


}


else


{


bButton = TRUE;



}

Pour moi, ça ne rime à rien ...

Merci d'éclairer ma lanterne
0
cs_hoGan Messages postés 20 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 7 décembre 2005
8 nov. 2005 à 19:54
ah yeah :)

J'avais oublié de mettre à jour l'affichage avec invalidaterect, c'était ça mon problème !

Merci à toi Chris, c'est vraiment super sympa =)
0
cs_hoGan Messages postés 20 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 7 décembre 2005
22 nov. 2005 à 22:05
Re-bonjour :)

j'ai un nouveau problème avec des disparitions d'images :^p

Lorsque j'affiche l'une à la suite de l'autre des images dans une
fenêtre, que j'abaisse puis remonte celle-ci, toutes les images ont
disparu sauf la dernière !

J'ai utilisé la méthode d'affichage décrite plus haut (back buffer)



merci
0
Rejoignez-nous