Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.