Einzelne Buttons einer Toolbar deaktivieren



  • Hallo,

    ist es möglich, bei einer Toolbar einzelne Felder zu deaktivieren und grau einzufärben? Ich seh da keine Möglichkeit, aber vielleicht ist ja auch mein Horizont zu beschränkt ...



  • Toolbar funktioniert genauso wie beim Menü. 😃



  • Beim Menu kann ich bei den einzelnen Einträgen auswählen, ob sie grau bzw. aktiviert sein sollen ...
    Wie geht das bei einer toolbar ? dort gibt es diese Option nicht.



  • Ach, du machst das noch nicht während der Laufzeit? 😕

    Okay, die muss jedem Button eine ID geben. Und im Mainframe kannst du eine OnUpdateUI-Funktion dafür erstellen (heißt so ähnlich, wirst du aber erkennen).
    Und da kannst du das dann je nach Bedarf de-/aktivieren.

    pCmdUI->Enable(FALSE);
    

    Und wenn ein Menüpunkt und ein Toolbarbutton für den gleichen Befehl stehen, dann gib ihnen die gleiche ID, weil dann die Selbe Funktion das erledigt. 😃



  • Beim menü mache ich es schon während der Laufzeit, aber so:

    CMenu* mmenu = GetMenu();
    mmenu->EnableMenuItem(ID_MENUEINTRAG,MF_GRAYED);
    

    Also meine Buttons haben eine ID (die gleichen, wie die entsprechenden menüeintrage). Aber das mit der OnUpdataUI-Funktion habe ich nicht ganz kapiert. Habe auch keine Funktion gefunden, die so ähnlich aussieht.

    Vielleicht sollte ich dazusagen, dass es sich hier um eine dialogbasierte Anwendung handelt, bei der ich eine Toolbar "reingebastelt" habe.



  • Klassenassi aufmachen, im Reiter Message Maps (1.)dann Klasse auswählen, dann ID links wählen und dann nur noch auf der rechten Seite auswählen!



  • @polofreak
    ich habe keinen Klassenassistenen (Visual C++ .Net)

    Also einen Menüeintrag kann ich jetzt deaktivieren. Das geht mit dem Event Handler UPDATE_COMMAND_UI. Hier kann ich aber nur den Menüeintrag aktvieren oder deaktivieren. Grau machen geht nicht. Ausserdem wirkt sich das nicht auf die Toolbar aus, obwohl beide ID's gleich sind.



  • mach es von Hand und zwar so in den Messagemaps deiner Klasse in der es ausgegraut werden soll, die auch auf den Dialog bezogen ist

    ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_SETUP, OnUpdateFilePrintSetup)//hier musst halt deine ID mit deinem FKTnamen rein machen
    

    Dann in der gleichen Klasse als FKT

    void CDokumentenVerwaltungView::OnUpdateFilePrintSetup(CCmdUI* pCmdUI) 
    {
    	pCmdUI->Enable(FALSE);	
    }
    

    Und in Header dazu ind den Messagemaps

    afx_msg void OnUpdateFilePrintSetup(CCmdUI* pCmdUI);
    


  • Polofreak schrieb:

    mach es von Hand und zwar so in den Messagemaps deiner Klasse in der es ausgegraut werden soll, die auch auf den Dialog bezogen ist

    ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_SETUP, OnUpdateFilePrintSetup)//hier musst halt deine ID mit deinem FKTnamen rein machen
    

    Dann in der gleichen Klasse als FKT

    void CDokumentenVerwaltungView::OnUpdateFilePrintSetup(CCmdUI* pCmdUI) 
    {
    	pCmdUI->Enable(FALSE);	
    }
    

    Und in Header dazu ind den Messagemaps

    afx_msg void OnUpdateFilePrintSetup(CCmdUI* pCmdUI);
    

    Wenn ich bei dem Menü einen Event Handler erzeuge macht der ganu das, was du geschrieben hast. Aber wie gesagt, das gilt nur für das Menü und graumachen geht auch nicht.



  • Wenn die IDs gleich sind, dann muss das aber gehen.
    So stehts überall in den Büchern und bei mir klappt es auch. 😕

    Hast du irgendwas besonderes an der Toolbar oder so?
    Also, ich habe VC6 und 7 und es funktioniert in beiden Versionen mit EXAKT dem selben Quellcode. 😕



  • Und wie machst du den Menüeintrag grau ? Oder geht das beim deaktivieren automatisch ?



  • Also, ich dachte bisher immer, dass grau und deaktiviert das Selbe ist. 😕

    Weil: Wenn ich was deaktiviere wird das grau (sieht aus wie ein Relief). 🙂



  • By the way kann man so einer OnUpdate auch ne Funktion zuweisen? (Ich hab mal schnell// <-- hier ins Zitat eigefügt wo ich meine). Denn ich mag einmal auf den Menüeintrag die eine Toolbar laden und in ner anderen View soll er da ne andere Toolbar laden wie macht man sowas?

    Polofreak schrieb:

    mach es von Hand und zwar so in den Messagemaps deiner Klasse in der es ausgegraut werden soll, die auch auf den Dialog bezogen ist

    ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_SETUP, OnUpdateFilePrintSetup)//hier musst halt deine ID mit deinem FKTnamen rein machen
    

    Dann in der gleichen Klasse als FKT

    void CDokumentenVerwaltungView::OnUpdateFilePrintSetup(CCmdUI* pCmdUI) 
    {
    	pCmdUI->Enable(FALSE);	// <-- hier
    }
    

    Und in Header dazu ind den Messagemaps

    afx_msg void OnUpdateFilePrintSetup(CCmdUI* pCmdUI);
    

    PS.: Ich bin auch davon überzeugt dass ausgrauen und deaktivieren das gleiche ist.
    PPS.: Wenn Estartu schon Relief in den Raum wirft, wer kann Reliefpfeiler rückwärts sagen?^[kleiner Tip einfach mal rückwärts lesen]^ 😃



  • By the way kann man so einer OnUpdate auch ne Funktion zuweisen?

    Was genau hast du vor? 😕

    Klar kannst du eine Funktion von da aufrufen. Aber unterschätz bitte nicht, wie oft das OnUpdate aufgerufen wird. Gerade bei Toolbarbuttons ist das DAUERND.

    Und wenn das je nach View unterschiedlich sein soll, dann frag die Views doch einfach, welche Toolbar geladen werden soll. 🙂
    Das geht mit GetActiveView (im Mainframe) und dynamic_cast.
    Oder mach ne switch mit m_nCurID und entscheide danach. 🙂



  • Hui ich schau mir mal an was du geschrieben hast und melde mich dann nochmal, so auf die schnelle überfordert mich das!



  • estartu_de schrieb:

    Also, ich dachte bisher immer, dass grau und deaktiviert das Selbe ist. 😕

    Weil: Wenn ich was deaktiviere wird das grau (sieht aus wie ein Relief). 🙂

    Also ich hab jetzt mal ein neues Programm geschrieben. Dialogbasierend und mit einem simplen menü (mit einem Eintrag Test->Test1 ) verknüpft. Über das Menü kann man eine MessagBox aufrufen. Das funktioniert: Klick->MessageBox

    Nun habe ich die ON_UPDATE_COMMAND_UI Funktion eingefügt:

    void CMenu1Dlg::OnUpdateTestTest1(CCmdUI* pCmdUI) 
    {
       pCmdUI->Enable(false);
    }
    

    Wenn ich jetzt auf das Menü klicke, kommt die Messagebox nicht mehr. Also gehe ich davon aus, dass der Menüeintrag deaktiviert ist. Aber aussehen tut der Eintrag noch genau wie davor... nix grau oder Relief



  • Dialog und OnUpdate "beißt" sich auch - leider.

    Da gibt es eine Lösung in der MSDN, die stand auch schon hier im Forum, aber die Suche gehe ja leider mal wieder nicht.

    Wenn du auf SDI mit FormView umsteigen magst, dann hat sich das Problem erledigt. 😃
    Wenn nicht muss du suchen oder warten. 😞



  • estartu_de schrieb:

    Dialog und OnUpdate "beißt" sich auch - leider.

    Da gibt es eine Lösung in der MSDN, die stand auch schon hier im Forum, aber die Suche gehe ja leider mal wieder nicht.

    Wenn du auf SDI mit FormView umsteigen magst, dann hat sich das Problem erledigt. 😃
    Wenn nicht muss du suchen oder warten. 😞

    Hab ich auch gerade festgestellt. 🙂
    Bei einer SDI-Anwendung funktioniert alles so wie es soll. Es ist allerdings viel zu spät um umzusteigen. Aber wenn es so eine Lösung gibt kann ich ja mal suchen. Falls du zufällig drüberstößt, darfst du es gerne hier posten 😉

    Oder hast du vielleicht ein paar Stichwörter? Nach menu, grey etc. hab ich schon gesucht, aber nix gefunden.



  • Such mal nach CDialog ON_UPDATE_COMMAND_UI oder so, ich guck auch mal. 🙂

    Edit: Hab es: http://support.microsoft.com/default.aspx?scid=kb;en-us;242577 🙂



  • estartu_de schrieb:

    Such mal nach CDialog ON_UPDATE_COMMAND_UI oder so, ich guck auch mal. 🙂

    Edit: Hab es: http://support.microsoft.com/default.aspx?scid=kb;en-us;242577 🙂

    DANKE !!
    Das war genau das Richtige. Bin nicht an meinem "richtigen" Rechner, d.h. ob es mit der Toolbar auch geht weiss ich noch nicht, aber Menüeinträge werden jetzt grau und sind deaktiviert.


Log in to reply