CWindowImpl-Klasse
Stellt Methoden für das Erstellen eines Fensters oder von Unterklassen eines Fensters bereit
Wichtig
Diese Klasse und ihre Member können nicht in Anwendungen verwendet werden, die in der Windows-Runtime ausgeführt werden.
template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT<TBase, TWinTraits>
T
Die neue Klasse, die von CWindowImpl
abgeleitet ist.
TBase
Die Basisklasse der Klasse. Standardmäßig ist die Basisklasse CWindow.
TWinTraits
Eine Eigenschaftenklasse , die Formatvorlagen für Ihr Fenster definiert. Der Standardwert ist CControlWinTraits
.
Name | Beschreibung |
---|---|
CWindowImpl::Create | Erstellt ein Fenster. |
Name | Beschreibung |
---|---|
DefWindowProc | Stellt die Standardverarbeitung von Nachrichten bereit. |
GetCurrentMessage | Die gibt die aktuelle Nachricht zurück. |
GetWindowProc | Gibt die aktuelle Fensterprozedur zurück. |
OnFinalMessage | Wird aufgerufen, nachdem die letzte Nachricht empfangen wurde (in der Regel WM_NCDESTROY). |
UnterklasseWindow | Erstellt Unterklassen eines Fensters. |
UnsubclassWindow | Stellt ein zuvor untergeordnetes Fenster wieder her. |
Name | Beschreibung |
---|---|
GetWndClassInfo | Gibt eine statische Instanz von CWndClassInfo zurück, die die Fensterklasseninformationen verwaltet. |
WindowProc | Verarbeitet die Nachrichten, die an das Fenster gesendet werden. |
Name | Beschreibung |
---|---|
m_pfnSuperWindowProc | Zeigt auf die ursprüngliche Fensterprozedur der Fensterklasse. |
Sie können CWindowImpl
ein Fenster oder eine Unterklasse eines vorhandenen Fensters erstellen. die CWindowImpl
Fensterprozedur verwendet eine Nachrichtenzuordnung, um Nachrichten an die entsprechenden Handler zu leiten.
CWindowImpl::Create
erstellt ein Fenster basierend auf den Von CWndClassInfo verwalteten Fensterklasseninformationen. CWindowImpl
enthält das DECLARE_WND_CLASS Makro, was bedeutet CWndClassInfo
, dass eine neue Fensterklasse registriert wird. Wenn Sie eine vorhandene Fensterklasse überlagern möchten, leiten Sie Ihre Klasse von der klasse ab CWindowImpl
und fügen Sie das DECLARE_WND_SUPERCLASS Makro ein. In diesem Fall wird mit CWndClassInfo
eine Fensterklasse registriert, die auf einer vorhandenen Klasse basiert, aber CWindowImpl::WindowProc
verwendet. Zum Beispiel:
class ATL_NO_VTABLE CMyWindow :
OtherInheritedClasses
public CComControl<CMyWindow>
// CComControl derives from CWindowImpl
{
public:
// 1. The NULL parameter means ATL will generate a
// name for the superclass
// 2. The "EDIT" parameter means the superclass is
// based on the standard Windows Edit box
DECLARE_WND_SUPERCLASS(NULL, _T("EDIT"))
// Remainder of class declaration omitted
Hinweis
Da CWndClassInfo
nur die Informationen für eine Fensterklasse verwaltet, basiert jedes Fenster, das durch eine Instanz von CWindowImpl
erstellt wird, auf der gleichen Fensterklasse.
CWindowImpl
unterstützt auch die Erstellung von Unterklassen von Fenstern. Die SubclassWindow
-Methode fügt ein vorhandenes Fenster an das CWindowImpl
-Objekt an und ändert die Fensterprozedur in CWindowImpl::WindowProc
. Jede Instanz von CWindowImpl
kann ein anderes Fenster unterordnen.
Hinweis
Rufen Sie für ein bestimmtes CWindowImpl
Objekt entweder Create
oder SubclassWindow
. Rufen Sie nicht beide Methoden für dasselbe Objekt auf.
Darüber hinaus CWindowImpl
stellt ATL CContainedWindow bereit, um ein Fenster zu erstellen, das in einem anderen Objekt enthalten ist.
Der Basisklassen-Destruktor (~ CWindowImplRoot
) stellt sicher, dass das Fenster nicht mehr vorhanden ist, bevor das Objekt zerstört wird.
CWindowImpl
abgeleitet von CWindowImplBaseT
, die CWindowImplRoot
von , abgeleitet von , die von TBase
und CMessageMap abgeleitet.
Weitere Informationen zu | Siehe |
---|---|
Erstellen von Steuerelementen | ATL-Tutorial |
Verwenden von Fenstern in ATL | ATL-Fensterklassen |
ATL-Projekt-Assistent | Erstellen eines ATL-Projekts |
TBase
CWindowImplRoot
CWindowImplBaseT
CWindowImpl
Kopfzeile: atlwin.h
Erstellt ein Fenster basierend auf einer neuen Fensterklasse.
HWND Create(
HWND hWndParent,
_U_RECT rect = NULL,
LPCTSTR szWindowName = NULL,
DWORD dwStyle = 0,
DWORD dwExStyle = 0,
_U_MENUorID MenuOrID = 0U,
LPVOID lpCreateParam = NULL);
hWndParent
[in] Das Handle für das übergeordnete Fenster oder das Besitzerfenster.
rect
[in] Eine RECT-Struktur , die die Position des Fensters angibt. Dies RECT
kann per Zeiger oder Verweis übergeben werden.
szWindowName
[in] Gibt den Namen des Fensters an. Der Standardwert ist NULL.
dwStyle
[in] Die Formatvorlage des Fensters. Dieser Wert wird mit der Formatvorlage kombiniert, die von der Eigenschaftsklasse für das Fenster bereitgestellt wird. Der Standardwert gibt der Eigenschaftsklasse die vollständige Kontrolle über die Formatvorlage. Eine Liste der möglichen Werte finden Sie unter CreateWindow im Windows SDK.
dwExStyle
[in] Die Formatvorlage des erweiterten Fensters. Dieser Wert wird mit der Formatvorlage kombiniert, die von der Eigenschaftsklasse für das Fenster bereitgestellt wird. Der Standardwert gibt der Eigenschaftsklasse die vollständige Kontrolle über die Formatvorlage. Eine Liste der möglichen Werte finden Sie unter CreateWindowEx im Windows SDK.
MenuOrID
[in] Bei einem untergeordneten Fenster wird der Fensterbezeichner angezeigt. Für ein Fenster auf oberster Ebene wird ein Menühandle für das Fenster verwendet. Der Standardwert ist 0U.
lpCreateParam
[in] Ein Zeiger auf Fenstererstellungsdaten. Eine vollständige Beschreibung finden Sie in der Beschreibung für den endgültigen Parameter zu CreateWindowEx.
Bei erfolgreicher Ausführung wird das Handle für das neu erstellte Fenster ausgeführt. Andernfalls wird NULL verwendet.
Create
registriert zuerst die Fensterklasse, wenn sie noch nicht registriert wurde. Das neu erstellte Fenster wird automatisch an das CWindowImpl
Objekt angefügt.
Hinweis
Rufen Sie nicht aufCreate
, wenn Sie "SubclassWindow" bereits aufgerufen haben.
Um eine Fensterklasse zu verwenden, die auf einer vorhandenen Fensterklasse basiert, leiten Sie Ihre Klasse ab CWindowImpl
und schließen sie das DECLARE_WND_SUPERCLASS Makro ein. Die Fensterprozedur der vorhandenen Fensterklasse wird in m_pfnSuperWindowProc gespeichert. Weitere Informationen finden Sie in der Übersicht über CWindowImpl .
Hinweis
Wenn 0 als Wert für den MenuOrID-Parameter verwendet wird, muss er als 0U (Standardwert) angegeben werden, um einen Compilerfehler zu vermeiden.
Wird von WindowProc aufgerufen, um Nachrichten zu verarbeiten, die nicht von der Nachrichtenzuordnung verarbeitet werden.
LRESULT DefWindowProc(
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
LRESULT DefWindowProc();
uMsg
[in] Die an das Fenster gesendete Nachricht.
wParam
[in] Zusätzliche nachrichtenspezifische Informationen.
lParam
[in] Zusätzliche nachrichtenspezifische Informationen.
Das Ergebnis der Nachrichtenverarbeitung.
Ruft standardmäßig die CallWindowProc Win32-Funktion auf, DefWindowProc
um die Nachrichteninformationen an die in m_pfnSuperWindowProc angegebene Fensterprozedur zu senden.
Die Funktion ohne Parameter ruft automatisch die erforderlichen Parameter aus der aktuellen Nachricht ab.
Gibt die aktuelle Nachricht zurück, die in der MSG
Struktur verpackt ist.
const MSG* GetCurrentMessage();
Die aktuelle Nachricht.
Gibt die aktuelle Fensterprozedur zurück WindowProc
.
virtual WNDPROC GetWindowProc();
Die aktuelle Fensterprozedur.
Überschreiben Sie diese Methode, um die Fensterprozedur durch ihre eigene zu ersetzen.
Wird von Create aufgerufen, um auf die Fensterklasseninformationen zuzugreifen.
static CWndClassInfo& GetWndClassInfo();
Eine statische Instanz von CWndClassInfo.
Ruft diese Methode standardmäßig CWindowImpl
über das DECLARE_WND_CLASS-Makro ab, das eine neue Fensterklasse angibt.
Um eine vorhandene Fensterklasse zu überklassen, leiten Sie Ihre Klasse von der klasse ab CWindowImpl
und schließen sie das DECLARE_WND_SUPERCLASS Makro ein, um außer Kraft zu setzen GetWndClassInfo
. Weitere Informationen finden Sie in der Übersicht über CWindowImpl .
Neben der Verwendung der DECLARE_WND_CLASS und DECLARE_WND_SUPERCLASS Makros können Sie mit Ihrer eigenen Implementierung außer Kraft setzen GetWndClassInfo
.
Zeigt je nach Fenster auf eine der folgenden Fensterprozeduren.
WNDPROC m_pfnSuperWindowProc;
Fenstertyp | Fensterprozedur |
---|---|
Ein Fenster basierend auf einer neuen Fensterklasse, die über das DECLARE_WND_CLASS-Makro angegeben wird. | Die DefWindowProc Win32-Funktion. |
Ein Fenster basierend auf einer Fensterklasse, die eine vorhandene Klasse ändert, die über das DECLARE_WND_SUPERCLASS-Makro angegeben wird. | Die Fensterprozedur der vorhandenen Fensterklasse. |
Ein Unterklassenfenster. | Die ursprüngliche Fensterprozedur des Unterklassenfensters. |
CWindowImpl::D efWindowProc sendet Nachrichteninformationen an die fensterprozedur gespeichert in m_pfnSuperWindowProc
.
Wird aufgerufen, nachdem die letzte Nachricht empfangen wurde (in der Regel WM_NCDESTROY).
virtual void OnFinalMessage(HWND hWnd);
hWnd
[in] Ein Griff zum zerstörten Fenster.
Die Standardimplementierung von OnFinalMessage
"Erledigt" führt nichts aus, aber Sie können diese Funktion außer Kraft setzen, um die Bereinigung zu behandeln, bevor Sie ein Fenster zerstören. Wenn Sie Ihr Objekt bei der Fenstervernichtung automatisch löschen möchten, können Sie diese Funktion aufrufen delete this;
.
Unterklassen des durch hWnd identifizierten Fensters und fügt es an das CWindowImpl
Objekt an.
BOOL SubclassWindow(HWND hWnd);
hWnd
[in] Das Handle für das Fenster, das unterklassigt wird.
TRUE, wenn das Fenster erfolgreich unterklassigt ist; andernfalls FALSE.
Das Unterklassenfenster verwendet jetzt CWindowImpl::WindowProc. Die ursprüngliche Fensterprozedur wird in m_pfnSuperWindowProc gespeichert.
Hinweis
Rufen Sie nicht aufSubclassWindow
, wenn Sie "Create" bereits aufgerufen haben.
Trennt das Unterklassenfenster vom CWindowImpl
Objekt und stellt die ursprüngliche Fensterprozedur wieder her, die in m_pfnSuperWindowProc gespeichert ist.
HWND UnsubclassWindow();
Das Handle für das Fenster, das zuvor unterklassigt wurde.
Diese statische Funktion implementiert die Fensterprozedur.
static LRESULT CALLBACK WindowProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
hWnd
[in] Der Ziehpunkt für das Fenster.
uMsg
[in] Die an das Fenster gesendete Nachricht.
wParam
[in] Zusätzliche nachrichtenspezifische Informationen.
lParam
[in] Zusätzliche nachrichtenspezifische Informationen.
Das Ergebnis der Nachrichtenverarbeitung.
WindowProc
verwendet die Standardnachrichtenzuordnung (deklariert mit BEGIN_MSG_MAP), um Nachrichten an die entsprechenden Handler zu leiten. Ruft bei Bedarf WindowProc
DefWindowProc für die zusätzliche Nachrichtenverarbeitung auf. Wenn die endgültige Nachricht nicht behandelt wird, WindowProc
gehen Sie wie folgt vor:
Führt eine Nichtklassifizierung durch, wenn das Fenster nicht klassifiziert wurde.
Löscht
m_hWnd
.Ruft OnFinalMessage auf, bevor das Fenster zerstört wird.
Sie können außer Kraft setzen WindowProc
, um einen anderen Mechanismus zum Behandeln von Nachrichten bereitzustellen.