Redessiner un bouton WM_DRAWITEM:

Résolu
timy94 Messages postés 50 Date d'inscription jeudi 17 novembre 2005 Statut Membre Dernière intervention 7 janvier 2009 - 28 févr. 2006 à 09:05
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 28 févr. 2006 à 09:34
Bonjour.
J'utilise WM_DRAWITEM pour redessiner mes boutons (boutons créer par CreateWindow(....).

Premier problème : Quand je fais marcher mon programme en mode debug avec points d'arret dans WM_DRAWITEM: Cela fonctinne comme prévu. quand je clic sur le bouton 1 celui-ci devient rouge et quand je clic sur le bouton2 le bouton1 change de couleur et le bouton2 deviens rouge et ainsi de suite.
Mais quand je fait dérouler mon programme en mode normal le premier clic n'est pas detecté et le programme se déroule de façon bizzare. Il ne répond pas à la logique attendue. C'est comme-ci WM_DRAWITEM n'etait pas envoyé au premier clic!

Deuxième problème: Pourquoi LDRAWITEMSTRUCT lpdis ne fonctionne que quand WM_CTLCOLORDLG: est placé avant WM_DRAWITEM: ,( LDRAWITEMSTRUCT) lpdis n'est pas envoyé!

Troisième problème: Peut-on récuperer ,( LDRAWITEMSTRUCT)lpdis sans passer par case WM_DRAWITEM: par un SendMessage par exemple et comment faire. J'ai écris SendMessage(MyBouton,WM_DRAWITEM,NULL,( LDRAWITEMSTRUCT) lpdis); Le compile plante sur le quatrième parametre.

Ci-joint mon code.

Voila, j'avance quand même un peut plus tous les jour, merci d'avance.


Timy94


#include <windows.h>

#include <stdio.h>

/******************************************************************/

/************* Fonction de dessin des boutons *************/

/******************************************************************/

void DessinerBouton(LPDRAWITEMSTRUCT lpds,LPCTSTR texte,COLORREF couleurtexte,COLORREF couleurfond)

{

//Déclarations:

SIZE dims;

char nom[50];

//Définir le texte du bouton:

strcpy(nom, texte);

//Déterminer les dimensions du texte:

GetTextExtentPoint32(lpds->hDC, nom, strlen(nom), &dims);

//Définir la couleur du texte:

SetTextColor(lpds->hDC, couleurtexte);

//Définir la couleur du fond:

SetBkColor(lpds->hDC, couleurfond);
/
/Déterminer l'état du bouton:

BOOL etat=lpds->itemState & ODS_SELECTED;

//Déterminer la largeur et la hauteur du bouton:

int largeur=lpds->rcItem.right-lpds->rcItem.left;

int hauteur=lpds->rcItem.bottom-lpds->rcItem.top;

//Ecrire le texte sur le bouton:

ExtTextOut(lpds->hDC,(largeur-dims.cx)/2+etat, (hauteur-dims.cy)/2+etat, ETO_OPAQUE | ETO_CLIPPED, &lpds- >rcItem, nom, strlen(nom), NULL);

//Dessiner le cadre du bouton selon son état:

//DrawEdge(lpds->hDC, &lpds->rcItem,(etat ? EDGE_SUNKEN : EDGE_RAISED ), BF_RECT);

//Retour:

return;

}


static COLORREF TxtNoir = RGB(0 ,0,0);

static COLORREF TxtRouge = RGB(255,0,0);

int clic1 =0;

int clic2=0;


/******************************************************************/

/******************************************************************/

/************** Procédure de la boite de dialogue ***********/

/******************************************************************/

BOOL CALLBACK DialogProc( HWND hDlg, UINT message, WPARAM wParam,LPARAM lParam )

{

//Déclarer et définir les couleurs de fond de certains contrôles:

static HBRUSH hbDialog = CreateSolidBrush(RGB(200,175,100));

//Déclarer et définir notre police:

static HFONT hPolice=CreateFont(48,0,0,0,400,0,0,0,0,0,0,0,0,"Arial");

//Déclaration de nos contrôles:

static HWND hBouton1,hBouton2;

static HWND hQuitter;

switch (message)

{

case WM_INITDIALOG://Initialisation de notre boite de dialogue

{

//Ecrire le titre de la boite de dialogue:

SetWindowText(hDlg,"Couleurs et transparence");

hBouton1=CreateWindow("BUTTON",0,WS_CHILD | WS_VISIBLE | BS_OWNERDRAW | WS_DLGFRAME ,140 ,30,60,60,hDlg,0,0,0);

hBouton2=CreateWindow("BUTTON",0,WS_CHILD | WS_VISIBLE | BS_OWNERDRAW | WS_DLGFRAME ,240,30,60,60,hDlg,0,0,0);

SendMessage (hBouton1 , WM_SETFONT, (WPARAM)hPolice,(LPARAM)TRUE);

SendMessage (hBouton2 , WM_SETFONT, (WPARAM)hPolice,(LPARAM)TRUE);

hQuitter=CreateWindow("BUTTON",0,WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,200,230,80,24,hDlg,0,0,0);

return 0;

}

case WM_CLOSE:

//Fermeture

//Suppression des objets créés

DeleteObject(hPolice);

//Fermeture de la Boite de dialogue:

EndDialog(hDlg,0);

return 0;

case WM_CTLCOLORDLG://Couleur de fond de la boite de dialogue

return (INT_PTR)hbDialog;

case WM_DRAWITEM://Dessin des boutons

{

LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;

(clic1==1) {

printf(""); //pour le debug

}

if (clic2==1) {

printf("");

}

if (lpdis->hwndItem==hBouton1)//Bouton jaune

{

if (clic1==0) {

DessinerBouton(lpdis,"1",RGB(0,0,0),RGB(200,175,100));

} else {

DessinerBouton(lpdis,"1",RGB(0,0,0),RGB(200,0,0));

}

return TRUE;

}

if (lpdis->hwndItem==hBouton2)//Bouton jaune

{

if (clic2==0) {

DessinerBouton(lpdis,"2",RGB(0,0,0),RGB(200,175,100));

} else {

DessinerBouton(lpdis,"2",RGB(0,0,0),RGB(200,0,0));

}

return TRUE;

}

if (lpdis->hwndItem==hQuitter)//Bouton Quitter

{

DessinerBouton(lpdis,"Quitter",RGB(255,255,0),RGB(114,95,42));

return TRUE;

}

break;

}

case WM_COMMAND://Clic sur un contrôle

{

HDC hdc;

UINT idCtl = (UINT) wParam;

LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;

if ((HWND)lParam==hQuitter)//clic sur Quitter

{

//Envoi du message de fermeture

SendMessage(hDlg,WM_CLOSE,0,0);

break;

}

if ((HWND)lParam==hBouton1)//clic sur OK

{

clic1=1;

clic2=0;

}

if ((HWND)lParam==hBouton2)//clic sur OK

{

clic1=0;

clic2=1;

}

break;

}

}

return 0;

}

/******************************************************************/

/******************************************************************/

/***************** Fonction WinMain *****************************/

/******************************************************************/

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{

//Allouer de la mémoire pour notre dialog template:

LPDLGTEMPLATE lpdt = ( LPDLGTEMPLATE) GlobalAlloc(GPTR, 512);
if (!lpdt) return 1;

// Définir les propriétés de la boite de dialogue:

lpdt->style = DS_CENTER | WS_POPUP | WS_MINIMIZEBOX| WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;
lpdt->x lpdt->y0; lpdt->cx = 230; lpdt->cy = 155;

//Lancer la boite de dialogue

DialogBoxIndirect(hInstance,lpdt,NULL,(DLGPROC)DialogProc);

//Libération de la mémoire allouée:

GlobalFree((HGLOBAL)lpdt);

//Retour:

return 0;

}


/******************************************************************/

1 réponse

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 févr. 2006 à 09:34
C'est normal que les boutons ne se redessinent pas tout seuls.
Dès que tu cliques sur un bouton, tu dois invalider tous les boutons.
Tu ajoutes ca à la fin de WM_COMMAND:
InvalidateRect(hBouton1, 0, 1);
InvalidateRect(hBouton2, 0, 1);
InvalidateRect(hQuitter, 0, 1);
3
Rejoignez-nous