IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[VC++6]Ajuster la taille dun contrôle après écriture en gras


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut [VC++6]Ajuster la taille dun contrôle après écriture en gras
    Salut,

    Le titre est sans doute mal choisi...

    En fait, mon but est de pouvoir écrire en gras dans une treeview.

    J'effectue donc un traitement dans le OnCustomDraw, dans mon CDDS_ITEMPREPAINT.

    Le problème, c'est que lorsque j'écris en gras, mon texte est donc plus large, et se j'écris en gras sur la ligne la plus longue du TreeView, j'aimerais qu'il réajuste sa taille en mettant pourquoi pas une scrollbar horizontale.

    Comment faire?

    Merci

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    il faudrait regarder si le treeview genere un message WM_MEASUREITEM

    Auquel cas essaye de surcharger (CWnd :: )OnChildNotify
    et faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    BOOL MyTreeView::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult) 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	switch (message)
        {
        case WM_MEASUREITEM:
            MeasureItem((LPMEASUREITEMSTRUCT)lParam);
            break;
    //.........
       return TRUE;	
    }
    //-------------------------------------------------------------------
    void MyTreeView::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
    {
    	// TODO: Add your code to determine the size of specified item
    	CDC *pDC = GetDC();	
    	if(m_bFont)
    	{
    		CFont* pOldFont = pDC->SelectObject(m_pFont);		
        	TEXTMETRIC tm;
        	pDC->GetTextMetrics(&tm);
        	lpMeasureItemStruct->itemHeight = tm.tmHeight + tm.tmExternalLeading;
    	    lpMeasureItemStruct->itemHeight += lpMeasureItemStruct->itemHeight / 2;    
    		pDC->SelectObject(pOldFont);
    	}
    	ReleaseDC(pDC);		
    }
    Bon c'est pas garantie faut essayer ....


  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Salut!

    En fait, je viens de me rendre compte que tu t'occupais pour ta part de la hauteur des éléments. Moi, je te parlais de la largeur du TreeCtrl devant se remettre à jour si jamais l'un des éléments nécessitait une largeur plus grande, provoquant par la meêm occasion l'apparition d'une scroll bar verticale.

    Sinon, j'ai une question.

    Je voudrais permettre à mon utilisateur de pouvoir sélectionner plusieurs items simultanément dans mon CTreeCtrl. Donc, pour celà, je vais devoir faire du custom draw, et par exemple mettre en gras chacun des éléments sélectionnés.
    J'ai donc besoin de connaître, lorsque mon utilisateur clique sur le treeCtrl, l'élément sur lequel msa souris est positionnée. Comment puis je faire? Je sais qu'il existe un GetSelectedItem, mais le prolème avec lui, c'est que si l'utilisateur clique sur le TreeCtrl, mais en dehors de tout élement, alors GetSelecteditem va quand même me retourner un élément. D'autre part, existe t il un moyen pour moi de savoir si la touche CTRL est enclencée lorsque je traite mon ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)?

    Merci.

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oups désolé ,
    sinon peut etre une piste simple :
    se debrouiller pour que la fonte par defaut du treeview soit une taille au dessus de la fonte utilisée en gras ...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Salut,

    Concernant la largeur "interne" du contrôle, si je mettais une fonte un tout petit peu plus petite en dessinant mon item en gras, je pense que ce ne serait pas beau, car les items en gras donneraient alors l'impression d'être plus petits.

    J'ai fait pas mal de recherche sur la question, mais je ne vois pas. Tu vois, quand on lance en WM_SETFONT sur le contrôle, avec une fonte en gras, alors il va se redimensionner tout seul avant de se dessiner, et la scrollbar horizontale apparaitra alors automatiquement si besoin est.
    Par contre, si je fait un SetItemText, et que je change le texte d'un élément, le controle se redimensionne seulement "à la hausse", ce qui veut dire qu'il doit faire un test du genre: Si largeur(itemModifié) > maLargeur, alors Réajuste(maLargeur) sinon rien.
    J'aurais aimé être en mesure de faire la même chose, mais je ne sais aps où taper...

    Sinon, concernant le test de click à la souris, il suffit en fait d'appeler CTreeCtrl::HitTest!

    Voili...

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    le pb c'est dans le cas d'une combobox ou listbox il y a une fonction qui permet justement de declencher la scrollbar horizontale.
    mais dans le cas du treeview non ...
    il faudrait peut etre utiliser spy pour voir si il y a pas un message specifique..

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Tiens, bonne idée, je vais essayer.

    Mais peut être que c'est une implémentation par défaut du TreeCtrl lorsqu'il reçoit un WM_SETFONT, etc...

    Je vais voir avec Skype.

    Mais c'est vraiment "chiant" ces contrôles opaques... Ca done quasiment envie de réécrire les siens mais 'est un peud ommage pour une utilisation aussi anecdotique (cad l'utilisation que j'en fais), et puis, ça doit vraiment pas être facile à écrire je suppose...

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    c'est vrai que pour le treeview ils ont pas fait beaucoup d'efforts

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Oups, j'ai dit "je vais voir avec Skype", mais je voulais bien entendu dire "avec Spy++"

    Bon, je vais regarder ça...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Bon, alors concernant mon TreeViewCtrl et Spy++.

    En fait, j'ai fait le test avec deux boutons:
    - L'un changeant le premier noeud de mon arbre, lui donnant tantot un texte long tantot un texte court.
    - L'autre donnant à mon arbre tantot un fonte normale, tantot un font bold.

    Alors, ce qu'il faut savoir, c'est qu'en passant d'un texte court à un texte long, l'arbre devient plus large, et donc, une barrre de défilement apparait. Par contre, pour l'opération inverse (passage du long au court), l'espace occupé par l'arbre est effectivement moins large, mais la barre de défilement horizontale reste présente.
    Concernant le bouton de passage en gras, la barre de défilement horizontale apparait quand j'appuie une première fois (=>texte gras) puis disparait lorsque je rappuie (=>texte non gras), donc le WM_SETFONT entraine un recalcul systématique alors que le WM_SETITEM n'entraine un recalcul que si la largeur de l'élément modifié est plus grande que celle de l'arbre.

    Alors, à chaque fois qu'il y un test de fait, je vois avec Spy++ qu'il y a d'abord un voire plusieurs messages de suite envoyés avec le code: "message: 0x2100 (User-defined:WM_USER+7424] wParam=00000000 lParam:00000000", ceux ci provoquant alors un WM_WINDOWPOSCHANGING (+WM_NCCALCSIZE, etc...WM_WINDOWPOSCHANGED) seulement s'il y a besoin de mettre ou d'enlever la barre de défilement horizontal.

    Bref, je pense que tout vient de ce message mystérieux qui provoque si nécessaire l'appel des messages ultérieurs...

    Je ne sais pas comment exploiter ça?

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/10/2012, 15h56
  2. Réponses: 6
    Dernier message: 27/07/2007, 18h17
  3. Ajuster la taille d'un formulaire
    Par tabtab dans le forum Access
    Réponses: 21
    Dernier message: 31/05/2006, 23h35
  4. [JTable] ajuster la taille d'une colonne à la taille du texte
    Par GETah dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 24/02/2005, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo