Benutzer mit den meisten Antworten
ON_UPDATE_COMMAND_UI

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
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)wParam) aufgerufen (pParent als CFrameWnd) so wie es in deinem Link beschrieben ist.
Um die ON_COMMAND-Nachrichten zu bekommen habe ich einfach die Methode SetRouteCommandsViaFrame(FALSE) der 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 wp, LPARAM 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
- Als Antwort vorgeschlagen Ionut DumaModerator Montag, 24. März 2014 10:30
- Als Antwort markiert Ionut DumaModerator Mittwoch, 26. März 2014 13:11
Alle Antworten
-
Hallo Sven,
Schau Dir mal folgende Artikel an http://support.microsoft.com/kb/242577/en-us
Gruss,
Ionut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hi Ionut,
das sieht nun schon ganz gut aus bei mir, danke für den Artikel.
Nun muss ich in meiner Toolbar (welche sich in dem Dialog befindet) ein CMFCToolBarMenuButton einfügen.
Bei einem CMainFrame funktioniert es wie folgt:
Es wird über das Makro AFX_WM_RESETTOOLBAR ein Event geworfen und in dem entspechenden Handler,
z.B. CMainFrame::OnToolbarReset(WPARAM wp,LPARAM), der neue Button gesetzt/ersetzt:
mcTBMain.ReplaceButton(ID_RSQVIEW_LAST, CMFCToolBarMenuButton( ... );
Bei meinem Dialog habe ich wieder das Problem, dass das Event nicht ankommt und der Handler nicht aufgerufen wird.
Nun habe ich mal eine Verständnisfrage:
Verstehe ich es richtig, dass die Toolbar in bestimmten Situationen dieses Event (AFX_WM_RESETTOOLBAR ) wirft und man sich in einem CMainFrame dafür registrieren (mit einem Handler) kann?
Weshalb kann ich mich aber nicht in einem Dialog dafür registrieren?
Gruß Sven -
Hallo Sven,
Ja man muss fuer dieses Event registrieren, mehr Info findest Du hier http://msdn.microsoft.com/en-us/library/bb983718.aspx und auch hier findest Du Beispiel Code http://www.microsoft.com/en-us/download/details.aspx?id=5718 "ToolBarDateTimePicker Sample"
Gruss,
Ionut
Ionut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hi,
ich habe mir mal das Beispiel angesehen.
Dort registriert man sich in CMainFrame an das Event: ON_REGISTERED_MESSAGE(AFX_WM_RESETTOOLBAR, OnToolbarReset)
Ich muss mich aber in einem Dialog für das Event registrieren, da sich die Toolbar in einem Dialog befindet.
Dort allerdings (im Dialog) wird der Handler OnToolbarReset() niemals aufgerufen.
Weshalb kommt die Nachricht dort nicht an?!Gruß Sven
-
Hallo Sven,
Die letzte Sample :) http://msdn.microsoft.com/en-us/library/ccstww6w(VS.80).aspx
Gruss,
Ionut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
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)wParam) aufgerufen (pParent als CFrameWnd) so wie es in deinem Link beschrieben ist.
Um die ON_COMMAND-Nachrichten zu bekommen habe ich einfach die Methode SetRouteCommandsViaFrame(FALSE) der 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 wp, LPARAM 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
- Als Antwort vorgeschlagen Ionut DumaModerator Montag, 24. März 2014 10:30
- Als Antwort markiert Ionut DumaModerator Mittwoch, 26. März 2014 13:11