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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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..

+ 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