TN022: Implementieren von Standardbefehlen
Hinweis
Der folgende technische Hinweis wurde seit dem ersten Erscheinen in der Onlinedokumentation nicht aktualisiert. Daher können einige Verfahren und Themen veraltet oder falsch sein. Um aktuelle Informationen zu erhalten, wird empfohlen, das gewünschte Thema im Index der Onlinedokumentation zu suchen.
In diesem Hinweis werden die von MFC 2.0 bereitgestellten Standardbefehlsimplementierungen beschrieben. Lesen Sie zuerst den technischen Hinweis 21 , da sie die Mechanismen beschreibt, mit denen viele der Standardbefehle implementiert werden.
In dieser Beschreibung wird davon ausgegangen, dass sie kenntnisse der MFC-Architekturen, APIs und gängigen Programmierpraxis kennen. Dokumentierte und nicht dokumentierte "nur Implementierung"-APIs werden beschrieben. Dies ist kein Ort, um mit dem Erlernen der Features oder der Programmierung in MFC zu beginnen. Weitere allgemeine Informationen und Details zu dokumentierten APIs finden Sie unter Visual C++.
Problemstellung
MFC definiert viele Standardbefehls-IDs in der Headerdatei AFXRES.H. Die Frameworkunterstützung für diese Befehle variiert. Wenn Sie wissen, wo und wie die Frameworkklassen diese Befehle behandeln, zeigen Sie nicht nur, wie das Framework intern funktioniert, sondern bietet nützliche Informationen zum Anpassen der Standardimplementierungen und vermittelt Ihnen einige Techniken für die Implementierung eigener Befehlshandler.
Inhalt dieses technischen Hinweises
Jede Befehls-ID wird in zwei Abschnitten beschrieben:
Der Titel: der symbolische Name der Befehls-ID (z. B. ID_FILE_SAVE) gefolgt vom Zweck des Befehls (z. B. "speichert das aktuelle Dokument") getrennt durch einen Doppelpunkt.
Mindestens ein Absatz, der beschreibt, welche Klassen den Befehl implementieren und was die Standardimplementierung bewirkt
Die meisten Standardbefehlsimplementierungen sind in der Basisklassen-Nachrichtenzuordnung des Frameworks verankert. Es gibt einige Befehlsimplementierungen, die eine explizite Verkabelung in Ihrer abgeleiteten Klasse erfordern. Diese werden unter "Hinweis" beschrieben. Wenn Sie die richtigen Optionen in AppWizard ausgewählt haben, werden diese Standardhandler für Sie in der generierten Skelettanwendung verbunden.
Benennungskonvention
Standardbefehle folgen einer einfachen Benennungskonvention, die Sie nach Möglichkeit verwenden sollten. Die meisten Standardbefehle befinden sich an Standardplätzen in der Menüleiste einer Anwendung. Der symbolische Name des Befehls beginnt mit "ID_" gefolgt vom Standardmäßigen Popupmenünamen, gefolgt vom Namen des Menüelements. Der symbolische Name befindet sich in Großbuchstaben mit Unterstrich-Wortumbrüchen. Bei Befehlen ohne Standardmenüelementnamen wird ein logischer Befehlsname beginnend mit "ID_" definiert (z. B. ID_NEXT_PANE).
Wir verwenden das Präfix "ID_", um Befehle anzugeben, die an Menüelemente, Symbolleistenschaltflächen oder andere Benutzeroberflächenobjekte gebunden sind. Befehlshandler, die "ID_"-Befehle behandeln, sollten die ON_COMMAND und ON_UPDATE_COMMAND_UI Mechanismen der MFC-Befehlsarchitektur verwenden.
Es wird empfohlen, das Standardpräfix "IDM_" für Menüelemente zu verwenden, die nicht der Befehlsarchitektur folgen und menüspezifischen Code benötigen, um sie zu aktivieren und zu deaktivieren. Natürlich sollte die Anzahl der menüspezifischen Befehle klein sein, da die MFC-Befehlsarchitektur nicht nur Befehlshandler leistungsstärker macht (da sie mit Symbolleisten arbeiten), sondern der Befehlshandlercode wiederverwendbar macht.
ID-Bereiche
Weitere Informationen zur Verwendung von ID-Bereichen in MFC finden Sie im Technischen Hinweis 20 .
MFC-Standardbefehle fallen in den Bereich 0xE000 auf 0xEFFF. Verlassen Sie sich nicht auf die spezifischen Werte dieser IDs, da sie in zukünftigen Versionen der Bibliothek geändert werden können.
Ihre Anwendung sollte ihre Befehle im Bereich definieren, 0x8000 sie 0xDFFF.
Standardbefehls-IDs
Für jede Befehls-ID gibt es eine standardmäßige Meldungszeilen-Eingabeaufforderungszeichenfolge, die in der Datei PROMPTS zu finden ist. RC. Die Zeichenfolgen-ID für diese Menüaufforderung muss mit der Befehls-ID übereinstimmen.
ID_FILE_NEW Erstellt ein neues/leeres Dokument.
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CWinApp
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.CWinApp::OnFileNew
implementiert diesen Befehl je nach Anzahl der Dokumentvorlagen in der Anwendung unterschiedlich. Wenn nur einCDocTemplate
Dokument vorhanden ist,CWinApp::OnFileNew
wird ein neues Dokument dieses Typs sowie die richtige Frame- und Ansichtsklasse erstellt.Wenn mehrere vorhanden sind
CDocTemplate
, fordert der Benutzer mit einem Dialogfeld (AFX_IDD_NEWTYPEDLG) auf,CWinApp::OnFileNew
in dem er auswählen kann, welcher Dokumenttyp verwendet werden soll. Das ausgewählteCDocTemplate
Objekt wird verwendet, um das Dokument zu erstellen.Eine allgemeine Anpassung von ID_FILE_NEW besteht darin, eine andere und grafischere Auswahl von Dokumenttypen bereitzustellen. In diesem Fall können Sie ihre eigene
CMyApp::OnFileNew
implementieren und sie in Ihrer Nachrichtenkarte stattCWinApp::OnFileNew
in der Nachrichtenkarte platzieren. Es ist nicht erforderlich, die Basisklassenimplementierung aufzurufen.Eine weitere allgemeine Anpassung von ID_FILE_NEW besteht darin, einen separaten Befehl zum Erstellen eines Dokuments jedes Typs bereitzustellen. In diesem Fall sollten Sie neue Befehls-IDs definieren, z. B. ID_FILE_NEW_CHART und ID_FILE_NEW_SHEET.
ID_FILE_OPEN Öffnet ein vorhandenes Dokument.
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CWinApp
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.CWinApp::OnFileOpen
verfügt über eine sehr einfache Implementierung des AufrufensCWinApp::DoPromptFileName
gefolgt vonCWinApp::OpenDocumentFile
der Datei oder dem Pfadnamen der zu öffnenden Datei. DieCWinApp
ImplementierungsroutineDoPromptFileName
führt das Standardmäßige Dialogfeld "FileOpen" ein und füllt es mit den Dateierweiterungen aus, die aus den aktuellen Dokumentvorlagen abgerufen wurden.Eine häufige Anpassung von ID_FILE_OPEN besteht darin, das Dialogfeld "FileOpen" anzupassen oder zusätzliche Dateifilter hinzuzufügen. Die empfohlene Möglichkeit zum Anpassen besteht darin, die Standardimplementierung durch Ihr eigenes FileOpen-Dialogfeld zu ersetzen und mit dem Namen der Datei oder des Pfads des Dokuments aufzurufen
CWinApp::OpenDocumentFile
. Es ist nicht erforderlich, die Basisklasse aufzurufen.ID_FILE_CLOSE schließt das aktuell geöffnete Dokument.
CDocument::OnFileClose
AufrufeCDocument::SaveModified
, um den Benutzer aufzufordern, das Dokument zu speichern, wenn es geändert wurde, und ruft dann aufOnCloseDocument
. Die gesamte schließende Logik, einschließlich der Zerstörung des Dokuments, erfolgt in derOnCloseDocument
Routine.Hinweis
ID_FILE_CLOSE verhält sich anders als eine WM_CLOSE Nachricht oder ein SC_CLOSE Systembefehl, der an das Dokumentrahmenfenster gesendet wird. Durch das Schließen eines Fensters wird das Dokument nur geschlossen, wenn es sich um das letzte Rahmenfenster handelt, in dem das Dokument angezeigt wird. Wenn Sie das Dokument mit ID_FILE_CLOSE schließen, wird das Dokument nicht nur geschlossen, sondern alle Rahmenfenster geschlossen, in denen das Dokument angezeigt wird.
ID_FILE_SAVE Speichert das aktuelle Dokument.
Die Implementierung verwendet eine Hilfsroutine
CDocument::DoSave
, die sowohl für als auchOnFileSaveAs
OnFileSave
für . Wenn Sie ein Dokument speichern, das noch nicht gespeichert wurde (d. h., es hat keinen Pfadnamen, wie im Fall von FileNew), oder das aus einem schreibgeschützten Dokument gelesen wurde, fungiert dieOnFileSave
Logik wie der befehl ID_FILE_SAVE_AS und fordert den Benutzer auf, einen neuen Dateinamen anzugeben. Der eigentliche Prozess zum Öffnen der Datei und zum Ausführen der Speicherung erfolgt über die virtuelle FunktionOnSaveDocument
.Es gibt zwei häufige Gründe, ID_FILE_SAVE anzupassen. Entfernen Sie für Dokumente, die nicht gespeichert werden, einfach die ID_FILE_SAVE Menüelemente und Symbolleistenschaltflächen von der Benutzeroberfläche. Stellen Sie außerdem sicher, dass Sie Ihr Dokument niemals modifiziert (d. h. nie aufrufen
CDocument::SetModifiedFlag
), und das Framework bewirkt nie, dass das Dokument gespeichert wird. Definieren Sie für Dokumente, die an einem anderen Speicherort als einer Datenträgerdatei gespeichert werden, einen neuen Befehl für diesen Vorgang.Bei einem
COleServerDoc
, ID_FILE_SAVE wird sowohl für die Dateispeicherung (für normale Dokumente) als auch für die Dateiaktualisierung (für eingebettete Dokumente) verwendet.Wenn Ihre Dokumentdaten in einzelnen Datenträgerdateien gespeichert werden, sie aber nicht die standardmäßige
CDocument
Serialisierungsimplementierung verwenden möchten, sollten Sie anstelleCDocument::OnSaveDocument
vonOnFileSave
.ID_FILE_SAVE_AS Speichert das aktuelle Dokument unter einem anderen Dateinamen.
Die
CDocument::OnFileSaveAs
Implementierung verwendet dieselbeCDocument::DoSave
Hilfsroutine wieOnFileSave
. DerOnFileSaveAs
Befehl wird genauso wie ID_FILE_SAVE behandelt, wenn die Dokumente vor dem Speichern keinen Dateinamen hatten.COleServerDoc::OnFileSaveAs
implementiert die Logik zum Speichern einer normalen Dokumentdatendatei oder zum Speichern eines Serverdokuments, das ein in eine andere Anwendung eingebettetes OLE-Objekt als separate Datei darstellt.Wenn Sie die Logik von ID_FILE_SAVE anpassen, möchten Sie wahrscheinlich ID_FILE_SAVE_AS auf ähnliche Weise anpassen, oder der Vorgang von "Speichern unter" gilt möglicherweise nicht für Ihr Dokument. Sie können das Menüelement aus der Menüleiste entfernen, wenn es nicht benötigt wird.
ID_FILE_SAVE_COPY_AS Speichert ein aktuelles Dokument unter einem neuen Namen.
Die
COleServerDoc::OnFileSaveCopyAs
Implementierung ist sehr ähnlich wieCDocument::OnFileSaveAs
, mit der Ausnahme, dass das Dokumentobjekt nach dem Speichern nicht an die zugrunde liegende Datei angefügt ist. Das heißt, wenn das Speicherdokument vor dem Speichern "geändert" wurde, wird es weiterhin "geändert". Darüber hinaus hat dieser Befehl keine Auswirkungen auf den Im Dokument gespeicherten Pfadnamen oder Titel.ID_FILE_UPDATE benachrichtigt den Container, ein eingebettetes Dokument zu speichern.
Die
COleServerDoc::OnUpdateDocument
Implementierung benachrichtigt einfach den Container, dass die Einbettung gespeichert werden soll. Anschließend ruft der Container die entsprechenden OLE-APIs auf, um das eingebettete Objekt zu speichern.ID_FILE_PAGE_SETUP Ruft ein anwendungsspezifisches Seiteneinrichtungs-/Layoutdialogfeld auf.
Derzeit gibt es keinen Standard für dieses Dialogfeld, und das Framework hat keine Standardimplementierung dieses Befehls.
Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_FILE_PRINT_SETUP Das Standarddialogfeld "Drucken einrichten" aufrufen.
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CWinApp
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.Mit diesem Befehl wird das Standardmäßige Druckeinrichtungsdialogfeld aufgerufen, in dem der Benutzer die Drucker- und Druckeinstellungen für mindestens dieses Dokument oder die meisten Dokumente in dieser Anwendung anpassen kann. Sie müssen die Systemsteuerung verwenden, um die Standarddruckereinstellungen für das gesamte System zu ändern.
CWinApp::OnFilePrintSetup
verfügt über eine sehr einfache Implementierung, die einCPrintDialog
Objekt erstellt und die ImplementierungsfunktionCWinApp::DoPrintDialog
aufruft. Dadurch wird die Standarddruckereinrichtung der Anwendung festgelegt.Die allgemeine Notwendigkeit zum Anpassen dieses Befehls besteht darin, Druckereinstellungen pro Dokument zuzulassen, die beim Speichern mit dem Dokument gespeichert werden sollen. Dazu sollten Sie in Ihrer
CDocument
Klasse einen Nachrichtenzuordnungshandler hinzufügen, der einCPrintDialog
Objekt erstellt, es mit den entsprechenden Druckerattributen initialisiert (in der Regel hDevMode und hDevNames), dieCPrintDialog::DoModal
geänderten Druckereinstellungen aufrufen und speichern. Bei einer robusten Implementierung sollten Sie sich die Implementierung zur Erkennung vonCWinApp::DoPrintDialog
Fehlern undCWinApp::UpdatePrinterSelection
zum Umgang mit sinnvollen Standardeinstellungen und zum Nachverfolgen systemweiter Druckeränderungen ansehen.ID_FILE_PRINT Standarddruck des aktuellen Dokuments
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CView
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.Mit diesem Befehl wird das aktuelle Dokument oder richtiger gedruckt, der Druckvorgang gestartet. Dazu gehört das Aufrufen des Standarddruckdialogfelds und das Ausführen des Druckmoduls.
CView::OnFilePrint
implementiert diesen Befehl und die Standard Druckschleife. Er ruft die virtuelleCView::OnPreparePrinting
Aufforderung des Benutzers mit dem Druckdialogfeld auf. Anschließend wird die Ausgabe DC vorbereitet, um zum Drucker zu wechseln, das Dialogfeld "Druckfortschritt" (AFX_IDD_PRINTDLG) angezeigt und dasStartDoc
Escapezeichen an den Drucker gesendet.CView::OnFilePrint
enthält auch die Standard seitenorientierte Druckschleife. Für jede Seite wird die virtuelleCView::OnPrepareDC
Seite aufgerufen, gefolgt von einemStartPage
Escapezeichen und dem Aufrufen der virtuellenCView::OnPrint
Seite. Nach Abschluss des Vorgangs wird die virtuelleCView::OnEndPrinting
Datei aufgerufen, und das Dialogfeld "Druckfortschritt" wird geschlossen.Die MFC-Druckarchitektur wurde so konzipiert, dass sie auf viele verschiedene Arten zum Drucken und Drucken der Seitenansicht eingebunden werden kann. Normalerweise finden Sie die verschiedenen
CView
überschreibbaren Funktionen, die für alle seitenorientierten Druckaufgaben geeignet sind. Nur im Fall einer Anwendung, die den Drucker für die nicht seitenorientierte Ausgabe verwendet, sollten Sie feststellen, dass die ID_FILE_PRINT Implementierung ersetzt werden muss.ID_FILE_PRINT_PREVIEW Geben Sie den Druckvorschaumodus für das aktuelle Dokument ein.
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CView
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.CView::OnFilePrintPreview
startet den Druckvorschaumodus, indem die dokumentierte HilfsfunktionCView::DoPrintPreview
aufgerufen wird.CView::DoPrintPreview
ist die Standard Engine für die Druckvorschauschleife, genau wieOnFilePrint
die Standard Engine für die Druckschleife.Der Druckvorschauvorgang kann auf unterschiedliche Weise angepasst werden, indem verschiedene Parameter übergeben werden
DoPrintPreview
. Bitte lesen Sie den technischen Hinweis 30, in dem einige Details der Seitenansicht und deren Anpassung erläutert werden.ID_FILE_MRU_FILE1... FILE16 Ein Bereich von Befehls-IDs für die Datei-MRU-Liste.
CWinApp::OnUpdateRecentFileMenu
ist ein Updatebefehls-UI-Handler, der einer der erweiterten Verwendungsmöglichkeiten des ON_UPDATE_COMMAND_UI Mechanismus ist. In Ihrer Menüressource müssen Sie nur ein einzelnes Menüelement mit id ID_FILE_MRU_FILE1 definieren. Dieses Menüelement wurde zunächst wieder deaktiviert Standard.Wenn die MRU-Liste wächst, werden der Liste weitere Menüelemente hinzugefügt. Die Standardimplementierung
CWinApp
ist standardmäßig auf den Standardgrenzwert der vier zuletzt verwendeten Dateien festgelegt. Sie können die Standardeinstellung ändern, indem Sie einen größeren oder kleineren Wert aufrufenCWinApp::LoadStdProfileSettings
. Die MRU-Liste wird in der Anwendung gespeichert. INI-Datei. Die Liste wird in die Funktion Ihrer Anwendung geladen, wenn Sie die AnwendungInitInstance
aufrufenLoadStdProfileSettings
und beim Beenden der Anwendung gespeichert werden. Der MRU-Aktualisierungsbefehls-UI-Handler konvertiert auch absolute Pfade in relative Pfade für die Anzeige im Dateimenü.CWinApp::OnOpenRecentFile
ist der ON_COMMAND-Handler, der den tatsächlichen Befehl ausführt. Er ruft einfach den Dateinamen aus der MRU-Liste ab und ruft aufCWinApp::OpenDocumentFile
, was alles tut, um die Datei zu öffnen und die MRU-Liste zu aktualisieren.Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_EDIT_CLEAR Löscht die aktuelle Auswahl
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls mithilfeCEdit::Clear
von . Der Befehl ist deaktiviert, wenn keine aktuelle Auswahl vorhanden ist.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_CLEAR_ALL Löscht das gesamte Dokument.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden. Eine Beispielimplementierung finden Sie im MFC-Lernprogramm SCRIBBLE .
ID_EDIT_COPY Kopiert die aktuelle Auswahl in die Zwischenablage.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls bereit, mit dem der aktuell markierte Text als CF_TEXT inCEdit::Copy
die Zwischenablage kopiert wird. Der Befehl ist deaktiviert, wenn keine aktuelle Auswahl vorhanden ist.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_CUT Schneidet die aktuelle Auswahl in die Zwischenablage.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls bereit, der den aktuell ausgewählten Text als CF_TEXT verwendetCEdit::Cut
in die Zwischenablage ausschneidet. Der Befehl ist deaktiviert, wenn keine aktuelle Auswahl vorhanden ist.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_FIND Startet den Suchvorgang, öffnet das Dialogfeld "Moduslose Suche".
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls bereit, die die ImplementierungshilfsfunktionOnEditFindReplace
aufruft, um die vorherigen Such-/Ersetzungseinstellungen in privaten Implementierungsvariablen zu verwenden und zu speichern. DieCFindReplaceDialog
Klasse wird verwendet, um das Dialogfeld ohne Modus zum Anfordern des Benutzers zu verwalten.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_PASTE Fügt den aktuellen Inhalt der Zwischenablage ein.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls bereit, der die aktuellen Zwischenablagedaten kopiert, die den markierten Text durch ersetzenCEdit::Paste
. Der Befehl ist deaktiviert, wenn in der Zwischenablage keine CF_TEXT vorhanden ist.COleClientDoc
stellt lediglich einen Updatebefehls-UI-Handler für diesen Befehl bereit. Wenn die Zwischenablage kein einbettbares OLE-Element/-Objekt enthält, wird der Befehl deaktiviert. Sie sind für das Schreiben des Handlers für den tatsächlichen Befehl verantwortlich, um das eigentliche Einfügen auszuführen. Wenn Ihre OLE-Anwendung auch andere Formate einfügen kann, sollten Sie ihren eigenen Aktualisierungsbefehls-UI-Handler in Der Ansicht oder im Dokument bereitstellen (d. a. irgendwo vorCOleClientDoc
dem Routing des Befehlsziels).Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
Verwenden Sie
COleClientItem::CanPaste
zum Ersetzen der standardmäßigen OLE-Implementierung .ID_EDIT_PASTE_LINK Fügt einen Link aus dem aktuellen Inhalt der Zwischenablage ein.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.COleDocument
stellt lediglich einen Updatebefehls-UI-Handler für diesen Befehl bereit. Wenn die Zwischenablage kein verknüpftes OLE-Element/-Objekt enthält, wird der Befehl deaktiviert. Sie sind für das Schreiben des Handlers für den tatsächlichen Befehl verantwortlich, um das eigentliche Einfügen auszuführen. Wenn Ihre OLE-Anwendung auch andere Formate einfügen kann, sollten Sie ihren eigenen Aktualisierungsbefehls-UI-Handler in Der Ansicht oder im Dokument bereitstellen (d. a. irgendwo vorCOleDocument
dem Routing des Befehlsziels).Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
Verwenden Sie
COleClientItem::CanPasteLink
zum Ersetzen der standardmäßigen OLE-Implementierung .ID_EDIT_PASTE_SPECIAL Fügt den aktuellen Inhalt der Zwischenablage mit Optionen ein.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren. MFC stellt dieses Dialogfeld nicht bereit.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_REPEAT Wiederholt den letzten Vorgang.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls bereit, um den letzten Suchvorgang zu wiederholen. Die privaten Implementierungsvariablen für die letzte Suche werden verwendet. Der Befehl ist deaktiviert, wenn keine Suche versucht werden kann.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_REPLACE Beginnt mit dem Ersetzungsvorgang, wird das Dialogfeld "Modusloses Ersetzen" angezeigt.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls bereit, die die ImplementierungshilfsfunktionOnEditFindReplace
aufruft, um die vorherigen Such-/Ersetzungseinstellungen in privaten Implementierungsvariablen zu verwenden und zu speichern. DieCFindReplaceDialog
Klasse wird verwendet, um das Dialogfeld ohne Modus zu verwalten, das den Benutzer auffordert.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_SELECT_ALL Wählt das gesamte Dokument aus.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls bereit, der den gesamten Text im Dokument auswählt. Der Befehl ist deaktiviert, wenn kein Text zum Auswählen vorhanden ist.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_UNDO Rückgängigmachen des letzten Vorgangs.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.CEditView
stellt eine Implementierung dieses Befehls mithilfeCEdit::Undo
von . Der Befehl ist deaktiviert, wennCEdit::CanUndo
FALSE zurückgegeben wird.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_EDIT_REDO wiederholt den letzten Vorgang.
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für jede
CView
abgeleitete Klasse implementieren.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_WINDOW_NEW Öffnet ein weiteres Fenster im aktiven Dokument.
CMDIFrameWnd::OnWindowNew
implementiert dieses leistungsstarke Feature mithilfe der Dokumentvorlage des aktuellen Dokuments, um einen anderen Frame zu erstellen, der eine andere Ansicht des aktuellen Dokuments enthält.Wie bei den meisten MDI-Menübefehlen (Multiple Document Interface, MDI) ist der Befehl deaktiviert, wenn kein aktives untergeordnetes MDI-Fenster vorhanden ist.
Die Anpassung dieses Befehlshandlers wird nicht empfohlen. Wenn Sie einen Befehl bereitstellen möchten, der zusätzliche Ansichten oder Rahmenfenster erstellt, ist es wahrscheinlich besser, Ihren eigenen Befehl zu erfinden. Sie können den Code klonen
CMDIFrameWnd::OnWindowNew
und in den spezifischen Frame- und Ansichtsklassen Ihrer Vorliebe ändern.ID_WINDOW_ARRANGE Ordnet Symbole am unteren Rand eines MDI-Fensters an.
CMDIFrameWnd
implementiert diesen Standard-MDI-Befehl in einer ImplementierungshilfsfunktionOnMDIWindowCmd
. Dieser Hilfsprogramm ordnet Befehls-IDs MDI-Windows-Nachrichten zu und kann daher viele Code freigeben.Wie die meisten MDI-Fenstermenübefehle ist der Befehl deaktiviert, wenn kein aktives untergeordnetes MDI-Fenster vorhanden ist.
Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_WINDOW_CASCADE Kaskadenfenster überlappen.
CMDIFrameWnd
implementiert diesen Standard-MDI-Befehl in einer ImplementierungshilfsfunktionOnMDIWindowCmd
. Dieser Hilfsprogramm ordnet Befehls-IDs MDI-Windows-Nachrichten zu und kann daher viele Code freigeben.Wie die meisten MDI-Fenstermenübefehle ist der Befehl deaktiviert, wenn kein aktives untergeordnetes MDI-Fenster vorhanden ist.
Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_WINDOW_TILE_HORZ Kachelfenster horizontal.
Dieser Befehl wird wie ID_WINDOW_CASCADE implementiert
CMDIFrameWnd
, mit Ausnahme einer anderen MDI Windows-Nachricht, die für den Vorgang verwendet wird.Sie sollten die Standardkachelausrichtung für Ihre Anwendung auswählen. Dazu können Sie die ID für das Menüelement "Kachel" des Fensters in ID_WINDOW_TILE_HORZ oder ID_WINDOW_TILE_VERT ändern.
ID_WINDOW_TILE_VERT Fenster "Kacheln" vertikal aus.
Dieser Befehl wird wie ID_WINDOW_CASCADE implementiert
CMDIFrameWnd
, mit Ausnahme einer anderen MDI Windows-Nachricht, die für den Vorgang verwendet wird.Sie sollten die Standardkachelausrichtung für Ihre Anwendung auswählen. Dazu können Sie die ID für das Menüelement "Kachel" des Fensters in ID_WINDOW_TILE_HORZ oder ID_WINDOW_TILE_VERT ändern.
ID_WINDOW_SPLIT Tastaturschnittstelle zum Teilen.
CView
behandelt diesen Befehl für dieCSplitterWnd
Implementierung. Wenn die Ansicht Teil eines Splitterfensters ist, wird dieser Befehl an die ImplementierungsfunktionCSplitterWnd::DoKeyboardSplit
delegiert. Dadurch wird der Splitter in einem Modus platziert, in dem Tastaturbenutzer ein Splitterfenster teilen oder aufheben können.Dieser Befehl ist deaktiviert, wenn sich die Ansicht nicht in einem Teiler befindet.
Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_APP_ABOUT Ruft das Dialogfeld "Info" auf.
Es gibt keine Standardimplementierung für das Feld "Info" einer Anwendung. Die von AppWizard erstellte Standardanwendung erstellt eine benutzerdefinierte Dialogklasse für Ihre Anwendung und verwendet sie als Infofeld. AppWizard schreibt auch den trivialen Befehlshandler, der diesen Befehl behandelt und das Dialogfeld aufruft.
Sie werden diesen Befehl fast immer implementieren.
ID_APP_EXIT beenden Sie die Anwendung.
CWinApp::OnAppExit
behandelt diesen Befehl, indem eine WM_CLOSE Nachricht an das Standard Fenster der Anwendung gesendet wird. Das Standardmäßige Herunterfahren der Anwendung (Aufforderung für modifiziert Dateien usw.) wird von derCFrameWnd
Implementierung behandelt.Die Anpassung dieses Befehlshandlers wird nicht empfohlen. Überschreiben oder schließende
CWinApp::SaveAllModified
CFrameWnd
Logik wird empfohlen.Wenn Sie diesen Befehl implementieren, empfehlen wir, diese Befehls-ID zu verwenden.
ID_HELP_INDEX Listet Hilfethemen aus . HLP-Datei.
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CWinApp
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.CWinApp::OnHelpIndex
behandelt diesen Befehl durch einfaches AufrufenCWinApp::WinHelp
.Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_HELP_USING Zeigt Hilfe zur Verwendung der Hilfe an.
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CWinApp
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.CWinApp::OnHelpUsing
behandelt diesen Befehl durch einfaches AufrufenCWinApp::WinHelp
.Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_CONTEXT_HELP Wechselt in den Hilfemodus UMSCHALT-F1 ein.
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CWinApp
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.CWinApp::OnContextHelp
behandelt diesen Befehl, indem sie den Hilfemoduscursor festlegen, eine modale Schleife eingeben und darauf warten, dass der Benutzer ein Fenster auswählt, um Hilfe zu erhalten. Weitere Informationen zur MFC-Hilfeimplementierung finden Sie in technischem Hinweis 28 .Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_HELP Gibt Hilfe zum aktuellen Kontext
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CWinApp
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.CWinApp::OnHelp
behandelt diesen Befehl, indem der richtige Hilfekontext für den aktuellen Anwendungskontext angezeigt wird. Dadurch werden einfache F1-Hilfe, Hilfe zu Meldungsfeldern usw. behandelt. Weitere Informationen zur MFC-Hilfeimplementierung finden Sie im Technischen Hinweis 28 .Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_DEFAULT_HELP Zeigt die Standardhilfe für Kontext an.
Hinweis
Sie müssen dies mit der Nachrichtenzuordnung Ihrer
CWinApp
abgeleiteten Klasse verbinden, um diese Funktionalität zu aktivieren.Dieser Befehl ist in der Regel zugeordnet
CWinApp::OnHelpIndex
.Ein anderer Befehlshandler kann bereitgestellt werden, wenn eine Unterscheidung zwischen der Standardhilfe und dem Hilfeindex gewünscht wird.
ID_NEXT_PANE Wechsel zum nächsten Bereich
CView
behandelt diesen Befehl für dieCSplitterWnd
Implementierung. Wenn die Ansicht Teil eines Splitterfensters ist, wird dieser Befehl an die ImplementierungsfunktionCSplitterWnd::OnNextPaneCmd
delegiert. Dadurch wird die aktive Ansicht in den nächsten Bereich im Teiler verschoben.Dieser Befehl ist deaktiviert, wenn sich die Ansicht nicht in einem Teiler befindet oder kein nächster Bereich angezeigt wird.
Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_PREV_PANE Wechsel zum vorherigen Bereich
CView
behandelt diesen Befehl für dieCSplitterWnd
Implementierung. Wenn die Ansicht Teil eines Splitterfensters ist, wird dieser Befehl an die ImplementierungsfunktionCSplitterWnd::OnNextPaneCmd
delegiert. Dadurch wird die aktive Ansicht in den vorherigen Bereich im Teiler verschoben.Dieser Befehl ist deaktiviert, wenn sich die Ansicht nicht in einem Teiler befindet oder es keinen vorherigen Bereich gibt, zu dem gewechselt werden soll.
Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_OLE_INSERT_NEW Fügt ein neues OLE-Objekt ein
Derzeit gibt es keine Standardimplementierung für diesen Befehl. Sie müssen dies für die
CView
abgeleitete Klasse implementieren, um ein neues OLE-Element/-Objekt an der aktuellen Auswahl einzufügen.Alle OLE-Clientanwendungen sollten diesen Befehl implementieren. AppWizard erstellt mit der OLE-Option eine Skelettimplementierung
OnInsertObject
in Ihrer Ansichtsklasse, die Sie abschließen müssen.Eine vollständige Implementierung dieses Befehls finden Sie im Beispiel für das MFC OLE-Beispiel für OCLIENT .
ID_OLE_EDIT_LINKS OLE-Verknüpfungen bearbeiten
COleDocument
behandelt diesen Befehl mithilfe der von MFC bereitgestellten Implementierung des Standardmäßigen OLE-Verknüpfungsdialogfelds. Auf die Implementierung dieses Dialogfelds wird über dieCOleLinksDialog
Klasse zugegriffen. Wenn das aktuelle Dokument keine Verknüpfungen enthält, ist der Befehl deaktiviert.Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_OLE_VERB_FIRST... LAST An ID range for OLE verbs
COleDocument
verwendet diesen Befehls-ID-Bereich für die Verben, die vom aktuell ausgewählten OLE-Element/-Objekt unterstützt werden. Dies muss ein Bereich sein, da ein bestimmter OLE-Element-/Objekttyp null oder mehr benutzerdefinierte Verben unterstützen kann. Im Menü Ihrer Anwendung sollten Sie über ein Menüelement mit der ID von ID_OLE_VERB_FIRST verfügen. Wenn das Programm ausgeführt wird, wird das Menü mit der entsprechenden Menüverbbeschreibung (oder Popupmenü mit vielen Verben) aktualisiert. Die Verwaltung des OLE-Menüs erfolgtAfxOleSetEditMenu
im Update-Befehls-UI-Handler für diesen Befehl.Es gibt keine expliziten Befehlshandler für die Behandlung jeder Befehls-ID in diesem Bereich.
COleDocument::OnCmdMsg
wird überschrieben, um alle Befehls-IDs in diesem Bereich aufzufangen, sie in nullbasierte Verbnummern umzuwandeln und den Server für dieses Verb zu starten (mitCOleClientItem::DoVerb
).Anpassung oder andere Verwendung dieses Befehls-ID-Bereichs wird nicht empfohlen.
ID_VIEW_TOOLBAR Schaltet die Symbolleiste ein und aus.
CFrameWnd
behandelt diesen Befehl und den Updatebefehl-UI-Handler, um den sichtbaren Zustand der Symbolleiste umzuschalten. Die Symbolleiste muss ein untergeordnetes Fenster des Frames mit der untergeordneten Fenster-ID von AFX_IDW_TOOLBAR sein. Der Befehlshandler schaltet die Sichtbarkeit des Symbolleistenfensters tatsächlich um.CFrameWnd::RecalcLayout
wird verwendet, um das Rahmenfenster mit der Symbolleiste im neuen Zustand neu zu zeichnen. Der Benutzeroberflächenhandler für den Updatebefehl überprüft das Menüelement, wenn die Symbolleiste sichtbar ist.Die Anpassung dieses Befehlshandlers wird nicht empfohlen. Wenn Sie zusätzliche Symbolleisten hinzufügen möchten, möchten Sie den Befehlshandler und den Ui-Handler für den Updatebefehl für diesen Befehl klonen und ändern.
ID_VIEW_STATUS_BAR Schaltet die Statusleiste ein und aus.
Dieser Befehl wird wie ID_VIEW_TOOLBAR implementiert
CFrameWnd
, mit Ausnahme einer anderen untergeordneten Fenster-ID (AFX_IDW_STATUS_BAR) wird verwendet.
Nur Update-Befehlshandler
Mehrere Standardbefehls-IDs werden als Indikatoren in Statusleisten verwendet. Diese verwenden den gleichen Mechanismus für die Benutzeroberflächenbehandlung mit Aktualisierungsbefehlen, um den aktuellen visuellen Zustand während der Leerlaufzeit der Anwendung anzuzeigen. Da sie vom Benutzer nicht ausgewählt werden können (d. h. Sie können keinen Statusleistenbereich verschieben), ist es nicht sinnvoll, einen ON_COMMAND Handler für diese Befehls-IDs zu verwenden.
ID_INDICATOR_CAPS: FESTSTELLTASTE-Indikator.
ID_INDICATOR_NUM: NUM-Sperrindikator.
ID_INDICATOR_SCRL: SCRL-Sperrindikator.
ID_INDICATOR_KANA: KANA-Sperrindikator (gilt nur für japanische Systeme).
Alle drei dieser Elemente werden in CFrameWnd::OnUpdateKeyIndicator
einem Implementierungshilfsprogramm implementiert, das die Befehls-ID verwendet, um dem entsprechenden virtuellen Schlüssel zuzuordnen. Eine gängige Implementierung aktiviert oder deaktiviert (für Statusbereiche deaktiviert = kein Text) das CCmdUI
Objekt, je nachdem, ob der entsprechende virtuelle Schlüssel momentan gesperrt ist.
Die Anpassung dieses Befehlshandlers wird nicht empfohlen.
ID_INDICATOR_EXT: EXTended select indicator.
ID_INDICATOR_OVR : OVeRstrike Indikator.
ID_INDICATOR_REC: RECording-Indikator.
Derzeit gibt es keine Standardimplementierung für diese Indikatoren.
Wenn Sie sich dafür entscheiden, diese Indikatoren zu implementieren, empfehlen wir Ihnen, diese Indikator-IDs zu verwenden und die Reihenfolge der Indikatoren in Ihrer Statusleiste zu Standard (d. h. in dieser Reihenfolge: EXT, CAP, NUM, SCRL, OVR, REC).
Siehe auch
Technische Hinweise – nach Nummern geordnet
Technische Hinweise – nach Kategorien geordnet
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für