Affichage Multilignes sur Bouton

Signaler
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010
-
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010
-
Bonjour
Serait-il possible d'afficher plusieurs lignes sur un bouton créé avec "CreateWindow(.....)" avec l'option BS_OWNERDRAW sous Visual 6 C++ sans utiliser les MFC. En effet avec les MFC et l'option |BS_MULTILINE|, c'est possible et plus simple, mais on ne peut pas modifier la couleur du fond et du texte du bouton.
Merci d'avance.

Cartes1

6 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Oui c'est possible; de toutes façons en ownerdraw tu dois toi-même écrire le texte sur le bouton, alors tu peux très bien le faire sur plusieurs lignes...
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Justement non l'écriture suivie d'un retour à la ligne \r\n ne marche pas, le texte restant sur une seule ligne.

Cartes1
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
D'accord, mais quel est ton problème alors? Comme je disais, si tu crées un bouton personnalisé ce sera à toi de gérer l'affichage du texte, et tu pourras faire en sorte de revenir à la ligne quand tu détectes le caractère adéquat dans la chaîne.
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Le problème est que je débute en C++ ( je programme surtout en VB6 qui est beaucoup plus simple mais beaucoup moins puissant) et je ne vois pas comment faire pour afficher le texte de mon bouton sur 2 lignes (je me suis servi d'une fonction trouvée sur le net): voici ci-dessous la partie du code incriminé:

CODE:
/////////////////////////////////////////////////////////////////////////////////////////////////
// dans la fonction ConstruitFenetrePrincipale:

hBoutonOuvrir=CreateWindow(
            "BUTTON",
            "",
            WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON|BS_MULTILINE|BS_OWNERDRAW,
            10+10,20+310,130,30,
            fenetrePrincipale,(HMENU)ID_BOUTON_OUVRIR,instance,NULL);

/*************     Fonction de dessin des boutons     *******************************************/
/*************************************************************************************************/
void ConstruireBouton(LPDRAWITEMSTRUCT lpdrawstruct,LPCTSTR texte,COLORREF CouleurTexte,COLORREF CouleurFond)
/*************************************************************************************************/
{
 //Déclarations:
 SIZE dimensions;
 char nom[50];
 //Définir le texte du bouton:
 strcpy(nom, texte);
 //Déterminer les dimensions du texte:
    GetTextExtentPoint32(lpdrawstruct->hDC, nom, strlen(nom), &dimensions);
 //Définir la couleur du texte:
    SetTextColor(llpdrawstruct->hDC, CouleurTexte);
 //Définir la couleur du fond:
    SetBkColor(lpdrawstruct->hDC, CouleurFond);
 //Déterminer l'état du bouton:
 BOOL etat=lpdrawstruct->itemState & ODS_SELECTED;
 //Déterminer la largeur et la hauteur du bouton:
 int largeur=lpdrawstruct->rcItem.right-lpdrawstruct->rcItem.left;
 int hauteur=lpdrawstruct->rcItem.bottom-lpdrawstruct->rcItem.top;
 //Ecrire le texte sur le bouton:
 ExtTextOut(lpdrawstruct->hDC,(largeur-dimensions.cx)/2+etat, (hauteur-dimensions.cy)/2+etat, ETO_OPAQUE| ETO_CLIPPED, &lpdrawstruct->rcItem, nom, strlen(nom), NULL);
    //Dessin du cadre du bouton selon son état:
 DrawEdge(lpdrawstruct->hDC, &lpdrawstruct->rcItem,(etat ? EDGE_SUNKEN : EDGE_RAISED ), BF_RECT);               
 //Retour:
 return;
}

/*************************************************************************************/
LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
/*****************************************************************************************************************/
{
        switch (message)
    {
        


  case WM_CREATE:
            ConstruitFenetrePrincipale(fenetrePrincipale);
            return 0;
 
 case WM_DRAWITEM://Construction des boutons:
   {
   LPDRAWITEMSTRUCT lpdrawstruct = (LPDRAWITEMSTRUCT)lParam;


            if (lpdrawstruct->hwndItem==hBoutonOuvrir)
            {
   ConstruireBouton(lpdis,"Ouvrir \r\n Base de donnée",CouleurBleu, CouleurJaune);
   return TRUE;
            }
etc, etc...
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Merci d'avance pour ton aide

Cartes1
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Ben c'est pas compliqué :
si tu analyses ta fonction ConstruireBouton :
d'abord le calcul de la place prise par le texte avec GetTextExtentPoint32
puis reglages couleurs SetTextColor et SetBkGndColor
enfin ExtTextOut pour afficher le texte sur le bouton
(j'ai zappé le cadre, pas concerné);

Dans ton cas, il va falloir d'abord compter le nombre de lignes que prendra le texte soit un truc genre :
int nLines=0;
for(LPSTR pStr=nom;*pStr;pStr++) if(*pStr=='\n') nLines++;

ensuite pour le placement tu peux par exemple :
d'abord calculer la hauteur d'un élément (c'est la même pour tous je pense) par exemple avec GetTextExtentPoint32 :
SIZE slHeight;
GetTextExtentPoint32(lpDraw->hDC,nom,1,&slHeight);
puis tracer les différentes lignes :
LPSTR pLast=nom;
int iLine=0;
for(LPSTR pStr=nom;*pStr;pStr++)
{
if(*pStr=='\n') // si fin de ligne
{
int X=offset_x;
int Y=offset_y+i*slHeight.cy
int size=((int)pStr-(int)pLast)/sizeof(TCHAR);
ExtTextOut(hDC,X,Y,...,pLast,size,NULL);
pLast=pStr+1; // debut de la ligne suivante
i++;
}
}

Bon je sais pas si ça marche tel quel (pas testé) mais j'espère que ça t'inspirera...
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Non ça ne marche pas non plus mais c'est simplement lié à la fonction  ExtTextOut qui ne tolère pas l'affichage multilignes.
Par contre j'ai trouvé une solution finalement plus simple pour la remplacer ( code ci dessous si ça peut dépanner quelqu'un).
Merci encore pour ton aide .

Code:
/*****************************************************************************************************/
void ConstruireBouton(LPDRAWITEMSTRUCT lpdrawStruct,LPCTSTR Texte,COLORREF CouleurTexte,COLORREF CouleurFond)
/*****************************************************************************************************/
{
      RECT RectBouton = lpdrawStruct->rcItem;
     BOOL EtatBouton = lpdrawStruct->itemState & ODS_SELECTED;
  
    // Dessin du type de bouton
    DrawFrameControl( lpdrawStruct->hDC, &RectBouton, DFCS_BUTTONPUSH, EtatBouton );
    
    // Changement de la taille du rectangle pour ne peindre que l'intérieur
    RECT RectBoutonText = RectBouton;
    
    // diminution de la taille du rectangle pour l'etat au repos
    InflateRect(&RectBoutonText, -2, -2);
    
   // Remplir le bouton avec la couleur du fond:
    FillRect(lpdrawStruct->hDC, &RectBoutonText, CreateSolidBrush(CouleurFond));
    
    // Affecter le mode transparent à l'arrière-plan du texte à afficher
    SetBkMode(lpdrawStruct->hDC, TRANSPARENT);
    
    //Définir la couleur du texte:
    SetTextColor(lpdrawStruct->hDC, CouleurTexte);
    
    // Afficher le texte du bouton sur une ou plusieurs lignes:
    DrawText( lpdrawStruct->hDC, Texte, -1, &RectBoutonText, DT_CENTER | DT_VCENTER );
    
    // Construire le cadre du bouton
    DrawEdge( lpdrawStruct->hDC, &lpdrawStruct->rcItem, (EtatBouton ? EDGE_SUNKEN : EDGE_RAISED ), BF_RECT );
   return;
}
/************************************************************/
Cartes1