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


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

Чтобы реализовать окно, наследуйте класс из 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 После этого будет восстановлена исходная процедура окна окна.

См. также

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