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


Implementing a Window with CWindowImpl

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

  • Создайте окно, основанную на классе нового окна

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

  • Подкласс существующее окно

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

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

Примечание

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

Пример

Ниже приведен пример класса, реализующего окно, основанного на классе нового окна:

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 и затем вызовите метод Создать.

Примечание

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

Ниже приведен пример класса, суперклассы стандартный класс правки.

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;
   }
};

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

Superclassing существующий класс Windows

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

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

Subclassing существующее окно

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

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

См. также

Ссылки

Implementing a Window