none
ON_UPDATE_COMMAND_UI RRS feed

  • Frage

  • Hallo,

    ich bin dabei in einem Dialog eine Dundas-ToolBar mit einer CMFCToolbar zu ersetzten. Anfangs waren die CMFCToolbarButtons deaktivert. Mit SetRouteCommandsViaFrame konnte ich das beheben. Nun habe ich das Problem, dass ein ToolbarButton, welcher den Status checked hat, nicht als solches angezeigt wird. Erst wenn ich auf ihn klicke funktioniert alles wie erwartet (checked und unchecked).
    Aufgefallen ist mir, dass der EventHandler von ON_UPDATE_COMMAND_UI erst aufgerufen wird, wenn ich auf den Button klicke.
    Gibt es eine Möglichkeit nach der Erstellung des Dialoges dieses Event selber zu werfen?
    Ist es normal, dass der EventHandler von ON_UPDATE_COMMAND_UI nicht permanent ausgeführt wird?
    Muss man bei der Erstellung der Toolbar dem Button irgendwie mitteilen das er die Zustände checked und unchecked haben soll, also eigentlich eine CheckBox? 
    Gruß SNMP

    Donnerstag, 13. März 2014 09:19

Antworten

  • Vielen Dank Ionut.
    Die Toolbar bekommt nun alle ON_UPDATE_COMMAND_UI und alle ON_COMMAND-Nachrichten.

    Um die ON_UPDATE_COMMAND_UI-Nachrichten zu bekommen habe ich von der CMFCToolBar abgeleitet, mich dort für die Nachricht WM_IDLEUPDATECMDUI registriert und in dem Handler die Methode OnUpdateCmdUI(pParent, (BOOL)wParamaufgerufen (pParent als CFrameWnd) so wie es in deinem Link beschrieben ist.

    Um die ON_COMMAND-Nachrichten zu bekommen habe ich einfach die Methode SetRouteCommandsViaFrame(FALSEder Toolbar aufgerufen.

    Nun soll der Toolbar ein MenuButton hinzugefügt werden.
    Wäre die Toolbar in einem CFrameWnd wäre es kein Problem.
    Ich würde mich für die Nachricht ON_REGISTERED_MESSAGE(AFX_WM_RESETTOOLBAR, &DLG_SAPConfigurator::OnToolbarReset) registrieren
    und im Handler OnToolbarReset(WPARAM wpLPARAM lp) den entsprechenden Button durch den MenuButton ersetzen.

    Da sich meine Toolbar aber nun in einem Dialog befindet bekommt sie mal wieder die Nachricht (AFX_WM_RESETTOOLBAR) nicht zugestellt. :-(

    Nun habe ich herausgefunden, dass herausgefundendie die Nachricht in seiner Methode  BOOL CMFCToolBar::SetButtons(const UINT* lpIDArray, int nIDCount, BOOL bRemapImages) versendet:
    pParentFrame->SendMessage(AFX_WM_RESETTOOLBAR, (WPARAM) m_uiOriginalResID).
    So weit so gut.
    Jetzt habe in der abgeleiteten Klasse (abgeleitet von CMFCToolBar) diese Methode überschrieben.
    In der überschriebenen Methode habe ich den Inhalt der OriginalMethode hineinkopiert und statt SendMessage den Handler im Dialog direkt aufgerufen:
    MyDialog::OnToolbarReset(AFX_WM_RESETTOOLBAR, (WPARAM) m_uiOriginalResID);
    Allerdings bekomme ich Fehlermeldungen im kopierten Code.
    Kurz gesagt ich habe von CMFCToolBar abgeleitet, dessen Methode SetButtons(...) überschrieben und in der überschriebenen Methode den Originalinhalt der SetButtons-Methode wieder hineinkopiert. Dabei bekomme ich eine Fehlermeldung bei 
    ASSERT_VALID(m_pCustomizeBtn);
    Die Fehlermeldung lautet:
    Error: argument of type "CMFCCustomizeButton *" is incompatible with parameter of type "const CObject *".

    Ich habe keine Ahnung, was ihm da nicht passt.
    Die Methode SetButtons(...) ist virtual, m_pCustomizeBtn ist protected und m_pCustomizeBtn ist von CObject abgeleitet, also vom Typ CObject.

    Hast du vielleicht eine Ahnung, wo das Problem liegt?

    Gruß Sven

     

     

     

    Montag, 24. März 2014 09:02

Alle Antworten