Attacher une image a l'aide de SendMessage(BM_SETIMAGE... sous MFC

Attacher une image a l'aide de SendMessage(BM_SETIMAGE... sous MFC - C++ - Programmation

Marsh Posté le 17-11-2007 à 01:55:54    

Salut,
 
J'utilise Microsoft Visual Studio 2005.
J'ai une fenetre de dialogue cree a l'aide de l'IDE de Visual Studio. Cet IDE me donne un fichier .rc.
J'essaye de relooker cette fenetre en associant des bitmaps aux bouttons.
La premiere chose que j'ai faite est de changer l'argument "BITMAP" dans la fenetre de proprietes de mon boutton. (J'ai laisse Owner Draw sur False).
 
Ma ligne de declaration de boutton dans mon fichier .rc devient donc:
 

Code :
  1. PUSHBUTTON      "3",IDC_BUTTON3,31,50,17,17,BS_BITMAP


 
 
apres, j'ai charge mon fichier bitmap: "Clic droit, add ressource, bitmap..."
Dans mon fichier resource.h, j'ai donc une ligne inseree automatiquement:  

Code :
  1. #define IDB_BITMAP3                     140


 
 
Maintenant j'essaye d'attacher les deux a l'aide d'un sendmessage:
 

Code :
  1. CWnd* pMyWindow;
  2. pMyWindow->GetDlgItem(IDC_BUTTON3);
  3. pMyWindow->SendMessage(BM_SETIMAGE, IMAGE_BITMAP, IDB_BITMAP3);


 
mais quand je lance ma fenetre, le bouton apparait vide.
Qu est ce que j ai oublie?
 
 
PS:
Mes includes sont:

Code :
  1. #include <atlwin.h>
  2. ...
  3. "


 

Reply

Marsh Posté le 17-11-2007 à 01:55:54   

Reply

Marsh Posté le 17-11-2007 à 19:46:44    

up?
 
qqun a t il une idee?

Reply

Marsh Posté le 17-11-2007 à 20:08:01    

t'as pas l'impression d'avoir oublié un truc ? tu récupères bien le HWND du bouton via ton GetDlgItem, mais ensuite, tu en fais quoi ? le 1er paramètre de ton SendMessage ne doit pas être BM_SETIMAGE, mais ce fameux HWND. et ensuite tu peux indiquer le message BM_SETIMAGE et tous les paramètres nécessaires.

Reply

Marsh Posté le 17-11-2007 à 21:26:30    

Ok
Mais la fonction sendmessage que j utilise n accepte que trois parametres et le handle du boutton n est pas l un d eux.
C'est pour ca que j ai essaye en creeant le pointeur... pMyWindow->SendMessage
 
Je ne sais pas comment faire pour utiliser le sendmessage qui accepte les 4 arguments.
J ai essaye CWindow::Sendmessage mais ca me repond que CWindow n est pas une classe...
 

Reply

Marsh Posté le 17-11-2007 à 23:34:29    

A première vue ce ne serait pas plutôt :
 
pMyButton = pMyWindow->GetDlgItem(IDC_BUTTON3);
pMyButton->SendMessage(BM_SETIMAGE, IMAGE_BITMAP, IDB_BITMAP3);

Reply

Marsh Posté le 17-11-2007 à 23:57:45    

Tu declares pMyButton comment?
En utilisant Cwnd* ca ne fonctionne pas... :S

Reply

Marsh Posté le 18-11-2007 à 08:34:40    

Ça fait longtemps que je n'ai plus fait de MFC. Tu pourrais montrer le bout de code qui ne fonctionne pas.

Reply

Marsh Posté le 18-11-2007 à 10:41:28    

tout est dans mon premier message
ca compile correctement mais le bouton reste vide, pas d image
et en rajoutant  
 
CWnd* pMyButton;  
pMyButton = pMyWindow->GetDlgItem(IDC_BUTTON3);
pMyButton->SendMessage(BM_SETIMAGE, IMAGE_BITMAP, IDB_BITMAP3);
 
le resultat est le meme, le bouton reste vide

Reply

Marsh Posté le 18-11-2007 à 10:49:12    

Le deuxième argument de BM_SETIMAGE est le handle de l'image, or tu envoie IDB_BITMAP3, je ne pense pas que ce soit le handle que tu dois récupérer à partir de
HBITMAP hbmp =  ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP3));
 
(ou un truc comme ça).


Message édité par Trap D le 18-11-2007 à 10:50:13
Reply

Marsh Posté le 18-11-2007 à 21:40:15    

je vois ce que tu veux dire
Comme l'IDE de VS transformait direct en ressource je ne pensais pas avoir besoin de cette ligne.
Je vais essayer.

Reply

Marsh Posté le 18-11-2007 à 21:40:15   

Reply

Marsh Posté le 19-11-2007 à 19:45:57    

j'ai essaye ca:
 
 

Code :
  1. pMyButton = pMyWindow->GetDlgItem(IDC_BUTTON3);
  2. HBITMAP hbmp = (HBITMAP)LoadImage(0, MAKEINTRESOURCE(IDB_BITMAP3), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  3. pMyButton->SendMessage(BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp);


 
et ca ne marche tjrs pas ....
Je pense que l'une des raisons est que la fonction SendMessage attend un LPARAM et pas un HBITMAP et ne peut pas convertir...
Donc je suis oblige de mettre (LPARAM) devant l argument pour que ca compile...


Message édité par Profil supprimé le 19-11-2007 à 19:46:45
Reply

Marsh Posté le 19-11-2007 à 20:23:03    

y'a un truc qui me chagrine là... le LR_LOADFROMFILE passé en dernier paramètre de LoadImage signifie que tu charges l'image à partir d'un fichier dont le chemin est passé dans le second paramètre, lequel paramètre contient dans ton code la macro MAKEINTRESOURCE, stipulant que le fichier est une ressource !
donc, soit tu remplaces le LR_LOADFROMFILE par LR_CREATEDIBSECTION, soit tu essaies le code suivant :

Code :
  1. HWND hMyButton = ::GetDlgItem(this->m_hWnd, IDC_BUTTON3);
  2. this->hbmp = ::LoadImage(this->hInst, MAKEINTRESOURCE(IDB_BITMAP3),IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
  3. ::SendMessage(hMyButton, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hbmp);


n'oublie pas de créer la variable membre hbmp si tu utilises ce code (de type HBITMAP).
la différence entre ce code et le tien est que je passe par les fonctions de Win32 au lieu d'utiliser l'encapsulation (pourrie) des MFC


Message édité par Harkonnen le 19-11-2007 à 20:24:07
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed