Sdílet prostřednictvím


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

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

Viz také

Implementace okna