Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Примечание.
Библиотека активных шаблонов (ATL) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Чтобы реализовать окно, наследуйте класс из 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. После этого будет восстановлена исходная процедура окна.