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 :

[retour] 2 événement à partir d'un même bouton Toolbar : [FAQ]


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut [retour] 2 événement à partir d'un même bouton Toolbar :
    Bonjour,

    Comment faire pour n'avoir qu'un seul bouton dans la Toolbar qui fasse 2 fonctions (avec leur image associée) :
    par exemple au premier coup sa fonction est Play (symbole "PLAY" ) et au deuxième coup sa fonction est Stop (symbole "STOP").

    Je vois bien comment faire au niveau de la fonction appelée par le menu associée à un bouton pour qu'elle fasse soit l'un soit l'autre, mais je vois pas comment ces boutons qui sont dessinés dans la Toolbar (avec leur commentaire pour la description de chacun dans la barre d'état) qui normalement sont fait pour une fonction peuvent alterner entre eux dans ce cas.

    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
    Par défaut
    salut,
    en fait pour ton probleme tu as besoin:
    d'une variable booleen locale a la classe de traitement .
    sur le click du bouton en fonction la valeur du boolean tu fais l'un des deux traitements et tu inverses
    le booleen .
    pour changer l'image du bouton :
    pour commencer dans OnInitialUpdate on rajoutera le bitmap de l'autre etat du bouton dans la toolbar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CToolBarCtrl *pctrl;
     CChildWnd *pChild=static_cast<CChildWnd *>(GetParentFrame());	
    pctrl=&pChild->m_wndToolBar.GetToolBarCtrl();
    if(pctrl) pctrl->AddBitmap(nbt,IDB_BITMAPSTOP);
    nbt = dernier bouton +1

    dans la child on rajoutera la fonction suivante:
    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
     
    //----------------------------------------------------------------
    BOOL CChildWnd::SetButtonImage(int nID,int nImage)
    {
            TBBUTTONINFO tbbi;
    	tbbi.dwMask = TBIF_IMAGE;
    	tbbi.cbSize = sizeof tbbi;
     
    	BOOL b=m_wndToolBar.GetButtonInfo(nID, &tbbi );
            if(b)
           {
         	       tbbi.iImage=nImage;
                   b=m_wndToolBar.SetButtonInfo(nID,&tbbi);	
         	      m_wndToolBar.GetToolBarCtrl()->RedrawWindow();
           }
    	return b;
    }
    a partir de la view:
    il faudra acceder a la toolbar avec la fonction GetParentFrame() tu obtiens la child que tu castes sur la bonne classe.
    de la tu a acces a l'objet toolbar.
    ensuite il faut donner une autre image au bouton .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     CChildWnd *pChild=static_cast<CChildWnd *>(GetParentFrame());	
     pChild->SetButtonImage(ID_BUTTONPLAYSTOP,nImage);
    ID_BUTTONPLAYSTOP c'est l'identifiant du bouton dans la toolbar.
    nImage c'est le numero d'image du bouton ,soit le numero normal soit le dernier numero (nbt) bitmap specifié dans OnInitialUpdate .

    l'info du numero de l'image en cours peut etre la solution pour connaitre l'etat en cours (a la place du booleen):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BOOL CChildWnd::GetButtonImage(int nID,int &rnImage)
    {
       TBBUTTONINFO tbbi;
       tbbi.dwMask = TBIF_IMAGE;
       tbbi.cbSize = sizeof tbbi;
     
       BOOL b= m_wndToolBar.GetToolBarCtrl().GetButtonInfo(nID, &tbbi );
     
       rnImage=tbbi.iImage;
     
       return b;
    }
    utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CChildWnd *pChild=static_cast<CChildWnd *>(GetParentFrame());	
     
    int nImage;
    pChild->GetButtonImage(0, ID_BUTTONPLAYSTOP,nImage);
    bon avec ça tu devrais etre paré ..

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    Oui, je suis paré pour les galères

    Comment dire, commençons par le début:
    Dans ma Toolbar personnelle (IDR_MYTOOLBAR), j'ai dessiné le symbole "PLAY" et donné le nom ID_PLAYSTOP au bouton.
    Pour le symbole "STOP", je me suis servi aussi d'une Toolbar provisoire avec un seul bouton pour créer mon bmp, et je l'ai insérer ensuite par les ressources pour avoir le IDB_BITMAPSTOP dont tu parlais.
    Toutes mes Toolbars sont déclarées dans la fonction OnCreate de la classe CMainFrame (où sont donc présentes mes variables m_wndMyToolbar) d'où les aménagements faits dans le code ci-dessous.

    Il y a du CChilWnd dans ton code, mais moi ma classe (MDI) c'est CChilFrame, bref, j'ai mis SetButtonImage aussi dans CMainFrame.

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    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
    void CMyProjectView::OnTestStartStop()
    {
    	if (m_bTestStop)
    	{
    		AfxMessageBox("Stop!");
    		CMainFrame *pMainFrame=static_cast<CMainFrame*>(GetParentFrame());   
    		pMainFrame->SetButtonImage(ID_PLAYSTOP,5); //le bouton supplémentaire STOP
    		m_bTestStop=FALSE;
    	}
    	else
    	{
    		AfxMessageBox("Play!");
    		CMainFrame *pMainFrame=static_cast<CMainFrame*>(GetParentFrame());   
    		pMainFrame->SetButtonImage(ID_PLAYSTOP,4); //le bouton d'origine de la Toolbar
    		m_bTestStop=TRUE;
    	}
    }



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void CMyProjectView::OnInitialUpdate()
    {
    	CView::OnInitialUpdate();
     
     	//boutons à 2 états :
    	CToolBarCtrl *pctrl;
    	CMainFrame *pMainFrame=static_cast<CMainFrame *>(GetParentFrame());    
    	pctrl=&pMainFrame->m_wndMyToolbar.GetToolBarCtrl();
    	if(pctrl) pctrl->AddBitmap(5, IDB_TESTSTOP); //j'ai 4 boutons, le PLAY y compris
     
    }
    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
     
    BOOL CMainFrame::SetButtonImage(int nID, int nImage)
    {
    	TBBUTTONINFO tbbi;
    	tbbi.dwMask = TBIF_IMAGE;
    	tbbi.cbSize = sizeof tbbi;
     
    	BOOL b=m_wndMyToolbar.GetButtonInfo(nID, &tbbi );
    	if(b)
    	{
    		tbbi.iImage=nImage;
    		b=m_wndMyToolbar.SetButtonInfo(nID,&tbbi);   
    		m_wndMyToolbar.GetToolBarCtrl()->RedrawWindow();
    	}
    	return b; 
    }
    Résultats :
    MainFrm.cpp(309) : error C2660: 'CToolBar::GetButtonInfo' : la fonction ne prend pas 2 arguments
    MainFrm.cpp(313) : error C2660: 'CToolBar::SetButtonInfo' : la fonction ne prend pas 2 arguments
    MainFrm.cpp(314) : error C2819: le type 'CToolBarCtrl' n'a pas d'opérateur 'operator ->' de membre surchargé
    MainFrm.cpp(314) : error C2227: la partie gauche de '->RedrawWindow' doit pointer vers un class/struct/union

  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
    oui ok ,
    c'est du code ecrit en direct donc pas compiler lol:
    version corrigée:
    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
     
    BOOL CMainFrame::SetButtonImage(int nID, int nImage)
    {
       TBBUTTONINFO tbbi;
       tbbi.dwMask = TBIF_IMAGE;
       tbbi.cbSize = sizeof tbbi;
     
       BOOL b=m_wndMyToolbar.GetToolBarCtrl().GetButtonInfo(nID, &tbbi );
       if(b)
       {
          tbbi.iImage=nImage;
          b=m_wndMyToolbar.GetToolBarCtrl().SetButtonInfo(nID,&tbbi);   
          m_wndMyToolbar.GetToolBarCtrl().RedrawWindow();
       }
       return b;
    }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    OK, et pour finir, il ne veut pas faire ça dans OnInitialUpdate()

    if(pctrl) pctrl->AddBitmap(5,IDB_TESTSTOP);

    Debug Assertion failed
    File : winctrl2.cpp
    Line:197

    Quand on va voir :

    int CToolBarCtrl::AddBitmap(int nNumButtons, UINT nBitmapID)
    {
    ASSERT(::IsWindow(m_hWnd));
    TBADDBITMAP tbab;
    tbab.hInst = AfxFindResourceHandle((LPCTSTR)(DWORD_PTR)nBitmapID, RT_BITMAP);
    ASSERT(tbab.hInst != NULL);
    tbab.nID = nBitmapID;
    return (int) ::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons,
    (LPARAM)&tbab);
    }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    En fait en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CMainFrame *pMainFrame=static_cast<CMainFrame*>(GetParentFrame());
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CMainFrame *pMainFrame=NULL;;
     
    	CFrameWnd* pFW = reinterpret_cast<CFrameWnd*>(AfxGetMainWnd())->GetActiveFrame();
        if(pFW)
    	 pMainFrame= static_cast<CMainFrame *>(pFW->GetParentFrame());
    ça marche.

    Merci.[/code]

  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
    Par défaut
    donc tout est ok ?
    tu a reussi a changer le bitmap ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    Oui, oui; ça a juste été un peu galère après à comprendre les positions des symboles :


    exemple : on a 4 boutons (celui qui nous intéresse y compris qui est placé en seconde position).

    Et bien pour l'effet voulu, il faut faire :
    if(pctrl)
    pctrl->AddBitmap(4,IDB_TESTSTOP);


    et :
    if (m_bTestStop)
    {
    AfxMessageBox("Stop!");
    pMainFrame= static_cast<CMainFrame *>(pFW->GetParentFrame());
    pMainFrame->SetButtonImage(ID_PLAYSTOP,1); //le bouton 1 est en 0, etc
    m_bTestStop=FALSE;

    }
    else
    {
    AfxMessageBox("Play!");
    pMainFrame= static_cast<CMainFrame *>(pFW->GetParentFrame());
    pMainFrame->SetButtonImage(ID_PLAYSTOP,4);
    m_bTestStop=TRUE; //le bouton supplémentaire (en réalité en 5ième position)
    }

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    Finalement, il reste des choses à dire et quelques problèmes :

    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
     
    BOOL CMainFrame::SetButtonImage(int nID, int nImage)
    {
    	TBBUTTONINFO tbbi;
    	tbbi.dwMask = TBIF_IMAGE;
    	tbbi.cbSize = sizeof tbbi;
     
    	BOOL b=TRUE; //plus besoin de b
     
    	//BOOL b=m_wndMyToolbar.GetToolBarCtrl().GetButtonInfo(nID, &tbbi );
    	//if(b)
    	//{
    		tbbi.iImage=nImage;
    		b=m_wndMyToolbar.GetToolBarCtrl().SetButtonInfo(nID,&tbbi);
    		m_wndMyToolbar.GetToolBarCtrl().RedrawWindow();
    	//}
    	return b;
    }
    Les lignes en commentaire sont à supprimer pour la bonne et simple raison que cette connerie de fonction GetButtonInfo ne renvoie pas un booléen mais la position du bouton dans la Toolbar!!!!!!!!!!!!!
    Je suis furieux (contre le mec qui a créé cette fonction sois-disant booléenne) d'avoir perdu des heures à comprendre ça : si j'ai dis précédemment que tout se passait bien, c'est que comme par hasard j'étais tombé dans le cas particulier où mon bouton était en deuxième position (donc 1 puisqu'on retranche 1 à chaque fois).

    C'est pour ça que ça fait 4 heures que je me demande pourquoi j'ai b=0 quand il s'agit du premier bouton (et avec d'autres essais, j'ai vu que ça faisait 2 pour le troisième bouton, etc.).



    Voilà pour la précision, voici les problèmes maintenant :


    1°/
    Il est impossible de créer 2 boutons à 2 états dans la même ToolBar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(pctrl)
    		{
    			pctrl->AddBitmap(4, IDB_NEWBUTTON1);
    			pctrl->AddBitmap(5, IDB_NEWBUTTON2);
    		}
    Là, le NEWBUTTON1 sera accessible, mais l'autre non!


    2°/
    Si on a bien les images qu'on veut, j'aurais aussi souhaité qu'on puisse avoir une description propre à chaque bouton (celle qu'on écrit dans le champ "Prompt" des propriétés du bouton.

    3°/
    Quand on est dans l'état où on fait appel à l'image ajoutée, le bouton est dans l'état enfoncé, ce que je ne veux pas.


    Voilà, voilà...

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut

  11. #11
    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,
    traitement child ou MainFrame ( a adapter selon).
    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
     
    class CChildFrame : public CMDIChildWnd
    {
    	DECLARE_DYNCREATE(CChildFrame)
    public:
    	CChildFrame();
     
    // Attributes
    public:
    CToolBar    m_wndToolBar;
     
    // Operations
    public:
    	struct CUSTOMBT
    	{
    		int nIndiceOrg;
    		int nIndiceNew;
    		CString strNewTxt;
    		CString strOldtxt;
    	};
     
    	void	SetButton(int nIDBt,UINT nBitmapID,const char *szNextText);
    	int		UpdateButton(int nIDBt);
     
    	BOOL	SetButtonImage(int nIDBt,int nImage);
    	BOOL	GetButtonImage(int nIDBt,int &rnImage);
    	BOOL	AddBitmapToolBar(int nNumButtons,UINT nBitmapID );
    	BOOL	SetButtonPressed(int nIDBt,bool bPressed=true);
     
    	int	   GetButtonCount();
     
    private:
    	CMap<UINT ,UINT ,struct CUSTOMBT ,struct CUSTOMBT> m_mapCustomBt;
    //......................
    code:
    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
     
    //----------------------------------------------------------------
    int CChildFrame::UpdateButton(int nIDBt)
    {
    	struct CUSTOMBT custom;
     
    	if(!m_mapCustomBt.Lookup(nIDBt,custom)) return -1;
     
    	int rnImage;
    	if(GetButtonImage(nIDBt,rnImage))
        {					
    		rnImage=(rnImage==custom.nIndiceNew?custom.nIndiceOrg:custom.nIndiceNew);
     
            SetButtonImage(nIDBt,rnImage);
     
    		// met le bouton enfoncé dans le cas du deuxieme etat.
    		SetButtonPressed(nIDBt,rnImage==custom.nIndiceNew);
    		return (rnImage==custom.nIndiceNew);
        }
    	return -1;
    }
    //----------------------------------------------------------------
    void CChildFrame::SetButton(int nIDBt,UINT nBitmapID,const char *szNextText)
    {
    	struct CUSTOMBT custom;
     
    	int nNumButtons=m_wndToolBar.GetToolBarCtrl().GetImageList()->GetImageCount();
    	custom.nIndiceNew=AddBitmapToolBar(nNumButtons,nBitmapID);
     
    	custom.strNewTxt=szNextText;
     
    	GetButtonImage(nIDBt,custom.nIndiceOrg);
     
    	m_mapCustomBt.SetAt(nIDBt,custom);
    }
    //----------------------------------------------------------------
    BOOL CChildFrame::SetButtonImage(int nIDBt,int nImage)
    {
     
        TBBUTTONINFO tbbi;
        tbbi.dwMask = TBIF_IMAGE;
        tbbi.cbSize = sizeof tbbi;
     
        BOOL b=m_wndToolBar.GetToolBarCtrl().GetButtonInfo(nIDBt, &tbbi );
        if(b)
        {
            tbbi.iImage=nImage;		
            b=m_wndToolBar.GetToolBarCtrl().SetButtonInfo(nIDBt,&tbbi);
            m_wndToolBar.GetToolBarCtrl().RedrawWindow();
        }
        return (b && b!=-1);
    } 
    //----------------------------------------------------------------
    BOOL CChildFrame::GetButtonImage(int nIDBt,int &rnImage)
    {
       char sztext[256];
     
       TBBUTTONINFO tbbi;
       tbbi.dwMask = TBIF_IMAGE;
     
       tbbi.cbSize = sizeof tbbi;
     
       BOOL b= m_wndToolBar.GetToolBarCtrl().GetButtonInfo(nIDBt, &tbbi );
     
       rnImage=tbbi.iImage;
     
     
       return (b && b!=-1);
    } 
    //----------------------------------------------------------------
     
    BOOL CChildFrame::AddBitmapToolBar(int nNumButtons,UINT nBitmapID )
    {     
       return m_wndToolBar.GetToolBarCtrl().AddBitmap(nNumButtons,nBitmapID);
    }
    //----------------------------------------------------------------
    int CChildFrame::GetButtonCount()
    {
        // nombre de boutons dans la toolbar separateur compris.
        int nct=m_wndToolBar.GetToolBarCtrl().GetButtonCount();
        int nCount=0;
        TBBUTTON tb;
        for(int i=0;i<nct;i++)
        {
            m_wndToolBar.GetToolBarCtrl().GetButton(i,&tb);
    		// si l'indice commande du bouton est valide ok on a bien un bouton.
            if(tb.idCommand) nCount++;
        }
        return nCount;
    }
    //----------------------------------------------------------------
    BOOL CChildFrame::SetButtonPressed(int nIDBt,bool bPressed/*=true*/)
    {
       int nState=TBSTATE_ENABLED ;
       if(bPressed) nState|=TBSTATE_PRESSED;
     
       return m_wndToolBar.GetToolBarCtrl().SetState(nIDBt,nState);
    }
    partie view:
    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
     
    void CTestToolBarView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
    	ResizeParentToFit();
     
    	// acces à la frame (parent de la classe fenetre).
        CChildFrame *pChild=static_cast<CChildFrame *>(GetParentFrame());
     
    	// ajout du bitmap en fin de toolbar .
     
        pChild->SetButton(ID_BUTTONOPENCLOSE,IDB_BITMAPCLOSE,"");
        pChild->SetButton(ID_BUTTONOPENCLOSE2,IDB_BITMAPCLOSE2,"");
    }
    void CTestToolBarView::OnButtonopenclose() 
     
    {
    	// TODO: Add your command handler code here
        int rnImage;
        CChildFrame *pChild=static_cast<CChildFrame *>(GetParentFrame());  
        pChild->UpdateButton(ID_BUTTONOPENCLOSE); 
     
    }
    void CTestToolBarView::OnButtonopenclose2() 
    {
    	// TODO: Add your command handler code here
    	int rnImage;
        CChildFrame *pChild=static_cast<CChildFrame *>(GetParentFrame());  	
        pChild->UpdateButton(ID_BUTTONOPENCLOSE2);
     
    }
    UpdateButton renvoie 0 :etat initial 1:nouvel etat.
    exemple:
    http://farscape.developpez.com/Samples/TestsToolbar.zip

    ps: je n'ai pas encore traité les tooltips ,j'ai fais ça rapidement ,j'ai pas tout testé.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    Hum, ça devient complètement atrioce là : mais c'est la galère pour faire un bouton à 2 états ma parole!!!

    Bref, j'ai recopié tout ça presque tel quel (moi, c'est CMainFrame, donc pas de ResizeParentToFit(); dans le OnInitialUpdate )


    Par contre ASSERT FAILURE dans le SetButton(...........):
    int nNumButtons=m_wndToolBar.GetToolBarCtrl().GetImageList()->GetImageCount();

    Si on décompose:
    CToolBarCtrl& Ctrlb= m_wndMyToolbar.GetToolBarCtrl();
    CImageList *pList = Ctrlb.GetImageList(); //c'est ici
    int nNumButtons=pList->GetImageCount();


    Ca a l'air d'être à cause de hWnd de ma toolbar qui est perdu entre le OnCreate du MainFrame et le OnInitialUpdate de la View, je sais pas pouquoi (alors que dans ton exemple, ça suit le même genre de chemin mais le hwnd ne bouge pas)

  13. #13
    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
    bizarre ,c'est quoi ton projet ?
    j'ai essaye ça sur un projet SDI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void CSampleSDIView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
    	GetParentFrame()->RecalcLayout();
    	ResizeParentToFit();
     
    	CMainFrame *pFrame=static_cast<CMainFrame *>(AfxGetMainWnd());
    	ASSERT(pFrame->m_wndToolBar.GetToolBarCtrl().m_hWnd);
    	pFrame->m_wndToolBar.GetToolBarCtrl().GetImageList()->GetImageCount();
     
    }
    pas de problemes.
    essaie quand meme de mettre :GetParentFrame()->RecalcLayout();

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    C'est un projet MDI

    Va savoir pourquoi, cette fois ça marche (en remettant CMainFrame *pFrame=static_cast<CMainFrame *>(AfxGetMainWnd()); )

    Bref, là ça se lance.
    Je sais pas encore pourquoi il veut pas charger ma nouvelle image (grrrrr...) mais je suis dessus! (j'ai un bouton qui reste enfoncé avec la même image vaguement grisée pour l'instant...)

  15. #15
    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
    dans un projet MDI encore plus bizarre !
    a mon avis tu exploses la memoire quelque part ou tu fais un cast invalide.
    tu peux me montrer ton initialUpdate ?


  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    En fait si tu te rappelles, dans ce que tu m'avais dit hier, le seul moyen que j'avais trouvé pour résoudre un problème, c'était d'obtenir le pMainFrame comme ça:

    CMainFrame *pMainFrame=NULL;;
    CFrameWnd* pFW = reinterpret_cast<CFrameWnd*>(AfxGetMainWnd())->GetActiveFrame();
    if(pFW)
    {
    pMainFrame= static_cast<CMainFrame *>(pFW->GetParentFrame());
    //...............
    }

    Et là c'est ça qui fait planter et l'autre solution marche...n'importe quoi cette histoire!


    Bon, là je suis sur GetButtonImage qui me renvoie FALSE pour l'instant.

    m_wndMyToolbar.GetToolBarCtrl().GetButtonInfo(nIDBt, &tbbi ); --> 0


    GRRRRRRRRRRRRR mais c'est pas un booléen que renvoie cette fonction, c'est encore la position du bouton, voilà pourquoi j'ai un "0" moi pour mon bouton en première position.

    J'enlève le test du retour de GetButtonInfo.

  17. #17
    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
    bon y a embrouille la !
    c'sst la toolbar de la mainframe que tu veux traiter ?
    donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CMainFrame *pFrame=static_cast<CMainFrame *>(AfxGetMainWnd());
    ça doit suffire.
    j'ai fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void CTestToolBarView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
    	ResizeParentToFit();
     
    	CMainFrame *pFrame=static_cast<CMainFrame *>(AfxGetMainWnd());
    	pFrame->m_wndToolBar.GetToolBarCtrl().GetImageList()->GetImageCount();
    sans pb.

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    Bon, en enlevant tous les tests liés à la valeur de retour de GetButtonInfo = fonction maudite, ça y est, j'ai enfin ma nouvelle image...

    il reste le problème que le bouton apparaît comme appuyé, ce que je ne souhaite pas.
    Même en enlevant :
    SetButtonPressed(nIDBt,rnImage==custom.nIndiceNew);

    ou en remplaçant par :
    SetButtonPressed(nIDBt, FALSE);

    ça reste appouyé (avant de revenir à l'état normal quand on rappelle le bouton initial)

  19. #19
    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
    tres bizarre ...
    tu fais quoi dans le message du bouton ?
    tu ne ferait pas un traitement en boucle ?

    tu as essayé avec mon projet ? ça fonctionne tres bien.

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    Ah OK, exact (j'ai essayé avec juste un AfxMessageBox et ça se comporte "normalement"), c'est une fonction qui est en cours jusqu'à temps qu'on l'arrête, d'où l'état appuyé du bouton (c'est juste un peu déstabilisant car si on voit un bouton enfoncé, on n'a pas envie d'appuyer dessus).

    M'enfin c'est pas grave, si ça se résoud je prend, sinon tant pis.
    Un autre détail alors, pour les infos du Prompt, on est obligé d'écrire les actions communes des 2 états alors, et pas de chacun au moment où ils sont actifs; pareil, c'est pas si grave.



    Et bien on arrive au bout!

    PS: et oui, ton exemple marche depuis le début, c'est ça qui m'énerve, c'est de voir "la même chose" dans mon programme qui ne marche pas, lol

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. affecter plusieurs évènements à un même bouton
    Par supcomingenieur dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 29/05/2013, 19h03
  2. [VBA-E]Retour a la ligne dans la même cellule
    Par el.meyo dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/07/2006, 17h28
  3. [VB.Net] popup variables à partir d'un même bouton
    Par bubuchanwa dans le forum ASP.NET
    Réponses: 6
    Dernier message: 25/07/2005, 14h44
  4. Réponses: 3
    Dernier message: 08/01/2005, 10h01
  5. [débutant] 2 alternatives pour un même bouton
    Par pacha1 dans le forum Composants
    Réponses: 5
    Dernier message: 25/06/2004, 11h13

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