Freigeben über


Implementieren eines Fensters mit CWindowImpl

Um ein Fenster zu implementieren, leiten Sie eine Klasse von CWindowImpl. 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 diese Windows-Klasse 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.

Überklassen einer vorhandenen 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 der CWindowImplabgeleiteten 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.

Unterklassen eines vorhandenen Fensters

Um ein vorhandenes Fenster zu unterklassen, leiten Sie eine Klasse von einer Nachrichtenzuordnung ab CWindowImpl und deklarieren sie, 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 des Aufrufs CreateSubclassWindow das Handle an das vorhandene Fenster an, das Sie unterklassen möchten. Sobald das Fenster unterklassigt ist, wird es ( CWindowImpl::WindowProc oder Ihre Funktion, die diese Methode überschreibt) verwendet, um Nachrichten an die Nachrichtenzuordnung zu leiten. Rufen Sie auf, um UnsubclassWindowein Unterklassenfenster von Ihrem Objekt zu trennen. Die ursprüngliche Fensterprozedur des Fensters wird dann wiederhergestellt.

Siehe auch

Implementieren eines Fensters