2009-08-17 8 views
2

In einem doc/view-Projekt mit VS2008 scheint eine MFCMenuBar die richtige MENU-Ressource (IDR_MAINFRAME) aus dem Projekt zu laden, da das Hinzufügen und Entfernen von Menüelementen in der Benutzeroberfläche des Menüs widergespiegelt wird. Es fügt sogar die Beschleuniger an die Standardmenüpunkte an (z. B. Strg + O an das Element Öffnen ...). Die Beschleunigungstabelle (IDR_MAINFRAME) scheint jedoch nicht mit dem Menü verbunden zu sein. Das Ändern von Strg + O für Öffnen ... zu etwas wie Strg + 7 funktioniert nicht. Die Strg + O-Taste wird immer noch an den Menüpunkt Öffnen ... angehängt, und Strg + O ruft immer noch den Open ... -Handler auf. Es gibt nur eine Beschleunigertabelle in der Ressourcendatei, daher habe ich keine Ahnung, wo die CMFCMenuBar ihre Beschleunigerinformationen erhält.Warum verwendet CMFCMenuBar die Beschleunigungstabelle nicht?

An diesem Punkt konnte ich die Beschleuniger arbeiten, indem ich manuell die IDR_MAINFRAME-Beschleuniger-Tabelle geladen und Nachrichten selbst übersetzt habe. Die CMFCMenuBar fügt jedoch weiterhin die Standardbeschleuniger hinzu.

Kann mir jemand erklären, was hier vor sich geht? Wie kann ich die MFCMenuBar zwingen, meine Accelerator-Tabelle zu verwenden und entweder die Accelerators nicht anzuhängen oder die richtigen Accelerators anzuhängen?

Antwort

6

Anscheinend sind einige CMFCMenuBar Einstellungen in der Registrierung beibehalten (HKCU denke ich.) Testen Sie Ihre Anwendung Registrierungseinstellungen Clearing und sehen, ob die richtigen Beschleuniger dargestellt sind.

Sehen Sie diese MSDN thread für einige verwandte CMFCMenuBar Fehlerbehebung.

+0

Ich hatte das gleiche Problem mit einem CDockablePane, das eine kürzlich aktualisierte Accelerator-Tabelle nicht verwendet. Durch das Löschen von HKCU \ Software \ \ wurde das Problem behoben. Ich denke, dass das gleiche für CMFCMenuBar helfen würde. –

+0

das ist ein bisschen wie ein Vorschlaghammer. Die obige Option mit ResetAll() ist besser. –

12

Nachdem ich gerade viel zu viel Zeit mit diesem Problem verbracht habe, dachte ich, ich würde die Lösung posten, die für mich funktioniert.

Ich nenne:

theApp.GetKeyboardManager()->ResetAll();

nach dem MDI Rahmen Sachen aus der Registrierung geladen ist (ich habe eine bestimmte Funktion erstellt genannt PostLoadFrame(), die ich sofort rufen nach Loadframe() aufgerufen wird, das ist wo die Registry zu lesen scheint).

Dieser Funktionsaufruf ignoriert alle Beschleuniger aus der Registrierung geladen (was gut für mich ist, weil ich die Anpassung von ihnen ohnehin nicht erlauben) und verwendet die Beschleuniger in Ihrer Ressource-Datei statt.

Wie gesagt, es scheint für mich in meiner Anwendung zu arbeiten. Wenn Sie die Anpassung der Zugriffstasten erlauben, dann sieht es aus wie ist es möglich, Ihre Ressource-Datei und die Registrierung zu fusionieren mit anderen Funktionen in CKeyboardManager gespeicherten Werten, aber es ist ein bisschen komplizierter.

Ich hoffe, dass hilft irgendwo jemand einen Teil der Zeit sparen ich verloren habe !!

Verwandte Themen