2009-03-01 8 views
4

Ich habe Anwendung läuft unter Windows mit MFC geschrieben. Der Status Aktivieren/Deaktivieren der Menüelemente hängt von vielen Bedingungen ab. Zum Beispiel muss ich den Menüeintrag aktivieren, wenn die Bedingung A erfüllt ist ODER wenn die Bedingung B erfüllt ist, aber sollte deaktiviert sein, wenn sowohl A als auch B gleichzeitig TRUE sind. Wie modellieren wir das im Code? Ich denke, ich sollte eine Art von Zustandsmaschine verwenden, aber meine Zustandsmaschine scheint zu viele Zustände zu enthalten. Wie ist der allgemeine Umgang mit solchen Problemen? Bitte beachten Sie, dass das Obige nur ein Beispiel war, es wird viele weitere Bedingungen geben. Auch die Option, das Menü immer aktiviert zu lassen und eine Fehlermeldung anzuzeigen, wenn der Benutzer es drückt, existiert nicht, da ich das Menü deaktivieren muss.Behandlung des UI-Status

Nur um zu klären, ich suche nicht, wie die Menüelemente in MFC zu deaktivieren, was ich suche, ist die beste Möglichkeit zu entscheiden, ob ein Menüelement aktiviert/deaktiviert werden soll, wenn viele voneinander abhängige Staaten sind beteiligt sein.

Antwort

0

Versuchen Sie, eine Methode zu schreiben, updateUIStatus(), die nach jeder UI-Aktion aufgerufen wird. Diese Methode würde den aktivierten oder deaktivierten Status des Menüelements (und jeder anderen UI-Komponente) basierend auf Ihren Bedingungen festlegen.

Die nette Sache über eine einzige Methode, die alle UI Statusaktualisierungen zu tun, ist, dass Sie alle diese Logik in einem Ort zu zentralisieren, anstatt auf mehrere Anrufe mit, sagen wir, if (condition A && condition B) menu.setEnabled(true);

+0

Nachteil wäre jedoch das Risiko einer großen Business-Logik-Methode :( – cwap

+0

Ich weiß, ich dachte auch, aber da es auf der UI-Seite ist, ist es nicht wirklich Business-Logik. Wenn es Business-Logik Entscheidungen in dort, dann sollten Anrufe zu anderen Klassen gemacht werden (dh "isOptionValid()" in irgendeiner Geschäftslogikklasse anrufen) –

+0

Punkt genommen - nicht wirklich Geschäftslogik, eher wie "ui Logik". – cwap

0

MFC verfügt über einen eingebauten in Mechanismus zum Aktivieren und Deaktivieren von Menüpunkten, in Form von Befehlsrouting und ON_UPDATE_COMMAND_UI Makro. Weitere Informationen finden Sie unter How to: Update User-Interface Objects und in der CCmdUI Klassendokumentation in MSDN.

Sie benötigen nicht unbedingt eine Zustandsmaschine. Bestimmen Sie für jeden Menübefehl, wo der Befehl behandelt werden soll, z. B. in Ihrem Dokument, Ihrer Ansicht oder Ihrer Hauptframe-Klasse, implementieren Sie dann einen OnUpdate Handler, und fügen Sie einen ON_UPDATE_COMMAND_UI Nachrichtenzuordnungseintrag für die entsprechende Klasse hinzu.

Als Beispiel, haben Sie die Antwort, die ich this question gab.

+0

ON_UPDATE_COMMAND_UI wird nur für Menüs und Symbolleisten behandelt, die relativ einfach sind. Das Hauptproblem ist das Aktivieren/Deaktivieren von Steuerelementen für den Dialog, die ON_UPDATE_COMMAND_UI nicht verarbeitet. – zar