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

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

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

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

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

Ниже приведен пример класса, который реализует окна на основе нового класса Windows:

класс CMyWindow: государственные CWindowImpllt;CMyWindow >,...
{
общественности:
   / / Дополнительно указать имя нового класса Windows
   DECLARE_WND_CLASS("myname") / / Если этот макрос не указан в вашем
              / / класс, ATL будет генерировать имя класса
   ...

BEGIN_MSG_MAP(CMyWindow)
      MESSAGE_HANDLER (WM_PAINT, OnPaint)
   END_MSG_MAP()

LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
   {
      / / Сделать некоторый код живописи
      Возвращает 0;
   }
}

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

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

Суперкласс существующий класс Windows

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

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

После представляет собой пример класса что суперклассом для стандартного редактирования класс:

класс CMyEdit: государственные CWindowImpllt;CMyEdit >,...
{
общественности:
   / / «Edit» это имя стандартного класса Windows.
   / / «MyEdit» является имя нового класса Windows
   / / Это будет основываться на класса Edit.
   DECLARE_WND_SUPERCLASS ("Правка", «MyEdit»)

...
   BEGIN_MSG_MAP(CMyEdit)
      MESSAGE_HANDLER (WM_CHAR, OnChar)
   END_MSG_MAP()

LRESULT OnChar(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
   {
      / / Сделать некоторые символов код обработки
   }
}

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

Для получения дополнительных сведений о суперкласс, см. Суперкласс процедура окна в Win32 SDK.

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

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

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

Для получения дополнительных сведений о подклассы, см. Подклассы процедура окна в Win32 SDK.

Index