Adapter l'image à la taille du bouton [Résolu]

Signaler
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Bonjour,
Je cherche à mettre une image sur un bouton qui s'adapte automatiquement dés que la taille du bouton change.
Tout d'abord cette opération est-elle possible en C API Win32?
Si oui comment?

Pour information j'ai déjà trouver comment mettre l'image sur le bouton, je recherche seulement comment faire pour que l'image s'adapte à la taille du bouton.
Mon code actuel:
HBITMAP hBitmap = (HBITMAP)LoadImage( NULL, "taupe.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE );
bouton = CreateWindowEx(WS_EX_WINDOWEDGE, "BUTTON", "Mon bouton avec image", BS_BITMAP|WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 0, 0, 150, 75, hwndPrinc, 0, NULL, NULL );
SendMessage( bouton, BM_SETIMAGE, IMAGE_BITMAP, (long)hBitmap );






<hr />




Merci d'avance et à bientôt.







Nico

10 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,

"possible en C API Win32"
Quelques chose sous Windows qui n'est pas possible en C API Win32 est souvent impossible tout court. Presque tout s'appuie là-dessus...

Je sais pas si il y a plus facile, mais tu peux le faire à la main avec la fonctionStretchBlt.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Pas avec cette methode mais c'est possible en
1 - passant par les ownerdraw
2 - utiliser StretchBlt pour afficher ton image aux dimensions du boutton

Ya un exemple dans une de mes sources
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Salut,
Si les MFC ne te dérange pas trop, tu peux traduire le code ici :
http://www.cppfrance.com/code.aspx?ID=38953

En gros, tu  peux ou sous-classer le boutton pour récuperer la WNDPROC ou faire un btn ownerdraw.
Ensuite il faut surcharger le message DRAWITEM et utiliser stretchBlt comme dit plus haut.
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
3
Merci tous le monde pour ces réponses, j'ai également trouvé comment utiliser ces diverses techniques grâce Programming Windows by Charles Petzold. II-14-The GDI Bitmap Object.









Nico
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
3
Juste pour le livre voilà un aperçu des codes permettant d'afficher des images sur des hwnd et quelqu'ils soient:

// Afficher plusieurs fois la même image ou motif
// cxSource taille de l'image source
// cySource taille de l'image source



     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;

          switch (iSize)
          {
          case IDM_BIG:
               StretchBlt (hdc, 0, 0, cxClient, cyClient,
                           hdcMem, 0, 0, cxBitmap, cyBitmap, SRCCOPY) ;
               break ;

          case IDM_SMALL:
               for (y = 0 ; y < cyClient ; y += cyBitmap)
               for (x = 0 ; x < cxClient ; x += cxBitmap)
               {
                    BitBlt (hdc, x, y, cxBitmap, cyBitmap,
                            hdcMem, 0, 0, SRCCOPY) ;
               }
               break ;
          }

          EndPaint (hwnd, &ps) ;
          return 0 ;










<hr />




Encore merci.






Nico
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
3
Bonjour,




Merci pour cette réponse rt15,
Mais mon problème est que la taille du bouton n'est pas fixe, il faudrait donc que la taille de l'image change lorsque la taille du bouton change. Je devrait donc faire une procédure propre au bouton qui lui permette d'avoir une image de taille adaptée. Par conséquent, je garde cette réponse en réserve au cas ou aucune autre ne me parvienne.

Merci...<hr />

Nico
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Pour etre complet il faudrait rajouter le cas avec une image masque de transparence pour détourage

      ::SelectObject(hdcMem, hBmpMask);
   StretchBlt(hdc, 0, 0, cxClient, cyClient, 
        hdcMem, 0, 0, cxBitmap, cyBitmap, SRCAND);


      ::SelectObject(hdcMem, hBmpNormal);
      StretchBlt(hdc, 0, 0, cxClient, cyClient,
        hdcMem, 0, 0, cxBitmap, cyBitmap, SRCINVERT);
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
3
Que signifie "image masque de transparence" ?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

C'est pour ne pas afficher le "fond du boutton" si par exemple ton boutton est arrondis il ne faut pas afficher les angles pour permettre a la couleur de fond du dialog d'apparaitre autour du boutton.
Par contre je connaissais pas cette technique merci Yann_lo_san moi je faisait surtout avec TransparentBlt().
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Exemple de masque.

SnOOpss >
Je pense que transparentBlt est une API récente et ne doit pas marcher avec tout (comme WS_EX_LAYERED)