Icon in Toolbar ändern



  • Ich möchte bei einer SDI-Anwendung ein Icon in der Toolbar durch ein anderes ersetzen.
    Über die Menüleiste oder die Toolbar soll eine Funktion EIN und AUS geschaltet werden. Der Zustand soll durch zwei verschiedene Darstellungen in der Toolbar dangezeigt werden.
    (Verwende noch VC 5.0)



  • void CTrayDlg::SetTrayIcon(UINT icon)
    {
    	NOTIFYICONDATA iconData;
        iconData.cbSize = sizeof(NOTIFYICONDATA);
        iconData.hWnd = this->GetSafeHwnd();
        iconData.uID = 1;
    	iconData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
    	iconData.uCallbackMessage = WM_NOTIFICATION;
    	iconData.hIcon = (HICON) LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(icon),IMAGE_ICON,16,16,LR_SHARED|LR_DEFAULTCOLOR);
    	Shell_NotifyIcon(NIM_MODIFY,&iconData);
    }
    

    Devil



  • Also ich glaube da gab es ein Mißverständnis. Das Beispiel von devil81 bezieht sich auf Icons im System Tray (also die Icons neben der Uhrzeit).
    Oder???

    Ich möchte allerdings ein Icon in der Toolbar durch ein anderes ersetzen.

    Habe jetzt schon länger im Web nach einer Lösung gesucht und noch nichts gefunden. 😞 PLEASE HELP!!!



  • http://www.henkessoft.de/mfc_einsteigerbuch_kapitel7.htm

    Ich denke/hoffe das könnte dir vielleicht weiterhelfen



  • Hi,
    also unter http://www.henkessoft.de/mfc_einsteigerbuch_kapitel7.htm bin ich nicht weiter gekommen.

    Ich will die Toolbar nicht statisch ändern, sondern zur Laufzeit des Programms ein Icon in der Toolbar ersetzen.

    Vielleicht könnte man auch zwei Buttons in der Toolbar anlegen und immer nur einen einblenden. Aber wie?

    (bin jetzt umgestiegen auf VC++.net, 2003)



  • CToolBarCtrl::SetButtonInfo

    Das Icon muss in der Imagelist deiner Toolbar vorhanden sein. Falls du mit einem CToolBar arbeitest, brauchst du zusätzlich CToolBar::GetToolBarCtrl. Einzelne Buttons kannst du mit CToolBarCtrl::HideButton verstecken bzw. wieder anzeigen.



  • Hallo,
    ich habe jetzt ne Lösung für mein Problem und stelle sie hier der Vollständigkeit halber kurz vor:

    In der Toolbar-Ressource werden beide Bilder direkt hintereinander eingefügt. Die IDs müssen dabei aufeinander folgen!

    In der Funktion CMainFrame::OnCreate wird dann das eine Bild ausgeblendet.

    m_wndToolBar.GetToolBarCtrl().HideButton(ID_COM_VERBINDUNG_OFF, 1);
    

    In die Messagemap wird dann die folgende Funktion eingefügt:

    ON_UPDATE_COMMAND_UI_RANGE(ID_COM_VERBINDUNG_ON, ID_COM_VERBINDUNG_OFF, OnUpdateComVerbindung)
    ON_COMMAND_RANGE(ID_COM_VERBINDUNG_ON, ID_COM_VERBINDUNG_OFF, OnComVerbindung)
    

    Das HeaderFile nicht vergessen!

    afx_msg void OnUpdateComVerbindung(CCmdUI *pCmdUI);
    afx_msg void OnComVerbindung(UINT ID);
    

    Die Ereignisbehandlung erfolgt für beide Bilder in einer Funktion (daher auch ON_COMMAND**_RANGE**).

    void CMainFrame::OnComVerbindung(UINT ID)
    {
        // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
        if( i_conection )
            i_conection = 0;
        else
            i_conection = 1;
    
        // Toolbar-Icon mit der ID ... ausblenden / einblenden
        m_wndToolBar.GetToolBarCtrl().HideButton(ID_COM_VERBINDUNG_ON, i_conection);
        m_wndToolBar.GetToolBarCtrl().HideButton(ID_COM_VERBINDUNG_OFF, !i_conection);
    }
    

    Die ID eines Bildes habe ich mit der Menüleiste und einem Shortcut verbunden. Für das zweite Bild ist dies nicht erforderlich.


Log in to reply