Implementace okna pomocí CWindowImpl
Chcete-li implementovat okno, odvození třídy z CWindowImpl
. V odvozené třídě deklarujte mapu zpráv a funkce obslužné rutiny zpráv. Třídu teď můžete používat třemi různými způsoby:
Vytvoření okna založeného na nové třídě Windows
CWindowImpl
obsahuje DECLARE_WND_CLASS makro pro deklaraci informací o třídě systému Windows. Toto makro implementuje GetWndClassInfo
funkci, která používá CWndClassInfo k definování informací o nové třídě Windows. Při CWindowImpl::Create
zavolání je tato třída Systému Windows zaregistrována a vytvoří se nové okno.
Poznámka:
CWindowImpl
předá do makra hodnotu NULL DECLARE_WND_CLASS
, což znamená, že ATL vygeneruje název třídy Systému Windows. Pokud chcete zadat vlastní název, předejte řetězec DECLARE_WND_CLASS v CWindowImpl
odvozené třídě.
Příklad: Implementace okna
Následuje příklad třídy, která implementuje okno založené na nové třídě Windows:
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;
}
};
Chcete-li vytvořit okno, vytvořte instanci CMyWindow
a potom zavolejte metodu Create
.
Poznámka:
Chcete-li přepsat výchozí informace třídy systému Windows, implementujte metodu GetWndClassInfo
v odvozené třídě nastavením CWndClassInfo
členů na příslušné hodnoty.
Nadtřídění existující třídy Windows
Makro DECLARE_WND_SUPERCLASS umožňuje vytvořit okno, které nadtřídí existující třídu Windows. Zadejte toto makro v CWindowImpl
odvozené třídě. Stejně jako jakékoli jiné okno ATL se zprávy zpracovávají pomocí mapy zpráv.
Když použijete DECLARE_WND_SUPERCLASS, zaregistruje se nová třída Systému Windows. Tato nová třída bude stejná jako existující třída, kterou zadáte, ale nahradí proceduru CWindowImpl::WindowProc
okna (nebo vaší funkcí, která tuto metodu přepíše).
Příklad: Supertřídy třídy Edit
Následuje příklad třídy, která nadtřídí standardní třídu Edit:
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;
}
};
Chcete-li vytvořit nadtříděné okno Upravit, vytvořte instanci CMyEdit
a potom zavolejte metodu Create
.
Podtřídy existujícího okna
Chcete-li podtřídu existujícího okna, odvodit třídu a CWindowImpl
deklarovat mapu zpráv, jako v předchozích dvou případech. Všimněte si však, že nezadáte žádné informace o třídě systému Windows, protože podtřídy již existující okno.
Místo volání Create
, volání SubclassWindow
a předání popisovač do existujícího okna, které chcete podtřídy. Jakmile je okno podtříděno, použije CWindowImpl::WindowProc
(nebo vaši funkci, která tuto metodu přepíše) k nasměrování zpráv do mapy zpráv. Chcete-li odpojit podtříděné okno od objektu, zavolejte UnsubclassWindow
. Původní postup okna se pak obnoví.