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