OVH Cloud OVH Cloud

Icon sur Bouton

11 réponses
Avatar
Matt
Bonsoir,

J'ai reussi a mettre mon icone sur mon bouton...

case WM_PAINT:
{
RECT rct;
HDC hdc;
PAINTSTRUCT ps;
HICON hIcon;
GetWindowRect(hwnd, &rct);
InvalidateRect(hwnd, &rct, TRUE);
hdc = BeginPaint(hwnd, &ps);
hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_START));
SendMessage(hwnd_Btn_Start, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);
EndPaint(hwnd, &ps);
return 0;
}

Le probleme c'est que mon icone est 16 X 16 mais sur mon bouton
ca me met une grosse icone.
Comment puis-je faire pour avoir une petite icone ???

Merci pour vos reponses

Matt...

10 réponses

1 2
Avatar
Christian ASTOR
Matt a écrit:

Le probleme c'est que mon icone est 16 X 16 mais sur mon bouton
ca me met une grosse icone.
Comment puis-je faire pour avoir une petite icone ???



LoadImage()
(et on ne fait pas de LoadIcon() & BM_SETIMAGE ds un WM_PAINT...)
Avatar
Christian ASTOR
Matt a écrit:


Est ce qu'on peut avoir une couleur transparentes ???



Ben c'est le propre des icônes...
Avatar
Matt
"Christian ASTOR" a écrit dans le message news:
401579f1$0$6972$
Matt a écrit:

> Le probleme c'est que mon icone est 16 X 16 mais sur mon bouton
> ca me met une grosse icone.
> Comment puis-je faire pour avoir une petite icone ???

LoadImage()
(et on ne fait pas de LoadIcon() & BM_SETIMAGE ds un WM_PAINT...)



Bonsoir,

Merci pour ta reponse, j'essaie demain.
Est ce qu'on peut avoir une couleur transparentes ???
C'est pour ca que je trouvais les icones interessantes.

Matt...
Avatar
Manuel Leclerc
Matt a écrit :

J'ai reussi a mettre mon icone sur mon bouton...

case WM_PAINT:
{
RECT rct;
HDC hdc;
PAINTSTRUCT ps;
HICON hIcon;
GetWindowRect(hwnd, &rct);
InvalidateRect(hwnd, &rct, TRUE);
hdc = BeginPaint(hwnd, &ps);
hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_START));
SendMessage(hwnd_Btn_Start, BM_SETIMAGE, IMAGE_ICON,
(LPARAM)hIcon);
EndPaint(hwnd, &ps);
return 0;
}



Déplace le chargement de l'icône et son envoie au bouton dans
ton code d'initialisation/création. Si tu le fais à chaque
paint : 1) une fois suffit et 2) fuite de mémoire

Tu devrais enlever le couple GetWindowRect/InvalidateRect.
Si l'affichage est mauvais après avoir enlevé ce couple, tu
as une bug ailleurs.
Avatar
Matt
"Manuel Leclerc" a écrit dans le message
news: 4016343f$
Matt a écrit :

> J'ai reussi a mettre mon icone sur mon bouton...
>
> case WM_PAINT:
> {
> RECT rct;
> HDC hdc;
> PAINTSTRUCT ps;
> HICON hIcon;
> GetWindowRect(hwnd, &rct);
> InvalidateRect(hwnd, &rct, TRUE);
> hdc = BeginPaint(hwnd, &ps);
> hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_START));
> SendMessage(hwnd_Btn_Start, BM_SETIMAGE, IMAGE_ICON,
> (LPARAM)hIcon);
> EndPaint(hwnd, &ps);
> return 0;
> }

Déplace le chargement de l'icône et son envoie au bouton dans
ton code d'initialisation/création. Si tu le fais à chaque
paint : 1) une fois suffit et 2) fuite de mémoire




Bonsoir
J'ai donc cree mon bouton dans le WinMain et j'ai fait LoadImage et
SendMessage pour afficher mon icone et ca marche impeccable.
Est la bonne facon de faire ???
Dans le Petzold (Programming Windows) il cree ses controles dans
le WM_CREATE, donc je fesait comme ca ...

Voici mon WinMain et dites moi si cela est juste
Du coup dans ma WindowProc, pour le moment, je ne traite que le
WM_DESTROY...

Merci a Manuel et Christian.

Matt...

int WINAPI WinMain( HINSTANCE hInstance, // handle de l'instance
courante
HINSTANCE hPrevInstance, // handle de l'instance
precedente (non renseigne en W32)
LPSTR lpCmdLine, // pointeur sur la ligne de
commande
int nCmdShow) // etat de l'affichage de la
fenetre
{
HWND hwnd, hBtnStart;
HICON hi;
MSG uMsg;
WNDCLASSEX wcex;
char szWindowClass[] = "Essai";
char szTitre[] = "Essai";

// Initialisation de la classe Window

wcex.cbSize = sizeof(wcex);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP));
wcex.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDI_APP));
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;

// Enregistrement de la classe window

if(!RegisterClassEx(&wcex))
{
MessageBox(NULL, "Impossible de creer la fenetre", "Erreur", MB_OK);
return 0;
}

// Creation de la fenetre

hwnd = CreateWindow(szWindowClass,
szTitre,
WS_PERSO,
CW_USEDEFAULT,
CW_USEDEFAULT,
270,
280,
NULL,
NULL,
hInstance,
NULL);

// Affichage de la fenetre

ShowWindow(hwnd, nCmdShow);

// Creation du bouton demarrer

hBtnStart = CreateWindow(TEXT("button"),
NULL,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON,
10,
10,
110,
25,
hwnd,
(HMENU)IDC_BTN_START,
hInstance,
NULL);

hi = LoadImage(hInstance, "Enreg.ico", IMAGE_ICON, 16, 16,
LR_LOADFROMFILE);
SendMessage(hBtnStart, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hi);

// Mise a jour de la fenetre

UpdateWindow(hwnd);

// Boucle des messages

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

return uMsg.wParam;
}
Avatar
Manuel Leclerc
Matt a écrit :

Manuel Leclerc a écrit :

> Matt a écrit :
>
> > J'ai reussi a mettre mon icone sur mon bouton...
> >
> > case WM_PAINT:
> >
> > [...]
>
> Déplace le chargement de l'icône et son envoie au
> bouton dans ton code d'initialisation/création. Si
> tu le fais à chaque paint : 1) une fois suffit et
> 2) fuite de mémoire

J'ai donc cree mon bouton dans le WinMain et j'ai fait
LoadImage et SendMessage pour afficher mon icone et ca
marche impeccable.

Est la bonne facon de faire ???
Dans le Petzold (Programming Windows) il cree ses
controles dans le WM_CREATE, donc je faisais comme ca ...



Moi aussi. Relis : "dans ton code d'initialisation/création"
:-)

Si ta fenêtre n'a pas la durée de vie de ton process, pense
à stocker quelque part le HANDLE de l'image, pour appel de
DestroyIcon dans le WM_DESTROY du parent. Tu peux peut être
ne pas le stocker mais le demander au bouton. Dans un
WM_DESTROY de parent, les enfants sont toujours "là".

Voici mon WinMain et dites moi si cela est juste
Du coup dans ma WindowProc, pour le moment, je ne
traite que le WM_DESTROY...



Pour détruire l'icône ?

Et ben, j'ai rien dit, alors.

int WINAPI WinMain [...]

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);



Je crois qu'il faut passer (HBRUSH)(COLOR_WINDOW + 1);
Je sais, c'est bizarre.

[...]
// Creation de la fenetre

hwnd = [...]



Il au moins aussi important, sinon plus, de tester
si hwnd est NULL après l'appel, que de tester la
réussite du RegisterClass. Il arrive qu'on fasse
une modif quelque part dans le source et que le
CreateWindow ne marche plus.

WS_PERSO



???

[...]

// Affichage de la fenetre

// Creation du bouton demarrer

// Mise a jour de la fenetre




Crée complètement le bouton avant l'affichage et
tu n'auras pas d'update à faire.

D'ailleurs, ça ne marche pas _juste_ en virant
l'update ?

while(GetMessage(&uMsg, NULL, 0, 0))



Ce n'est pas tout à fait ce qui est recommandé, mais là
on en arrive à des pratique sur nos amis les mouches que
la morale réprouve :-)

Extrait de la doc :
BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) {
if (bRet == -1) {
// handle the error and possibly exit
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

Quelqu'un a déjà vu l'API GetMessage renvoyer une erreur
quand on lui passe &msg, NULL, 0, 0 ????
Avatar
Matt
> > J'ai donc cree mon bouton dans le WinMain et j'ai fait
> LoadImage et SendMessage pour afficher mon icone et ca
> marche impeccable.
>
> Est la bonne facon de faire ???
> Dans le Petzold (Programming Windows) il cree ses
> controles dans le WM_CREATE, donc je faisais comme ca ...

Moi aussi. Relis : "dans ton code d'initialisation/création"
:-)



Ok, j'ai donc cree mon bouton dans le WM_CREATE avec
mon icone et je la detruit (l'icone) dans le WM_DESTROY

case WM_CREATE:

hInstance = ((LPCREATESTRUCT)lParam)->hInstance;

hBtnStart = CreateWindow(TEXT("button"),
NULL,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON,
10,
10,
40,
25,
hwnd,
(HMENU)IDC_BTN_START,
hInstance,
NULL);

hi = LoadImage(hInstance, "Enreg.ico", IMAGE_ICON, 16, 16,
LR_LOADFROMFILE);
SendMessage(hBtnStart, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hi);
return 0;

case WM_DESTROY:
DestroyIcon(hi);
PostQuitMessage(0);
return 0;

[..]

> WS_PERSO

???



#define WS_PERSO WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX |
WS_OVERLAPPED | WS_SYSMENU

> while(GetMessage(&uMsg, NULL, 0, 0))

Ce n'est pas tout à fait ce qui est recommandé, mais là
on en arrive à des pratique sur nos amis les mouches que
la morale réprouve :-)



Sic Charles Petzold...

Je te remercie pour tes réponses et ta patience.
Comme tu as pu le remarquer je suis un débutant
en programmation avec l'API windows et je voudrais
commencer comme il faut...

Matt...
Avatar
Manuel Leclerc
Matt a écrit :

Comme tu as pu le remarquer je suis un débutant
en programmation avec l'API windows et je voudrais
commencer comme il faut...



Quel est ton but ?
Avatar
Matt
"Manuel Leclerc" a écrit dans le message
news: 4016d389$
Matt a écrit :

> Comme tu as pu le remarquer je suis un débutant
> en programmation avec l'API windows et je voudrais
> commencer comme il faut...

Quel est ton but ?




Je developpe pour mon plaisir.
Au boulot, je fais un peu de VB mais a la maison
juste pour le plaisir et essayer de comprendre se
que je fais et d'essayer de le faire bien.

Matt.

Ps : tu penses quoi maintenant de ma facon de faire
du dernier post...
Fais je bien ?
Avatar
Manuel Leclerc
Matt a écrit :

Manuel Leclerc a écrit :

> Quel est ton but ?

Je developpe pour mon plaisir.
Au boulot, je fais un peu de VB mais a la maison
juste pour le plaisir et essayer de comprendre se
que je fais et d'essayer de le faire bien.



Super.

Essayes de garder l'esprit ouvert. Il n'y a pas que
le SDK, il n'y a pas que le fenêtrage, et il paraîtrait
même qu'il n'y a pas que Windows.

Je te dis ça, parce que _parfois_ on se met à apprendre
quelque chose, ça marche, on est content, on progresse,
mais en même temps, on se met des oeillères. Ceci dit,
explorer Win32, c'est une chose que tout "honnête homme"
devrait avoir fait :-)

Tu es plutôt branché fenêtrage/grahisme/ergonomie ou
système/thread/réseaux ?

Ps : tu penses quoi maintenant de ma facon de faire
du dernier post...
Fais je bien ?



Je crois, mais je peux me tromper.
1 2