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. Процедура окна исходной затем будет восстановлена.