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.
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.