Background boite de dialogue

Résolu
alf03 Messages postés 11 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 26 décembre 2005 - 17 déc. 2005 à 18:58
gege1024 Messages postés 138 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 27 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+

14 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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
3
alf03 Messages postés 11 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 26 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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 déc. 2005 à 19:46
Je te prépare un code en Win32. Après tu pourra adapter pour MFC
0
alf03 Messages postés 11 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 26 décembre 2005
17 déc. 2005 à 19:48
ok, mirci beaucoup !!
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 déc. 2005 à 20:02
0
alf03 Messages postés 11 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 26 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 :


BOOL CDialMaBdd::OnEraseBkgnd(CDC* pDC)
{
CPaintDC hdc(this);
RECT rcClient;
HWND hDlg;
HBITMAP hbmp;
HINSTANCE hInstance;


GetClientRect(hDlg, &rcClient);
HDC hDC = GetDC(0);
hdc = CreateCompatibleDC(hDC);
hbmp = LoadBitmap(hInstance, (LPCTSTR)IDB_BITMAP1);
SelectObject(hdc, hbmp);
ReleaseDC(0, hDC);


DialogBoxParam(hInstance, (LPCTSTR)IDD_BDD1, 0, CDialMaBdd, 0);
BitBlt(hdc, 0,0, 200, 200, hDC, 0,0, SRCCOPY);
DeleteDC(hdc);
DeleteObject(hbmp);
return CDialog::OnEraseBkgnd(pDC);


}

Merci beaucoup de votre aide
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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
0
alf03 Messages postés 11 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 26 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 :

HBITMAP bit= (HBITMAP) LoadImage(NULL, "MonImage.bmp", IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE);

Je vois pas trop à quoi correspond CDC* pMemDC ; la plupart du temps il est utilisé comme cela :

CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject( &bitmap );

merci
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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
0
alf03 Messages postés 11 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 26 décembre 2005
17 déc. 2005 à 23:18
Oui super !!! ca compile mais .... l'image ne s'affiche pas !!
Voici le code pour ceux que ca intéresse :

BOOL CDialMaBdd::OnEraseBkgnd(CDC* pDC)
{
RECT rcClient;
GetClientRect(&rcClient);
CDC pMemDC;
BITMAP bitmap;
HBITMAP bit;


bit =(HBITMAP) LoadImage(NULL, "MonImage.bmp", IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
pMemDC.CreateCompatibleDC(pDC);
pMemDC.SelectObject( &bit );


GetObject(bit, sizeof(BITMAP), &bitmap);
int surf_width = bitmap.bmWidth;
int surf_height = bitmap.bmHeight;


pDC->BitBlt(0, 0, surf_width, surf_height, &pMemDC, 0, 0, SRCCOPY);


return CDialog::OnEraseBkgnd(pDC);
}

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 !)

Merci A+
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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
0
alf03 Messages postés 11 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 26 décembre 2005
17 déc. 2005 à 23:43
ok, j'avais remis return CDialog::OnEraseBkgnd car justement quand return 1; était mis, j'avais une bdd transparente.
0
gege1024 Messages postés 138 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 27 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).

gege
0
Rejoignez-nous