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