begin process at 2012 05 28 05:43:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Affichage Multilignes sur Bouton


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

Affichage Multilignes sur Bouton

samedi 2 février 2008 à 07:01:47 | Affichage Multilignes sur Bouton

cartes1

Membre Club
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
samedi 2 février 2008 à 16:32:46 | Re : Affichage Multilignes sur Bouton

juju12

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...
samedi 2 février 2008 à 19:36:39 | Re : Affichage Multilignes sur Bouton

cartes1

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

Cartes1
dimanche 3 février 2008 à 17:29:49 | Re : Affichage Multilignes sur Bouton

juju12

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.
dimanche 3 février 2008 à 18:03:14 | Re : Affichage Multilignes sur Bouton

cartes1

Membre Club

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

mardi 5 février 2008 à 00:07:20 | Re : Affichage Multilignes sur Bouton

juju12

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...
mardi 5 février 2008 à 17:48:34 | Re : Affichage Multilignes sur Bouton

cartes1

Membre Club
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


Cette discussion est classée dans : bouton, multilignes, possible, affichage, option


Répondre à ce message

Sujets en rapport avec ce message

affichage d'un boite de dialog avec un bouton d'une autre boite de dialog [ par Zaz16 ] Bonjour,Je travaille avec VisualC++ 6.0 et les classes MFC.J'ai une boite de dialog "A" où on peut entrer un certain nombre de données, dont un bouton Gestion des ellipses... [ par mistercov ] Salut à tous !Je dois réaliser un logiciel de création et de visualisation d'ellipses et je voudrais être capable de pouvoir cliquer sur une ellipse, affichage image + bouton zoom [ par doberman7578 ] bonjour , Etant debutant sous GTK,je voudrai un code qui me permettrai d'afficher un image d'un repertoire. Cette image change toute les 1 seconde. J Affichage d'une photo et arret d'affichage [ par rasta_raf ] Bonjour,Je programme avec la bibliothèque MFC de Visual C++ 6.0 et j'ai créé une application SDI qui affiche une FormView où il y a 2 boutons (Bouton Affichage d'une image sur un bouton [ par aztcaLISS ] Salut, je veux faire apparaître une image sur mon bouton hBtn1 que je crer sur ma fenêtre mais ça ne fonctionne pas. J'ai vu dans des examples de code Creation de bouton automatique ?? Es possible ? [ par lolooooooo ] Bonjour tout le monde!! J'ai une question assez simple , peut on créer une fenêtre avec un bouton dedans et lorsque l'on appuis sur ce bouton il Execution d'un programme partagée [ par kabannis72 ] Bonjour, J'ai une idée de programmation, mais je ne sais si cela est possible. Ma question est simple, et en même temps compliquée : Est-il possible Question toute bête d'affichage d'éléments ^^ [ par by_rabbit_08 ] Bonjour!! J'ai une question surement fort simple pour beaucoup d'entre vous: Lorsque j'ai une simple fenêtre avec par exemple un bouton, une image, e Associer au click d'un bouton l'affichage du contenu d'une variable dans une textbox [ par johnASP ] Bonjours à tous!! Donc voilà, je débute avec le logiciel Microsoft Visual Studio 2005 ainsi qu'en C++. Pour l'instant je n'arrive qu'a afficher le co C++ Winforms : PB Affichage lent d'un panel de 50 boutons [ par sebsebz ] Je souhaite réaliser une application toute bête à partir de winform (en c++).Elle contient : Un formulaire avec une image de fond3 boutons principaux


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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 : 0,936 sec (3)

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