alf03
Messages postés11Date d'inscriptiondimanche 12 novembre 2000StatutMembreDernière intervention26 décembre 2005
-
17 déc. 2005 à 18:58
gege1024
Messages postés138Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention27 janvier 2009
-
22 déc. 2005 à 09:44
Bonjour à toutes et à tous,
Je cherche à desiner par dessus une bitmap se trouvant dans une boite de dialogue.
Mais malheureusement, mes dessins apparaissent sous la bitmap !
Ma question est donc, comment mettre cette fameuse bitmap en arriere plan par rapport aux dessins ?
Merci de votre aide
A+
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 17 déc. 2005 à 19:36
Logiquement, un arrière plan se dessine à la réception du message WM_ERASEBKGND. C'est donc a cet endroit que tu devrais utiliser BitBlt pour dessiner ta bitmap
alf03
Messages postés11Date d'inscriptiondimanche 12 novembre 2000StatutMembreDernière intervention26 décembre 2005 17 déc. 2005 à 19:44
Ok, merci; j'ai bien crée la fonction WM_ERASEBKGND grâce à class wizard mais après, quel code je dois mettre pour définir l'emplacement de ma bitmap ?
Merci
alf03
Messages postés11Date d'inscriptiondimanche 12 novembre 2000StatutMembreDernière intervention26 décembre 2005 17 déc. 2005 à 21:36
Re-bonjour,
euh ... merci pr ton code mais j'ai pas assez d'expérience en Visual pr réussir à l'adapter en MFC...
Voici ce que j'ai pu "bredouiller" sans succès malheureusement.
J'ai pas tout compris tout le code; j'espere que vous ne vous arracherez pas les cheveux en lisant ceci :
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 17 déc. 2005 à 21:43
En MFC, les API sont tous redéfinis, donc en général quand le premier argument est un HWND, il faut l'enlever (par exemple pour GetClientRect
Le plus important je pense est de ne pas appeler CDialog::OnEraseBkgnd(pDC), car il va redessiner par dessus le fond par défaut.
Faut pas non plus créer un DC et charger la bitmap à chaque fois, tu peux les créer une fois pour toutes, comme j'ai fait
CPaintDC hdc(this); ne sert à rien, car tu as déja la variable pDC
Je vais essayer de le faire de mon coté en MFC
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 17 déc. 2005 à 21:48
Bon, je viens de me rendre compte que je vais pas le faire de mon coté en MFC, parce que j'utilise la version VC++ 2005 Express, et je peux pas créer un projet MDC avec
Ta fonction devrait logiquement être assez courte:
BOOL CDialMaBdd::OnEraseBkgnd(CDC* pDC)
{
RECT rcClient;
GetClientRect(&rcClient);
pDC->StretchBlt(0,0, rcClient.right, rcClient.bottom, pMemDC, 0,0, 200, 200, SRCCOPY);
return 1;
}
Tu dois créer ailleurs un CDC* pMemDC contenant la bitmap
alf03
Messages postés11Date d'inscriptiondimanche 12 novembre 2000StatutMembreDernière intervention26 décembre 2005 17 déc. 2005 à 22:36
ok, je vois à peu prés sauf pour le coup du CDC* pMemDC qui doit contenir la bitmap.
Au cours de mes nombreuses recherches, j'ai vu qu'on déclarait la bitmap comme ceci :
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 17 déc. 2005 à 22:39
Oui, c'est tout a fait comme ca que tu dois l'utiliser
Pour la bitmap, ca dépend si tu la mets en ressource (intégré à l'exe), ou bien si tu veux utiliser un fichier externe. Mais c'est vrai que LoadImage à remplacé LoadBitmap
Question bête : Erase veut bien dire effacer ?! donc la fonction efface le background et ne met pas une image en background ?!
Autrement, il y aurait pas 1 manière + simple de mettre une image en arriere plan, c'est à dire dans ses propirétés (enfin j'ai dé"jà tout essayé mais si vous trouvez !)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 17 déc. 2005 à 23:34
Tu devrais bien lire ce que j'écris: il faut pas appeler CDialog::OnEraseBkgnd.
Celle la elle va effacer l'arrière plan, parce que c'est le comportement par défaut
Après, l'erreur peut venir d'autres endroits (création du DC mémoire, chargement de la bmp). A chaque fois, vérifie que la création n'a pas échoué
Non, pas de manière plus simple, mais celle ci n'est pas très compliquée non plus
gege1024
Messages postés138Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention27 janvier 2009 22 déc. 2005 à 09:44
va voir mon post juste au dessus (pb d'actualisation d'affichage)
tu as 3 cas possibles : fond avec couleur predefinis, fond avec image dans ressource et fond avec image bmp chargé a partir d'un fichier (celui-là c'est sous OnPaint() qu'il faut le faire).