Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 CWindowImplodvozené 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 CWindowImplodvozené 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í.