begin process at 2012 05 30 16:02:23
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

Redessiner un bouton WM_DRAWITEM:


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Redessiner un bouton WM_DRAWITEM:

mardi 28 février 2006 à 09:05:02 | Redessiner un bouton WM_DRAWITEM:

timy94

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->y =0; 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;
}

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

mardi 28 février 2006 à 09:34:45 | Re : Redessiner un bouton WM_DRAWITEM:

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
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);


Cette discussion est classée dans : wm, ws, rgb, lpdis, lpds


Répondre à ce message

Sujets en rapport avec ce message

envoyer la notification WM_DRAWITEM (custom draw) [ par youpiyoyo ] j'ai un petit probleme j'ai un boutton custom draw avec 2 images,kan il est clické, il change d'image....dans mon prog je fais un truc de genrecase WM [API win32 sans MFC] Création textbox et evenement bouton [ par nitrique ] Bonjour, Je fais un petit soft pour windows CE (embedded) et je découvre en même temps le C++.J'aimerais comprendre le fonctionnement de base pour cré [ API WIN32 ] RECUPERER APPUI BOUTON FENETRE [ par lectpe ] Bonjour, J'ai créé une boite de dialogue vide grâce aux ressources comme suit :IpToCountryDialog DIALOG 50, 30, 165, 80            STYLE WS_POPUP | WS Problème de Focus entre fenêtre principal et Enfant [ par TeniX ] Salut,Voila mon problème est que sur ma fenêtre enfant je n'arrive à dire jamais à avoir la "Title bar" en bleu non grisé,j'ai testé plusieurs méthode Problème lecture du texte d'une textbox (API Windows) [ par Inceptor ] Bonjour, Je suis en train de développer un petit programme très simple, celui doit doit générer un fichier à partir des données entrées. L'interface Le LPARAM de SendMessage: incrémentation [ par sunvi ] Bonjour, Je cherche à envoyer un WM_PARENTNOTIFY à une fenêtre, avec comme WPARAM= WM_LBOTTONDOWN. en regardant sur le site de msdn, j'ai trouvé qu'il pb utilisation "PostMessage" pour simuler click souris [ par Lustuc ] Je cherche à faire un petit programme en C permétant de cliquer sur des applications qui ne sont pas forcément en premier plan. J'ai le handle de la ListView - WS_EX_GRIDLINES - WS_EX_FULLROWSELECT [ par lectpe ] Bonjour à tous. Je voudrais ajouter le style WS_EX_GRIDLINES à une ListView de mon application mais ça me dit dans un premier temps que ce style n'es Win32 - Message WM_LBUTTONUP non reçu [ par nico255 ] Bonsoir, mon programme en C Win32 est en tray-icon et s'inspire fortement de la source CONTROLE-VOLUME-OSD-WIN32 (ID=38949) - une CreateWindowEx WS_ Probleme Bouton [Api Windows] [ par fender6 ] Salut, J'ai un problème lorsque je veux créer un bouton , celui ne s'affiche pas dans la fenêtre pourtant je n'ai pas d'erreurs a la compilation .


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,324 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales