DYNAMENU-Beispiel: Aktualisiert Menüs dynamisch
Aktualisiert: November 2007
Das DYNAMENU-Beispiel demonstriert das dynamische Ändern von Menüs und Statusleisten, unabhängig davon, ob die Behandlungsbefehle zur Kompilierzeit bekannt sind. DYNAMENU veranschaulicht die folgenden Funktionen:
Dynamisches Aktualisieren der Elemente in einem Menü.
Implementieren der ON_COMMAND- und ON_UPDATE_COMMAND_UI-Handler für Menübefehle, deren IDs zur Kompilierzeit unbekannt sind. Dieses Beispiel kann auch auf komplexere Fälle angewendet werden, beispielsweise auf konfigurierbare Menüs.
Aktualisieren der Eingabeaufforderung für Befehle in der Statusleiste, deren IDs zur Kompilierzeit unbekannt sind.
Sicherheitshinweis: |
---|
Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird. |
So rufen Sie Beispiele und Anweisungen für ihre Installation ab
Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.
Weitere Informationen finden Sie unter Suchen von Beispieldateien.
Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.
Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.
Erstellen und Ausführen des Beispiels
So erstellen Sie das DYNAMENU-Beispiel und führen es aus
Öffnen Sie die Projektmappe dynamenu.sln.
Klicken Sie im Menü Erstellen auf Erstellen.
Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.
DYNAMENU zeigt anfangs ein Fenster mit dem folgenden Text an: "This text is displayed in the current color". Sie können die Farbe des angezeigten Texts ändern, indem Sie eine der vier anfangs im Menü Color angebotenen Optionen auswählen: Black, Red, Purple oder Blue.
Um das Feature zur dynamischen Menüaktualisierung von DYNAMENU zu verwenden, klicken Sie im Menü Color auf Change Options, wodurch das Dialogfeld Change Color Options geöffnet wird. Über die Kontrollkästchen Black, Red, Purple und Blue können Sie festlegen, welche Farben im Menü Color dynamisch angeboten werden sollen. Wenn Sie beispielsweise die Kontrollkästchen Red und Purple deaktivieren, werden im Menü Color nur die Optionen Black und Blue angeboten.
Beachten Sie, wie in der Statusleiste beispielsweise der Text "Set current color text to Black" angezeigt wird, wenn sich der Fokus im Menü Color auf der Option Black befindet.
Dynamisches Aktualisieren der Elemente in einem Menü
Die CDynaMDIChildWnd-Klasse in der Datei Mdichild.cpp implementiert das dynamische Aktualisieren von Elementen im Menü Color. Wenn die Liste der verfügbaren Farben aktualisiert oder das untergeordnete MDI-Fenster aktiviert wird, ruft die CDynaMDIChildWnd::RefreshColorMenu-Funktion CMenu::DeleteMenu auf, um alle Farbelemente aus dem Menü zu löschen. Anschließend werden dem Menü unter Verwendung von CMenu::AppendMenu die gegenwärtig verfügbaren Farben hinzugefügt.
Implementieren von Befehlshandlern für dynamische Menüelemente
DYNAMENU könnte durch das Reservieren einer feststehenden Liste von Befehls-IDs für die Farben ID_COLOR_BLACK, ID_COLOR_RED usw. implementiert werden. In diesem Fall könnten die Handler ON_COMMAND und ON_UPDATE_COMMAND_UI wie üblich für die Farbbefehle implementiert werden. Dies wäre der direkteste Ansatz zum Implementieren von DYNAMENU.
Allerdings verwendet DYNAMENU zur besseren Veranschaulichung keine feststehenden Befehls-IDs. Stattdessen werden die Befehls-IDs, die unbekannt oder mit den Menüelementen verknüpft sind, von DYNAMENU dynamisch zur Kompilierzeit hinzugefügt. Dieses Beispiel kann auch auf komplexere Fälle angewendet werden, beispielsweise auf konfigurierbare Menüs.
In der Dokumentüberschreibung von CCmdTarget::OnCmdMsg ist das Äquivalent zur Behandlung der Meldungszuordnung für ON_COMMAND und ON_UPDATE_COMMAND implementiert. Wenn die OnCmdMsg-Funktion mit einem NULL-Zeiger für den AFX_CMDHANDLERINFO*-Parameter aufgerufen wird, bedeutet dies, dass für den Befehl kein Eintrag in der Meldungszuordnung gefunden wurde. In diesem Fall wird durch die Überschreibung von OnCmdMsg überprüft, ob es sich bei der Befehls-ID, die als erster Parameter übergeben wurde, um eine der dynamisch zugewiesenen Befehls-IDs für die Elemente im Farbmenü handelt. Wenn dies der Fall ist, wird durch die Überschreibung entweder ein Befehlshandler (DoSelectColor) oder ein Befehlshandler der Benutzeroberfläche (DoUpdateSelectColor) aufgerufen. Der Aufruf richtet sich danach, ob es sich bei dem zweiten an OnCmdMsg übergebenen Parameter um den in MFC definierten CN_COMMAND oder CN_UPDATE_COMMAND_UI handelt.
Aktualisieren der Eingabeaufforderung für dynamische Menüelemente in der Statusleiste
In DYNAMENU fungiert das untergeordnete MDI-Fenster (CDynaMDIChildWnd) als Besitzer der Statusleiste. Die Standardimplementierung von CFrameWnd::GetMessageString verwendet die aktuell angezeigte Befehls-ID (für das Menüelement, das gerade den Fokus besitzt), um die entsprechende Zeichenfolgenressource für den Befehl abzurufen und im ersten Bereich der Statusleiste anzuzeigen. DYNAMENU überschreibt GetMessageString, um eine Eingabeaufforderung für die dynamisch definierten Befehle anzuzeigen.
Schlüsselwörter
Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:
AfxFormatString1; AfxGetMainWnd; CCmdTarget::OnCmdMsg; CDialog::DoModal; CDialog::OnInitDialog; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::OnNewDocument; CDocument::UpdateAllViews; CFrameWnd::Create; CFrameWnd::GetActiveDocument; CFrameWnd::GetMessageString; CFrameWnd::LoadFrame; CMenu::AppendMenu; CMenu::DeleteMenu; CMenu::GetMenuItemCount; CMenu::GetMenuItemID; CMenu::GetSubMenu; CObject::AssertValid; CObject::Dump; CObject::Serialize; CString::LoadString; CView::DoPreparePrinting; CView::GetDocument; CView::OnBeginPrinting; CView::OnDraw; CView::OnEndPrinting; CView::OnPreparePrinting; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWnd::CenterWindow; CWnd::DoDataExchange; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetMenu; CWnd::GetParentFrame; CWnd::OnCreate; CWnd::SetWindowText; CWnd::ShowWindow; CWnd::UpdateWindow; DragAcceptFiles; DrawText; LoadBitmap; RGB; SetBkMode; SetTextColor
Hinweis: |
---|
In diesem und einigen anderen Beispielen wurden die Änderungen an den Visual C++-Assistenten, -Bibliotheken und -Compilern noch nicht nachvollzogen. Sie demonstrieren aber dennoch, wie Sie die gewünschte Aufgabe durchführen können. |