Поделиться через


Реализация окна с помощью CWindowImpl

Примечание.

Библиотека активных шаблонов (ATL) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.

Чтобы реализовать окно, наследуйте класс из CWindowImpl. В производном классе объявите карту сообщений и функции обработчика сообщений. Теперь класс можно использовать тремя способами:

Создание окна на основе нового класса Windows

CWindowImplсодержит макрос DECLARE_WND_CLASS для объявления сведений о классе Windows. Этот макрос реализует GetWndClassInfo функцию, которая использует CWndClassInfo для определения сведений нового класса Windows. При CWindowImpl::Create вызове этот класс Windows зарегистрирован и создается новое окно.

Примечание.

CWindowImpl Передает значение NULL макросу DECLARE_WND_CLASS , что означает, что ATL создаст имя класса Windows. Чтобы указать собственное имя, передайте строку в DECLARE_WND_CLASS в CWindowImpl производном классе.

Пример. Реализация окна

Ниже приведен пример класса, реализующего окно на основе нового класса 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;
   }

};

Чтобы создать окно, создайте экземпляр CMyWindow и вызовите Create метод.

Примечание.

Чтобы переопределить сведения о классе Windows по умолчанию, реализуйте GetWndClassInfo метод в производном классе, задав CWndClassInfo членам соответствующие значения.

Суперклассирование существующего класса Windows

Макрос DECLARE_WND_SUPERCLASS позволяет создать окно, которое суперклассирует существующий класс Windows. Укажите этот макрос в CWindowImpl производном классе. Как и любое другое окно ATL, сообщения обрабатываются картой сообщений.

При использовании DECLARE_WND_SUPERCLASS новый класс Windows будет зарегистрирован. Этот новый класс будет таким же, как указанный вами класс, но заменит процедуру окна CWindowImpl::WindowProc на вашу функцию, которая переопределяет этот метод.

Пример: Суперкласс класса Edit

Ниже приведен пример класса, который суперклассирует стандартный класс 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;
   }
};

Чтобы создать суперклассованное окно редактирования, создайте экземпляр CMyEdit и вызовите Create метод.

Создание подкласса существующего окна

Для создания подкласса существующего окна, создайте производный класс от CWindowImpl и объявите карту сообщений, как в двух предыдущих случаях. Обратите внимание, что вы не указываете сведения о классе Windows, так как вы будете подклассировать уже существующее окно.

Вместо вызова Create, вызовите SubclassWindow и передайте ему дескриптор существующего окна, которое вы хотите подклассифицировать. После создания подкласса для окна, оно будет использовать CWindowImpl::WindowProc (или вашу функцию, которая переопределяет данный метод), чтобы направлять сообщения на карту сообщений. Чтобы отсоединить окно с подклассом от объекта, вызовите UnsubclassWindow. После этого будет восстановлена исходная процедура окна.

См. также

Реализация окна