Freigeben über


Implementieren eines Fensters mit CWindowImpl

Hinweis

Die aktive Vorlagenbibliothek (ACTIVE Template Library, ATL) wird weiterhin unterstützt. Wir fügen jedoch keine Features mehr hinzu oder aktualisieren die Dokumentation.

Um ein Fenster zu implementieren, leiten Sie eine Klasse von CWindowImpl ab. Deklarieren Sie in der abgeleiteten Klasse eine Nachrichtenzuordnung und die Nachrichtenhandlerfunktionen. Sie können Ihren Kurs jetzt auf drei verschiedene Arten verwenden:

Erstellen eines Fensters basierend auf einer neuen Windows-Klasse

CWindowImpl enthält das DECLARE_WND_CLASS Makro zum Deklarieren von Windows-Klasseninformationen. Dieses Makro implementiert die GetWndClassInfo Funktion, die CWndClassInfo verwendet, um die Informationen einer neuen Windows-Klasse zu definieren. Wenn CWindowImpl::Create aufgerufen wird, wird diese Windows-Klasse registriert und ein neues Fenster erstellt.

Hinweis

CWindowImpl übergibt NULL an das DECLARE_WND_CLASS Makro, was bedeutet, dass ATL einen Windows-Klassennamen generiert. Um Ihren eigenen Namen anzugeben, übergeben Sie eine Zeichenfolge an DECLARE_WND_CLASS in Ihrer CWindowImplabgeleiteten Klasse.

Beispiel: Implementieren eines Fensters

Nachfolgend sehen Sie ein Beispiel für eine Klasse, die ein Fenster basierend auf einer neuen Windows-Klasse implementiert:

class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS(_T("MyName")) 
              // If this macro is not specified in your
              // class, ATL will generate a class name

   BEGIN_MSG_MAP(CMyCustomWnd)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
   END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some painting code
      return 0;
   }

};

Erstellen Sie zum Erstellen eines Fensters eine Instanz von CMyWindow und rufen Sie dann die Create Methode auf.

Hinweis

Um die Standardinformationen der Windows-Klasse außer Kraft zu setzen, implementieren Sie die GetWndClassInfo Methode in Der abgeleiteten Klasse, indem Sie die CWndClassInfo Member auf die entsprechenden Werte festlegen.

Superclassing einer existierenden Windows-Klasse

Mit dem DECLARE_WND_SUPERCLASS-Makro können Sie ein Fenster erstellen, das eine vorhandene Windows-Klasse überklassiert. Geben Sie dieses Makro in Ihrer von CWindowImpl abgeleiteten Klasse an. Wie jedes andere ATL-Fenster werden Nachrichten von einer Nachrichtenzuordnung behandelt.

Wenn Sie DECLARE_WND_SUPERCLASS verwenden, wird eine neue Windows-Klasse registriert. Diese neue Klasse entspricht der von Ihnen angegebenen vorhandenen Klasse, ersetzt jedoch die Fensterprozedur durch CWindowImpl::WindowProc (oder durch Ihre Funktion, die diese Methode außer Kraft setzt).

Beispiel: Superclass der Edit-Klasse

Nachfolgend sehen Sie ein Beispiel für eine Klasse, die die Standardmäßige Edit-Klasse superklassiert:

class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
   // "Edit" is the name of the standard Windows class.
   // "MyEdit" is the name of the new Windows class
   // that will be based on the Edit class.
   DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))

   BEGIN_MSG_MAP(CMyEdit)
      MESSAGE_HANDLER(WM_CHAR, OnChar)
   END_MSG_MAP()

   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some character handling code
      return 0;
   }
};

Erstellen Sie zum Erstellen des Fensters "Superclassed Edit" eine Instanz von CMyEdit und rufen Sie dann die Create Methode auf.

Erstellen einer abgeleiteten Klasse für ein vorhandenes Fenster

Um ein vorhandenes Fenster zu unterklassen, leiten Sie eine Klasse von CWindowImpl ab und deklarieren Sie eine Nachrichtenzuordnung, wie in den beiden vorherigen Fällen. Beachten Sie jedoch, dass Sie keine Windows-Klasseninformationen angeben, da Sie ein bereits vorhandenes Fenster unterklassen.

Rufen Sie anstelle von CreateSubclassWindow auf und übergeben Sie ihm das Handle des vorhandenen Fensters, das Sie unterklassen möchten. Sobald das Fenster subklassifiziert ist, wird CWindowImpl::WindowProc (oder Ihre Funktion, die diese Methode überschreibt) verwendet, um Nachrichten an die Nachrichtenzuweisung zu leiten. Um ein Unterklassenfenster von Ihrem Objekt zu trennen, rufen Sie UnsubclassWindow auf. Die ursprüngliche Fensterprozedur wird dann wiederhergestellt.

Siehe auch

Implementieren eines Fensters