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 :

[MFC] Redimensionnement de ToolBar


Sujet :

MFC

  1. #1
    Membre à l'essai

    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 14
    Points
    14
    Par défaut [Resolu] [MFC] Redimensionnement de ToolBar
    Bonjour a tous,

    Jai un petit probleme de ToolBar que je vous expose :
    Jai cree une CToolBar que je manipule sans probleme.
    Jai ensuite cree une fonction pour cacher ou afficher certains des boutons de cette ToolBar. Tout ceci se deroule bien.
    Mais quand je supprime des boutons via cette option, et que je veux par exemple deplacer la ToolBar, celle ci se reduit et prend la taille des x boutons restants. Pourquoi pas...
    Mais lorsque je veux re-afficher les boutons a nouveau, elle ne s'etend pas et donc certains boutons sont caches, jusqua ce que je reclique sur la barre d'outils, auquel cas elle s'etend et laisse apparaitre tous les boutons.
    Existe t il une solution soit pour fixer la taille de la barre doutils, soit pour redessiner la barre d'outils apres la manip pour qu'elle prenne en compte les modifications ?
    Par avance merci.

  2. #2
    Membre à l'essai

    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 14
    Points
    14
    Par défaut
    Re bonjour tout le monde

    Je me permets de faire remonter ce sujet car jai toujours ce probleme.
    Si l'absence de reponse vient du fait que mon enonce n'etait pas suffisammenet clair, dites le moi et j'essaierai de preciser.

    PS: desole pour les accents, je suis aux Etats Unis donc clavier qwerty...

  3. #3
    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,
    pour préciser les choses quand tu insères/detruit ton bouton la toolbar ne se redimensionne pas c'est ça ?
    lors de l'insertion la toolbar est flottante ou encrée ?

  4. #4
    Membre à l'essai

    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 14
    Points
    14
    Par défaut
    merci de te pencher sur mon probleme.
    lors de l'insertion la toolbar est flottante.
    quand j'insere/detruis le bouton, en effet la toolbar ne se redimensionne pas immediatement, la seule facon de la redimensionner est de cliquer dessus.
    si je peux donner encore plus de precision je le ferai.
    par avance merci bcp

  5. #5
    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,
    je me suis penché sur le pb voici le code proposé :
    Note j'ai pas eu le temps de commenter
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
     
    /////////////////////////////////////////////////////////////////////////////
    // CToolBarEx window
    class CToolBarEx : public CToolBar
    {
    // Construction
    public:
    	CToolBarEx();
     
    // Attributes
    public:
        void  SetSizes(SIZE sizeButton, SIZE sizeImage)
    	{
     
    	    GetToolBarCtrl( ).SetButtonSize(sizeButton);
    	    if(GetToolBarCtrl( ).SetBitmapSize(sizeImage))    m_sizeImage=sizeImage;
    	}
     
        inline void InitSizes(CSize cSizeBitmapSize) 
    	{ 
            m_SizeButton=cSizeBitmapSize;
    		SetSizes(CSize(cSizeBitmapSize.cx+7,cSizeBitmapSize.cy+6),cSizeBitmapSize); 
    		GetToolBarCtrl().AutoSize();
     
    	}
    	bool    SetButtonWidth(UINT nMinWidth,UINT nMaxWidth);
    	CSize	GetButtonsWidth() const;
    	CSize	GetButtonsSize()  const;
     
    	bool	AddButtonToolBar(int nIndexPos,int nidCommand,UINT nIdbitmap,int istring=0);
    	bool	DeleteButtonToolBar(int nIndexPos);
     
    	void	RedrawToolBar(BOOL bRecalcLayout=TRUE,BOOL bOnlyFrame=FALSE);
    	void	RedrawButton(int nIndex);
      	void	UpdateSizes();
     
    	void	ReCalcDynamicLayout(CRect rect,int nIndexPos=-1);
     
     
    // Attributes
    private:
        CSize m_sizeMiniMaxi;
        CSize m_SizeButton;
        CSize m_sizeImage;
     
    // Operations
    public:
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CToolBarEx)
    	//}}AFX_VIRTUAL
     
    // Implementation
    public:
    	virtual ~CToolBarEx();
     
    	// Generated message map functions
    protected:
    	//{{AFX_MSG(CToolBarEx)
    		// NOTE - the ClassWizard will add and remove member functions here.
    	//}}AFX_MSG
     
    	DECLARE_MESSAGE_MAP()
    };
     
    /////////////////////////////////////////////////////////////////////////////
    // CToolBarEx
     
    CToolBarEx::CToolBarEx()
    {
        m_SizeButton.cx=16;
        m_SizeButton.cy=15;
    }
     
    CToolBarEx::~CToolBarEx()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CToolBarEx, CToolBar)
    	//{{AFX_MSG_MAP(CToolBarEx)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CToolBarEx message handlers
    bool CToolBarEx::SetButtonWidth(UINT nMinWidth,UINT nMaxWidth)
    { 
    	ASSERT(::IsWindow(GetSafeHwnd()));
    	ASSERT(nMaxWidth-m_sizeImage.cx>=7);
    	if(SendMessage(TB_SETBUTTONWIDTH, 0, MAKELPARAM(nMinWidth, nMaxWidth)))
    	{
    		m_sizeMiniMaxi.cx=nMinWidth;
    		m_sizeMiniMaxi.cy=nMaxWidth;
    		return true;
    	}
    	return false; 
    }
    //----------------------------------------------------------------
    CSize CToolBarEx::GetButtonsWidth() const
    { 
    	ASSERT(::IsWindow(GetSafeHwnd()));
    	return m_sizeMiniMaxi; 
    }
    //----------------------------------------------------------------
    CSize CToolBarEx::GetButtonsSize() const
    { 
    	ASSERT(::IsWindow(GetSafeHwnd()));
    	DWORD result=(DWORD)::SendMessage(m_hWnd,TB_GETBUTTONSIZE,0,(LPARAM)0); 
    	return CSize(LOWORD(result),HIWORD(result)); 
    }
    //----------------------------------------------------------------
    void CToolBarEx::RedrawToolBar(BOOL bRecalcLayout/*=TRUE*/, 
    								   BOOL bOnlyFrame/*=FALSE*/)
    {
    	ASSERT(::IsWindow(GetSafeHwnd()));
     
    	if(!IsWindowVisible())	return;
     
    	if(bRecalcLayout)
    	{
    		CWnd *pParent=GetToolBarCtrl( ).GetParent();
    		CFrameWnd* pFrameWnd=(CFrameWnd *)pParent->GetParent();		
    		if(pFrameWnd!=NULL)
    		{			
    			pFrameWnd->RecalcLayout();			
    			for(int nIndex=0; nIndex<GetToolBarCtrl( ).GetButtonCount(); nIndex++)
    			{
    				RedrawButton(nIndex);
    				CRect rect;
    				GetItemRect(nIndex,rect);
    				ValidateRect(rect);
    			}
    		}
    	}
    	else
    	{
    		if(!bOnlyFrame)
    		{
    			GetToolBarCtrl( ).RedrawWindow(NULL,NULL,
    				RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_FRAME|RDW_ALLCHILDREN);
    		}
    	}
     
    	if(bOnlyFrame)
    	{
    		GetToolBarCtrl( ).SetWindowPos(NULL,0,0,0,0,
    			SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_DRAWFRAME);
    	}
    }
    //----------------------------------------------------------------
    void CToolBarEx::RedrawButton(int nIndex)
    {
    	ASSERT(::IsWindow(GetSafeHwnd()));
     
    	if(nIndex<0 || nIndex>GetToolBarCtrl().GetButtonCount())
    	{
    		return;
    	}
    	CRect rect;
    	GetToolBarCtrl( ).GetItemRect(nIndex,rect);
    	GetToolBarCtrl( ).RedrawWindow(rect);
    }
    //----------------------------------------------------------------
    void CToolBarEx::UpdateSizes() 
    { 
    	SetSizes(GetButtonsSize(),m_sizeImage); 
    	GetToolBarCtrl().AutoSize();
    }
    //----------------------------------------------------------------
    bool CToolBarEx::DeleteButtonToolBar(int nIndexPos)
    {
    	CRect rect; 
        GetToolBarCtrl( ).GetWindowRect(&rect);
     
    	if(!GetToolBarCtrl( ).DeleteButton(nIndexPos)) return false;
     
    	// resize window 
    	rect.right-=(m_SizeButton.cx+7);
    	SetWindowPos(NULL,0,0,rect.Width(),rect.Height(),
    			SWP_NOMOVE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED);
     
    	ReCalcDynamicLayout(rect);
    	return true;
    }
    //----------------------------------------------------------------
    void CToolBarEx::ReCalcDynamicLayout(CRect rect,int nIndexPos/*=-1*/)
    {
    	SetWindowPos(NULL,0,0,rect.Width(),rect.Height(),
    			SWP_NOMOVE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED);
     
    	if(IsFloating())  
        {
            CPoint newPos(0,0);        
            ClientToScreen(&newPos);
            CRect rcNew;
          //  GetToolBarCtrl().SetRows(GetToolBarCtrl().GetRows(),TRUE, &rcNew);
     
            CalcDynamicLayout(rect.Width(),LM_HORZ | LM_COMMIT);
     
    		CWnd *pParent=GetToolBarCtrl( ).GetParent();
    		CFrameWnd* pFrameWnd=(CFrameWnd *)pParent->GetParent();
     
    		if(pFrameWnd)
            pFrameWnd->FloatControlBar(this, newPos,CBRS_ALIGN_TOP | CBRS_SIZE_DYNAMIC);
        }
     
        RedrawToolBar();
    	if(nIndexPos>0)	RedrawButton(nIndexPos);
     
    }
    //----------------------------------------------------------------
    bool CToolBarEx::AddButtonToolBar(int nIndexPos,int nidCommand,UINT nIdbitmap,int istring/*=0*/)
    {		
    	BOOL bok;
     
    	CRect rect; 
            GetToolBarCtrl( ).GetWindowRect(&rect);
     
    	TBBUTTON Buttons;	
    	GetToolBarCtrl( ).AddBitmap(1,nIdbitmap);
    	Buttons.iBitmap=nIndexPos;
    	Buttons.idCommand=nidCommand;
    	Buttons.fsState=TBSTATE_ENABLED;
    	Buttons.fsStyle=TBSTYLE_BUTTON;
    	Buttons.dwData=0;
    	Buttons.iString=istring;
    	bok=GetToolBarCtrl( ).AddButtons(1,&Buttons);
     
    	SetButtonWidth(0,m_SizeButton.cx+7);
     
    	InitSizes(m_SizeButton);
     
    	// resize window 
    	rect.right+=(m_SizeButton.cx+7);
     
    	ReCalcDynamicLayout(rect,nIndexPos);
        return (bok?true:false);
    }
    // initialisation: rajouter eventuellement initSize dans la mainframe si la toolbar n'a pas une dimension standard 15,16 pour les boutons.
    // rajout d'un bouton par un bitmap IDB_BITMAP1 a la position 8 associe a la commande ID_BUTTONADD
    CMainFrame * pMain=(CMainFrame *)AfxGetMainWnd();  
    pMain->m_wndToolBar.AddButtonToolBar(8,ID_BUTTONADD,IDB_BITMAP1);
     
    // del d'un bouton 
    CMainFrame * pMain=(CMainFrame *)AfxGetMainWnd();
    pMain->m_wndToolBar.DeleteButtonToolBar(8);
    l'ajout d'un bouton prend en charge le recalcul et le dessin de la toolbar encrée ou non.
    deux methodes sont utilisées suivant que la toolbar est encrée ou non
    voir fonction ReCalcDynamicLayout.

    essaye et dis moi le resultat ,
    ce post sera remanié pour intégration dans la faq.

  6. #6
    Membre à l'essai

    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 14
    Points
    14
    Par défaut
    Tout d'abord merci beaucoup pour ce travail qui a du te demander pas mal de reflexion et d'investissement.

    J'ai donc tente aujourd'hui meme de mettre en pratique ce code. Mais malheureusement l'essai n'a pas ete concluant.

    Peut etre s'agit il d'une mauvaise implementation de ma part.

    J'explique ce que j'ai fait:
    - Creation d'un fichier ToolBarEx.h avec les 30 premieres lignes a peu pres jusqu'a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE_MESSAGE_MAP() 
    };
    - Creation d'un fichier ToolBarEx.cpp avec le reste du code
    - Changement de tous les ToolBar de mon programme en ToolBarEx
    - Inclusion du ToolBarEx.h dans le MainFrm.h de mon application.
    - J'ai meme rajoute un UpdateData apres au cas ou il faille redessiner la fenetre.

    Rien n'y fait, le resultat est le meme qu'avant.

    Encore une fois merci beaucoup pour la premiere piste, si vous vouez quoi que ce soit d'incorrect dans ce qui precede, merci de m'en faire part.

  7. #7
    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,
    bizarre verifie tes initialisations au niveau de la toolbar:
    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
     
        if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP
    		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    	{
    		TRACE0("Failed to create toolbar\n");
    		return -1;      // fail to create
    	}
     
        m_wndToolBar.InitSizes(CSize(16,15));
     
    	m_wndToolBar.SetWindowText(_T("Toolbar"));	
    	m_wndToolBar.UpdateSizes();
    	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
     
     
    	// TODO: Delete these three lines if you don't want the toolbar to
    	//  be dockable
    	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    	EnableDocking(CBRS_ALIGN_ANY);
    	DockControlBar(&m_wndToolBar);
    exemple d'implementation dans la mainframe

  8. #8
    Membre à l'essai

    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 14
    Points
    14
    Par défaut
    Comme tu peux le voir dans le titre du message, le probleme est maintenant RESOLU !

    Franchement je te remercie beaucoup, ce petit detail qui n'est pas primordial me permet de terminer mon developpement de 4 mois sur une application tres importante pour la societe pour laquelle je travaille.

    A tres bientot merci encore !

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

Discussions similaires

  1. [MFC] redimensionner un controle
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 01/09/2005, 17h06
  2. Réponses: 2
    Dernier message: 09/08/2005, 13h02
  3. [MFC] Redimensionnement de dialog
    Par benahpets dans le forum MFC
    Réponses: 1
    Dernier message: 07/07/2005, 14h11
  4. (MFC) Redimensionner une List Control auto / Boite Dlg
    Par Guybrush113 dans le forum MFC
    Réponses: 7
    Dernier message: 23/04/2004, 09h24
  5. Redimensionner une ToolBar
    Par tscoops dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/11/2003, 16h46

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