Udostępnij przez


Implementowanie okna przy użyciu klasy CWindowImpl

Aby zaimplementować okno, należy utworzyć klasę z CWindowImplklasy . W klasie pochodnej zadeklaruj mapę komunikatów i funkcje obsługi komunikatów. Teraz możesz użyć klasy na trzy różne sposoby:

Tworzenie okna na podstawie nowej klasy systemu Windows

CWindowImpl zawiera makro DECLARE_WND_CLASS do deklarowania informacji o klasie systemu Windows. To makro implementuje GetWndClassInfo funkcję, która używa CWndClassInfo do definiowania informacji o nowej klasie systemu Windows. Po CWindowImpl::Create wywołaniu ta klasa systemu Windows zostanie zarejestrowana i zostanie utworzone nowe okno.

Uwaga

CWindowImpl przekazuje wartość NULL do makra DECLARE_WND_CLASS , co oznacza, że usługa ATL wygeneruje nazwę klasy systemu Windows. Aby określić własną nazwę, przekaż ciąg do DECLARE_WND_CLASS w klasie pochodnej CWindowImpl.

Przykład: implementowanie okna

Poniżej przedstawiono przykład klasy, która implementuje okno na podstawie nowej klasy systemu 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;
   }

};

Aby utworzyć okno, utwórz wystąpienie CMyWindow klasy , a następnie wywołaj metodę Create .

Uwaga

Aby zastąpić domyślne informacje o klasie systemu Windows, zaimplementuj GetWndClassInfo metodę w klasie pochodnej, ustawiając CWndClassInfo składowe na odpowiednie wartości.

Superklasowanie istniejącej klasy systemu Windows

Makro DECLARE_WND_SUPERCLASS umożliwia utworzenie okna, które zastępuje istniejącą klasę systemu Windows. Określ to makro w CWindowImplklasie -pochodnej. Podobnie jak w przypadku każdego innego okna ATL komunikaty są obsługiwane przez mapę komunikatów.

W przypadku korzystania z DECLARE_WND_SUPERCLASS zostanie zarejestrowana nowa klasa systemu Windows. Ta nowa klasa będzie taka sama jak określona klasa istniejąca, ale zastąpi procedurę okna (lub funkcją CWindowImpl::WindowProc , która zastępuje tę metodę).

Przykład: superklasa klasy Edit

Oto przykład klasy, która klasy superklasuje standardową klasę 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;
   }
};

Aby utworzyć okno edycji superklasowej, utwórz wystąpienie CMyEdit klasy , a następnie wywołaj metodę Create .

Podklasowanie istniejącego okna

Aby podklasować istniejące okno, utwórz klasę z CWindowImpl i zadeklaruj mapę komunikatów, jak w dwóch poprzednich przypadkach. Należy jednak pamiętać, że nie określisz żadnych informacji o klasie systemu Windows, ponieważ będzie to już istniejące okno.

Zamiast wywoływać Createmetodę , wywołaj SubclassWindow i przekaż do niego dojście do istniejącego okna, w którym chcesz utworzyć podklasę. Po utworzeniu podklasy okno będzie używane CWindowImpl::WindowProc (lub funkcja, która zastępuje tę metodę), aby kierować komunikaty do mapy komunikatów. Aby odłączyć okno podklasy od obiektu, wywołaj metodę UnsubclassWindow. Oryginalna procedura okna zostanie przywrócona.

Zobacz też

Implementowanie okna