WIN32 Dev-cpp: Le bouton refuse d'afficher le bitmap

Signaler
Messages postés
3
Date d'inscription
dimanche 12 décembre 2004
Statut
Membre
Dernière intervention
16 décembre 2004
-
Messages postés
3
Date d'inscription
dimanche 12 décembre 2004
Statut
Membre
Dernière intervention
16 décembre 2004
-
Bonjour!

Je n'arrive pas à faire afficher un bitmap sur un bouton CreateWindow.

Le bitmap se charge pourtant bien puisque le .EXE grossit.
La compilation se passe sans erreurs et l'executable s'execute!
Une semaine que j'essaie sans résultat.

Qu'est-ce qui cloche dans mon code (ci-dessous)?
#Merci d'avance <gekkko>

#include <windows.h>
#include "bitmap.h"

HWND hwndMain;
HANDLE bmp1;
HINSTANCE hInstance = NULL;

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static HWND hwndBtn1 = 0;
static HWND hwndBtn2 = 0;

switch (msg)
{

case WM_CREATE:
{
bmp1 = LoadBitmap(hInstance, "BITMAP1");

hwndBtn1 = CreateWindow ("button", "bmp1",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP,
50, 25, 120, 120, hwnd, (HMENU) 1,
((LPCREATESTRUCT) lParam)->hInstance, NULL);

hwndBtn2 = CreateWindow ("button","Close",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
50, 170, 120, 25, hwnd, (HMENU) 2,
((LPCREATESTRUCT) lParam)->hInstance, NULL);

return 0;
break;
}

case WM_COMMAND:
{
if (LOWORD(wParam) == 2 &&
HIWORD(wParam) == BN_CLICKED &&
(HWND) lParam == hwndBtn2)
{
DestroyWindow (hwnd);
}
return 0;
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}

int WINAPI
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
MSG msg;
WNDCLASSEX wcx;

ZeroMemory(&wcx,sizeof(WNDCLASSEX));
wcx.cbSize = sizeof(WNDCLASSEX);
wcx.style = CS_HREDRAW |CS_VREDRAW |CS_DBLCLKS ;
wcx.lpfnWndProc = (WNDPROC)MainWndProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hInstance;
wcx.hIcon = NULL;
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW+6);
wcx.lpszMenuName = NULL;
wcx.lpszClassName = "WIN32";
wcx.hIconSm = NULL;

if (!RegisterClassEx(&wcx))
return 0;

hwndMain = CreateWindowEx(0,
"WIN32",
"Win32 Bitmap sur un bouton",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
240,240,
HWND_DESKTOP,
NULL,
hInstance,
NULL);

if (!hwndMain)
return 0;

ShowWindow(hwndMain,SW_SHOW);

while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}

// le fichier bitmap.rc:
#include "bitmap.h"
BITMAP1 BITMAP "mafoto.bmp"

// le fichier bitmap.h:
#define BITMAP1 101

5 réponses

Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Il suffit d'envoyer le message BM_SETIMAGE au bouton pour lui 'appliquer une image' :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/buttons/buttonreference/buttonmessages/bm_setimage.asp

++

+2(p - n)
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
C'est vrai, le bitmap ne peut pas s'afficher tout seul sur le bouton, il faut bien envoyer le message BM_SETIMAGE pour que ce soit fait. A la fin du traitement de WM_CREATE tu ajoutes ceci :
SendMessage(hwndBtn1,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)bmp1);

Quand l'EXE grossit cela prouve que le bitmap est ajouté à l'EXE mais cela ne prouve pas qu'il est bien chargé à l'exécution du programme. Essaie de tester la valeur de retour (bmp1) de la fonction LoadBitmap(), si elle est nulle donc ton bitmap n'est pas chargé. Puisque tu utilises un identificateur pour ton bitmap il faut faire:
bmp1=LoadBitmap(hInstance, MAKEINTRESOURCE(BITMAP1));
Messages postés
3
Date d'inscription
dimanche 12 décembre 2004
Statut
Membre
Dernière intervention
16 décembre 2004

Merci pour vos réponses hyper rapides.

J'ai rajouté les deux lignes qu'il fallait:

bmp1=LoadBitmap(hInstance, MAKEINTRESOURCE(BITMAP1));

et

SendMessage(hwndBtn1,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)bmp1);

ça compile sans erreurs mais le bouton reste désespérément vide :o(

Si quelqu'un veut essayer de compiler le code pour voir (sous dev-cpp 4.9.8), je peux lui envoyer le petit zip (27ko) de mon répertoire bitmap.dev.

#Merci d'avance = "gekkko"
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Je viens de remarquer que le 1er paramètre de LoadBitmap() n'est pas correctement initialisé (hInstance). Pour résoudre le problème tu fais:
bmp1 = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(BITMAP1));

Pour savoir si le bitmap n'est pas chargé, tu fais juste après la ligne précédente:
if (!bmp1) MessageBox(0,"Bitmap non chargé!",0,0);

J'ai pas pu tester ton code car j'ai VC. Normalement, ça doit marcher maintenant. Bonne chance.
Messages postés
3
Date d'inscription
dimanche 12 décembre 2004
Statut
Membre
Dernière intervention
16 décembre 2004

Bingo!
Maintenant ça marche super bien.
Je suis en train de nettoyer mon code pour le poster prochainement.
J'avais trouvé des exemples en VC++ avec des AFX partout mais ça marchait pas sous dev-cpp.
Encore merci racpp et les autres pour votre aide.
<gekkko>