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 :

Taille de bouton incorrecte dans une CToolBar


Sujet :

MFC

  1. #1
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut Taille de bouton incorrecte dans une CToolBar
    Bonjour,

    J'ai une CToolBar avec 3 boutons qui ont le style TBSTYLE_DROPDOWN dans une appli MFC 7.1 (sous VS 2003 SP1).
    Tout a toujours bien fonctionné jusqu'au jour où j'ai voulu rajouter le style XP a mon appli : j'ai inclus dans les ressources le manifest fourni par le Wizzard pour utiliser les COMCTL v6.0.
    Dès que j'ai un bouton avec le style TBSTYLE_DROPDOWN, le controle bascule la taille de tout les boutons en 29x28 au lieu de 24x23, a l'insu des MFC, ce qui cause un débordement dans la barre (la barre est restée à du 24x23). Le basculement n'est pas immédiat et se fait lors du premier appel à CToolBar::_SetButton lors de la mise à jour de l'état d'un bouton par un CCmdUI.

    Est ce que qqu'un est déjà tombé sur ce bug de COMCTL ???
    Comment le contourner ? J'ai beau chercher sur le NET je ne trouve rien sur le sujet.

    Merci d'avance.

    @+

    PS: Version de COMCTL32.DLL : 5.82.2900.2982 utilisé sous XP SP2.

  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
    Par défaut
    salut,
    non je n'ai pas eu ce probléme.
    tu peux montrer comment tu initialises ta barre d'outils ?

  3. #3
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Voila le code de l'initialisation: (dans CMainFrame::OnCreate)

    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
      // création de la barre d'outils standard
      if (  !m_wndStdToolBar.CreateEx(  this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|
                                        CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY,
                                        CRect(0,0,0,0),AFX_IDW_TOOLBAR  ) ||
            !m_wndStdToolBar.LoadToolBar(IDR_MAINFRAME) )
        return -1;
     
      // liste déroulante sur les boutons
      m_wndStdToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
     
      TBBUTTONINFO tbbi;
      tbbi.cbSize=sizeof(TBBUTTONINFO);
      tbbi.dwMask=TBIF_STYLE;
     
      VERIFY(m_wndStdToolBar.GetToolBarCtrl().GetButtonInfo(ID_EDIT_UNDO,&tbbi));
      tbbi.fsStyle|=TBSTYLE_DROPDOWN;
      VERIFY(m_wndStdToolBar.GetToolBarCtrl().SetButtonInfo(ID_EDIT_UNDO,&tbbi));
     
      VERIFY(m_wndStdToolBar.GetToolBarCtrl().GetButtonInfo(ID_EDIT_REDO,&tbbi));
      tbbi.fsStyle|=TBSTYLE_DROPDOWN;
      VERIFY(m_wndStdToolBar.GetToolBarCtrl().SetButtonInfo(ID_EDIT_REDO,&tbbi));
     
      VERIFY(m_wndStdToolBar.GetToolBarCtrl().GetButtonInfo(ID_VIEW_ZOOM_RECT,&tbbi));
      tbbi.fsStyle|=TBSTYLE_DROPDOWN;
      VERIFY(m_wndStdToolBar.GetToolBarCtrl().SetButtonInfo(ID_VIEW_ZOOM_RECT,&tbbi));
    L'autre méthode (la non officielle), en utilisant CToolBar::SetButtonStyle() fonctionne, les boutons ont la bonne taille (tant qu'on ne touche pas à SetSizes() sinon meme prob), par contre il me tronque la première et dernière ligne du BITMAP du bouton quand il est grisé. Si c'est pas un prob, s'en est un autre ...

    @+

  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
    Par défaut
    salut,
    je procéde comme suit:
    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
     
        // TODO: Remove this if you don't want tool tips or a resizeable toolbar
        if(!m_wndToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP, ID_VIEW_TOOLBAR) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
        {
            TRACE0("Failed to create toolbar\n");
            return -1;      // fail to create
        }
        m_wndToolBar.InitSizes(CSize(26,24));    
        m_wndToolBar.SetWindowText(_T("Toolbar"));
        m_wndToolBar.SetDropDownArrow(TRUE);
    //    m_wndToolBar.SetCool();
     //   m_wndToolBar.SetSeparator();
        DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_BUTTONPRD));
            dwStyle |= TBSTYLE_DROPDOWN;
            m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_BUTTONPRD), dwStyle);
        }
        m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
        m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
    InitSizes fait référence a ce post de la faq:
    http://c.developpez.com/faq/vc/?page...rDynamicRedraw
    tu noteras le flag CBRS_SIZE_DYNAMIC pour la toolbar

    pour SetDropDownArrow
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void TToolBar::SetDropDownArrow(BOOL bDropDownArrow) 
    { 
    //    if(m_dwComCtlVersion>=_IE40_COMCTL_VERSION)
        {
            DWORD dwStyleEx=GetStyleEx();
            dwStyleEx=bDropDownArrow ? dwStyleEx|TBSTYLE_EX_DRAWDDARROWS : 
                dwStyleEx&~TBSTYLE_EX_DRAWDDARROWS;
            SetStyleEx(dwStyleEx); 
        }
     
        m_bDropDownArrow=bDropDownArrow;
    }

  5. #5
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Ma barre d'outils n'est pas 'Dockable', donc je n'ai pas besoin de préciser CBRS_SIZE_FIXED ou CBRS_SIZE_DYNAMIC. (j'ai qd meme fais l'essai avec l'un ou l'autre ça ne change rien)

    Pour InitSizes(), ça revient a faire un SetSizes() ?? Comme j'utilise la taille par défaut, je n'y ai pas touché. Pareil, un essai avec ne change rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_wndToolBar.SetWindowText(_T("Toolbar"));
    --> Pas utile car la barre n'est pas flottante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_wndToolBar.SetDropDownArrow(TRUE);
    --> Equivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_wndStdToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
    --> Comme c'est le seul style étendue, je ne fais pas un OR mais une affectation directe. J'ai vérifié, GetExtendedStyle() est bien à 0 avant cette ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_BUTTONPRD));
            dwStyle |= TBSTYLE_DROPDOWN;
            m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_BUTTONPRD), dwStyle);
    --> D'accord, c'est l'autre méthode que j'avais déjà essayé, mais lorsque le bouton est grisé, il me tronque la première et dernière ligne du Bitmap et c'est gênant ... @farscape: Ca doit aussi etre le cas chez toi ??


    J'ai remarqué que le problème ne se pose que pour la première barre d'outils créée. J'ai une deuxieme barre ou je procède de la meme façon et ça marche nickel ...

    Je suis tombé sur ce post ici : http://forums.microsoft.com/MSDN/Sho...38244&SiteID=1

    Apparemment c'est le meme soucis ; j'ai fais l'essai mais WM_SETTINGCHANGE n'arrive jamais ...

    Et quand j'ai tracé pour savoir ou la taille du bouton changeait, c'etait apres un WM_SETREDRAW qui se trouve dans CToolBar::_SetButton (qui d'ailleurs est là pour contourner un bug d'après les MFC )

    Enfin bon, une galère cette histoire. Je continue mes investigations si je trouve qque chose je le posterai ici, ça pourrait servir à d'autres.

    @farscape: merci pour tes reponses

    @+

  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
    Par défaut
    hum attends ton pb ressemble a quelque que j'ai déjà eu .
    j'avais un redimenssionnement bizarre de ma toolbar dans certains cas
    les boutons se dilataient.
    ça ressemble à ton problème .
    faut que je remette la main dessus..

  7. #7
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Cool !!!

    C'est bien ça, tout les boutons de la barre se dilatent dès que je met le style TBSTYLE_DROPDOWN sur un bouton. Mais ça le fait uniquement sur la première barre d'outils, les autres pas de soucis.

    Ou alors j'ai l'autre solution (celle du SetButtonStyle), ou les boutons ont la bonne taille, mais un Bitmap tronqué. (ça n'a pas l'air très stable, car dès qu'on fait un SetSizes(), retour au problème initial, boutons dilatés ... )

    Tu me sauves des heures de debug si tu remets la main dessus

    Merci

    @+

  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
    Par défaut
    arf j'ai eu du mal a remettre la main dessus.
    si on parle bien de la meme chose parce que moi j'avais ce probléme qui survenait de temps en temps a la reactivation de l'application.
    Essaye la chose suivante:
    intercepte le message dans ta mainframe WM_SETTINGCHANGE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) 
    {
     
        if(!uFlags || uFlags==47) return; // je filtre ce message
     
        CMainFrame::OnSettingChange(uFlags, lpszSection);
     
        // TODO: Add your message handler code here    
    }
    ce que j'ai aussi fait :
    Sur ma classe toolbar sur ce message je rappel le dessin complet redrawtoolbar() voir le post de la faq.

  9. #9
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Non c'est pas ça

    Je ne le reçois jamais le WM_SETTINGCHANGE sauf quand je change un paramètre systeme (normal ) ; et là je le reçois bien mais sans effet sur le prob de CToolBar.

    Merci qd meme farscape

    @+

  10. #10
    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
    Par défaut
    tu n'aurais pas un exemple de projet bateau mettant en évidence le pb ?

  11. #11
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    En pièce jointe un projet VS qui montre le soucis.

    Il s'agit d'une appli SDI produite par le Wizzard.
    J'ai tout laissé d'origine, j'ai ajouté les lignes suivantes a la fin de CMainFrame::OnCreate

    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
     
      m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
     
      TBBUTTONINFO tbbi;
      tbbi.cbSize=sizeof(TBBUTTONINFO);
      tbbi.dwMask=TBIF_STYLE;
     
    //  VERIFY(m_wndToolBar.GetToolBarCtrl().GetButtonInfo(ID_FILE_NEW,&tbbi));
    //  tbbi.fsStyle|=TBSTYLE_DROPDOWN;
    //  VERIFY(m_wndToolBar.GetToolBarCtrl().SetButtonInfo(ID_FILE_NEW,&tbbi));
     
      VERIFY(m_wndToolBar.GetToolBarCtrl().GetButtonInfo(ID_FILE_OPEN,&tbbi));
      tbbi.fsStyle|=TBSTYLE_DROPDOWN;
      VERIFY(m_wndToolBar.GetToolBarCtrl().SetButtonInfo(ID_FILE_OPEN,&tbbi));
     
      VERIFY(m_wndToolBar.GetToolBarCtrl().GetButtonInfo(ID_FILE_SAVE,&tbbi));
      tbbi.fsStyle|=TBSTYLE_DROPDOWN;
      VERIFY(m_wndToolBar.GetToolBarCtrl().SetButtonInfo(ID_FILE_SAVE,&tbbi));
    Un truc bizarre : en mode DEBUG, j'ai une assertion sur les trois lignes que j'ai commenté ... ID_FILE_NEW est pourtant dans la ToolBar ????

    Le manifest est inclus automatiquement si on est en _UNICODE

    Enfin tout est réglé dans l'archive ci-jointe, juste a compiler et executer.

    @+
    Fichiers attachés Fichiers attachés

  12. #12
    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
    Par défaut
    salut,
    j'ai testé ton projet sous Vista et Visual 2005, résultat aucun problème ...

  13. #13
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut

    chez moi ça donne ça (voir pièce jointe) --> on voit bien les boutons qui ne sont pas a leur taille et débordent de la barre

    c'est un bug spécifique à la COMCTL 6.0 je pense
    dans la version inférieure de COMCTL (sans le manifest pour le style XP) j'ai aucun soucis.

    bon, je vais continuer à creuser pour trouver une parade

    merci farscape

    @+
    Images attachées Images attachées  

  14. #14
    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
    Par défaut
    re,
    tu devrais essayer la classe de la faq pour appeler la fonction
    RedrawToolBar après la mise en place pour voir.
    il faudra specifier la taille des boutons par InitSizes.

  15. #15
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    ok je vais essayer. je te tiens au courant

  16. #16
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    J'ai essayé.

    Les boutons ont la bonne taille.
    Après essais :

    SetSizes(CSize(23,21),CSize(16,15)); --> résoud le problème de taille

    SetSizes(CSize(23,22),CSize(16,15)); --> cause le problème et c'est d'ailleurs les valeurs par défaut de MFC ...

    Le hic c'est que ça me tronque tjrs la premiere et derniere ligne du bitmap quand il est grisé ...

    Je vais m'y résigner ... tant pis pour le bitmap tronqué, d'autant plus que ça le fais que sur certaines configs Windows seulement.

    Merci pour tout

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bouton "quitter" dans une forme vb6
    Par lebienestrare dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/09/2006, 17h32
  2. [SWING] Bouton "Parcourir" dans une JTable
    Par schniouf dans le forum Composants
    Réponses: 1
    Dernier message: 01/09/2006, 13h40
  3. [FLASH 8] Changer label bouton dynamiquement dans une boucle
    Par Malau dans le forum ActionScript 1 & ActionScript 2
    Réponses: 5
    Dernier message: 03/05/2006, 16h55
  4. Taille de chaque table dans une base de donnée
    Par Florent PORRAS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/09/2005, 21h22
  5. [C#] Lier des boutons radio dans une application mobile
    Par Loïc56 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/04/2005, 13h00

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