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 CWindowImpl
abgeleiteten 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 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.
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 Create
SubclassWindow
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 UnsubclassWindow
ein Unterklassenfenster von Ihrem Objekt zu trennen. Die ursprüngliche Fensterprozedur des Fensters wird dann wiederhergestellt.