Adapter l'image à la taille du bouton

Résolu
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 - 31 août 2007 à 11:51
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 1 sept. 2007 à 15:09
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

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
31 août 2007 à 15:01
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.
3
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
31 août 2007 à 18:13
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
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
31 août 2007 à 21:55
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.
3
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
31 août 2007 à 22:05
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
3

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

Posez votre question
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
31 août 2007 à 22:09
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
3
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
31 août 2007 à 17:54
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
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
31 août 2007 à 22:35
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);
0
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
1 sept. 2007 à 14:16
Que signifie "image masque de transparence" ?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
1 sept. 2007 à 14:28
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().
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
1 sept. 2007 à 15:09
Exemple de masque.

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