Freigeben über


Handler für Windows-Standardmeldungen

Standardhandler für Standard-Windows-Nachrichten (WM_) sind in der Klasse CWndvordefiniert. Die Klassenbibliothek basiert auf Namen für diese Handler auf dem Nachrichtennamen. Der Handler für die WM_PAINT-Nachricht wird z. B. wie CWnd folgt deklariert:

afx_msg void OnPaint();

Die afx_msg Schlüsselwort (keyword) schlägt den Effekt der C++ virtual -Schlüsselwort (keyword) vor, indem die Handler von anderen CWnd Memberfunktionen unterschieden werden. Beachten Sie jedoch, dass diese Funktionen nicht tatsächlich virtuell sind; sie werden stattdessen über Nachrichtenzuordnungen implementiert. Nachrichtenzuordnungen hängen ausschließlich von Standardvorprozessormakros ab, nicht von Erweiterungen der C++-Sprache. Die afx_msg Schlüsselwort (keyword) wird nach der Vorverarbeitung in Leerzeichen aufgelöst.

Um einen in einer Basisklasse definierten Handler außer Kraft zu setzen, definieren Sie einfach eine Funktion mit demselben Prototyp in der abgeleiteten Klasse und erstellen sie einen Meldungszuordnungseintrag für den Handler. Der Handler überschreibt jeden Handler mit demselben Namen in den Basisklassen ihrer Klasse.

In einigen Fällen sollte der Handler den überschriebenen Handler in der Basisklasse aufrufen, damit die Basisklasse(n) und Windows die Nachricht verarbeiten können. Wo Sie den Basisklassenhandler in Ihrer Außerkraftsetzung aufrufen, hängt von den Umständen ab. Manchmal müssen Sie den Basisklassenhandler zuerst und manchmal zuletzt aufrufen. Manchmal rufen Sie den Basisklassenhandler bedingt auf, wenn Sie die Nachricht selbst nicht behandeln möchten. Manchmal sollten Sie den Basisklassenhandler aufrufen und dann ihren eigenen Handlercode abhängig vom Wert oder Zustand, der vom Basisklassenhandler zurückgegeben wird, bedingt ausführen.

Achtung

Es ist nicht sicher, die an einen Handler übergebenen Argumente zu ändern, wenn Sie sie an einen Basisklassenhandler übergeben möchten. Sie können z. B. versucht sein, das nChar-Argument des OnChar Handlers zu ändern (z. B. in Großbuchstaben zu konvertieren). Dieses Verhalten ist ziemlich undurchsichtig, aber wenn Sie diesen Effekt erreichen müssen, verwenden Sie stattdessen die CWnd Memberfunktion SendMessage .

Wie bestimmen Sie die richtige Methode zum Überschreiben einer bestimmten Nachricht, wenn der Klassen-Assistent das Skelett der Handlerfunktion für eine bestimmte Nachricht schreibt – z. B. einen OnCreate Handler für WM_CREATE – wird in Form der empfohlenen Überschreibungselementfunktion skizziert. Im folgenden Beispiel wird empfohlen, dass der Handler zuerst den Basisklassenhandler aufruft und nur dann fortgesetzt wird, wenn er nicht -1 zurückgibt.

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFormView::OnCreate(lpCreateStruct) == -1)
      return -1;

   // TODO:  Add your specialized creation code here

   return 0;
}

In der Konvention beginnen die Namen dieser Handler mit dem Präfix "Ein". Einige dieser Handler verwenden keine Argumente, während andere mehrere verwenden. Einige haben auch einen anderen Rückgabetyp als void. Die Standardhandler für alle WM_ Nachrichten werden in der MFC-Referenz als Memberfunktionen der Klasse CWnd dokumentiert, deren Namen mit "Ein" beginnen. Die Deklarationen der Memberfunktion werden CWnd afx_msg vorangestellt.

Siehe auch

Deklarieren von Meldungshandlerfunktionen