Класс CWindowImpl
Предоставляет методы для создания или подкласса окна.
Внимание
Этот класс и его члены нельзя использовать в приложениях, выполняемых в среде выполнения Windows.
Синтаксис
template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT<TBase, TWinTraits>
Параметры
T
Новый класс, производный от CWindowImpl
.
TBase
Базовый класс класса. По умолчанию базовый класс — CWindow.
TWinTraits
Класс признаков, определяющий стили окна. Значение по умолчанию — CControlWinTraits
.
Участники
Открытые методы
Имя | Описание |
---|---|
CWindowImpl::Create | Создает окно. |
Методы CWindowImplBaseT
Имя | Описание |
---|---|
DefWindowProc | Предоставляет обработку сообщений по умолчанию. |
GetCurrentMessage | Возвращает текущее сообщение. |
GetWindowProc | Возвращает текущую процедуру окна. |
OnFinalMessage | Вызывается после получения последнего сообщения (обычно WM_NCDESTROY). |
ПодклассWindow | Подклассы окна. |
UnsubclassWindow | Восстанавливает ранее подклассное окно. |
Статические методы
Имя | Описание |
---|---|
GetWndClassInfo | Возвращает статический экземпляр CWndClassInfo, который управляет сведениями о классе окна. |
WindowProc | Обрабатывает сообщения, отправленные в окно. |
Элементы данных
Имя | Описание |
---|---|
m_pfnSuperWindowProc | Указывает на исходную процедуру окна класса окна. |
Замечания
Можно использовать CWindowImpl
для создания окна или подкласса существующего окна. Процедура CWindowImpl
окна использует карту сообщений для направления сообщений соответствующим обработчикам.
CWindowImpl::Create
создает окно на основе сведений о классе окон, управляемых CWndClassInfo. CWindowImpl
содержит макрос DECLARE_WND_CLASS , то есть CWndClassInfo
регистрирует новый класс окна. Если требуется суперкласс существующего класса окна, наследуйте класс из CWindowImpl
и включите макрос DECLARE_WND_SUPERCLASS . В этом случае регистрирует класс окна, CWndClassInfo
основанный на существующем классе, но используется CWindowImpl::WindowProc
. Рассмотрим пример.
class ATL_NO_VTABLE CMyWindow :
OtherInheritedClasses
public CComControl<CMyWindow>
// CComControl derives from CWindowImpl
{
public:
// 1. The NULL parameter means ATL will generate a
// name for the superclass
// 2. The "EDIT" parameter means the superclass is
// based on the standard Windows Edit box
DECLARE_WND_SUPERCLASS(NULL, _T("EDIT"))
// Remainder of class declaration omitted
Примечание.
Так как CWndClassInfo
управляет информацией только для одного класса окна, каждое окно, созданное с помощью экземпляра CWindowImpl
, основано на одном классе окна.
CWindowImpl
также поддерживает подклассы окон. Метод SubclassWindow
присоединяет существующее окно к CWindowImpl
объекту и изменяет процедуру CWindowImpl::WindowProc
окна на . Каждый экземпляр CWindowImpl
может подклассить другое окно.
Примечание.
Для любого заданного CWindowImpl
объекта вызовите либоSubclassWindow
Create
. Не вызывайте оба метода в одном объекте.
Кроме того CWindowImpl
, ATL предоставляет CContainedWindow для создания окна, содержащегося в другом объекте.
Деструктор базового класса (~ CWindowImplRoot
) гарантирует, что окно исчезнет до уничтожения объекта.
CWindowImpl
производный от , который является производным от CWindowImplBaseT
, который является производным от CWindowImplRoot
TBase
CMessageMap.
Дополнительные сведения | Смотрите |
---|---|
Создание элементов управления | Учебник по ATL |
Использование окон в ATL | Классы окон ATL |
Мастер проектов ATL | Создание проекта ATL |
Иерархия наследования
TBase
CWindowImplRoot
CWindowImplBaseT
CWindowImpl
Требования
Заголовок: atlwin.h
CWindowImpl::Create
Создает окно на основе нового класса окна.
HWND Create(
HWND hWndParent,
_U_RECT rect = NULL,
LPCTSTR szWindowName = NULL,
DWORD dwStyle = 0,
DWORD dwExStyle = 0,
_U_MENUorID MenuOrID = 0U,
LPVOID lpCreateParam = NULL);
Параметры
hWndParent
[in] Дескриптор родительского или владельца окна.
rect
[in] Структура RECT , указывающая положение окна. Его RECT
можно передать по указателю или по ссылке.
szWindowName
[in] Указывает имя окна. Значение по умолчанию — NULL.
dwStyle
[in] Стиль окна. Это значение сочетается со стилем, предоставляемым классом признаков для окна. Значение по умолчанию дает классу признаков полный контроль над стилем. Список возможных значений см. в статье CreateWindow в пакете SDK для Windows.
dwExStyle
[in] Стиль расширенного окна. Это значение сочетается со стилем, предоставляемым классом признаков для окна. Значение по умолчанию дает классу признаков полный контроль над стилем. Список возможных значений см. в статье CreateWindowEx в пакете SDK для Windows.
MenuOrID
[in] Для дочернего окна идентификатор окна. Для окна верхнего уровня дескриптор меню для окна. Значение по умолчанию — 0U.
lpCreateParam
[in] Указатель на данные создания окна. Полное описание см. в описании окончательного параметра CreateWindowEx.
Возвращаемое значение
В случае успешного выполнения дескриптор созданного окна. В противном случае — значение NULL.
Замечания
Create
сначала регистрирует класс окна, если он еще не зарегистрирован. Созданное окно автоматически присоединяется к объекту CWindowImpl
.
Примечание.
Не вызывайте Create
, если вы уже назвали SubclassWindow.
Чтобы использовать класс окна, основанный на существующем классе окна, наследуйте класс и CWindowImpl
включите макрос DECLARE_WND_SUPERCLASS . Процедура окна существующего класса окна сохраняется в m_pfnSuperWindowProc. Дополнительные сведения см. в обзоре CWindowImpl .
Примечание.
Если значение 0 используется в качестве значения параметра MenuOrID , его необходимо указать как 0U (значение по умолчанию), чтобы избежать ошибки компилятора.
CWindowImpl::D efWindowProc
Вызывается WindowProc для обработки сообщений, не обработанных картой сообщений.
LRESULT DefWindowProc(
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
LRESULT DefWindowProc();
Параметры
uMsg
[in] Сообщение, отправленное в окно.
wParam
[in] Дополнительные сведения о сообщении.
lParam
[in] Дополнительные сведения о сообщении.
Возвращаемое значение
Результат обработки сообщения.
Замечания
По умолчанию вызывает функцию DefWindowProc
CallWindowProc Win32, чтобы отправить сведения о сообщении в процедуру окна, указанную в m_pfnSuperWindowProc.
Функция без параметров автоматически извлекает необходимые параметры из текущего сообщения.
CWindowImpl::GetCurrentMessage
Возвращает текущее сообщение, упаковаемое в структуру MSG
.
const MSG* GetCurrentMessage();
Возвращаемое значение
Текущее сообщение.
CWindowImpl::GetWindowProc
Возвращает WindowProc
текущую процедуру окна.
virtual WNDPROC GetWindowProc();
Возвращаемое значение
Текущая процедура окна.
Замечания
Переопределите этот метод, чтобы заменить процедуру окна собственной.
CWindowImpl::GetWndClassInfo
Вызывается путем создания для доступа к сведениям о классе окна.
static CWndClassInfo& GetWndClassInfo();
Возвращаемое значение
Статический экземпляр CWndClassInfo.
Замечания
По умолчанию CWindowImpl
получает этот метод с помощью макроса DECLARE_WND_CLASS , который задает новый класс окна.
Для суперкласса существующего класса окна наследуйте класс и CWindowImpl
включите макрос DECLARE_WND_SUPERCLASS для переопределения GetWndClassInfo
. Дополнительные сведения см. в обзоре CWindowImpl .
Помимо использования макросов DECLARE_WND_CLASS и DECLARE_WND_SUPERCLASS, можно переопределить GetWndClassInfo
собственную реализацию.
CWindowImpl::m_pfnSuperWindowProc
В зависимости от окна указывает на одну из следующих процедур окна.
WNDPROC m_pfnSuperWindowProc;
Замечания
Тип окна | Процедура окна |
---|---|
Окно на основе нового класса окна, указанного с помощью макроса DECLARE_WND_CLASS . | Функция DefWindowProc Win32. |
Окно, основанное на классе окна, который изменяет существующий класс, указанный с помощью макроса DECLARE_WND_SUPERCLASS . | Процедура окна существующего класса окна. |
Подклассное окно. | Исходная процедура окна подклассированного окна. |
CWindowImpl::D efWindowProc отправляет сведения о сообщении в процедуру окна, сохраненную в m_pfnSuperWindowProc
.
CWindowImpl::OnFinalMessage
Вызывается после получения последнего сообщения (обычно WM_NCDESTROY).
virtual void OnFinalMessage(HWND hWnd);
Параметры
hWnd
[in] Дескриптор уничтоженного окна.
Замечания
Реализация по умолчанию ничего не делает, но эту функцию OnFinalMessage
можно переопределить для обработки очистки перед уничтожением окна. Если вы хотите автоматически удалить объект после уничтожения окна, можно вызвать delete this;
эту функцию.
CWindowImpl::SubclassWindow
Подклассы окна, определяемого hWnd , и присоединяет его к объекту CWindowImpl
.
BOOL SubclassWindow(HWND hWnd);
Параметры
hWnd
[in] Дескриптор подкласса окна.
Возвращаемое значение
ЗНАЧЕНИЕ TRUE, если окно успешно подклассировано; в противном случае — ЗНАЧЕНИЕ FALSE.
Замечания
В подклассовом окне теперь используется CWindowImpl::WindowProc. Исходная процедура окна сохраняется в m_pfnSuperWindowProc.
CWindowImpl::UnsubclassWindow
Отсоединяет подклассное окно от CWindowImpl
объекта и восстанавливает исходную процедуру окна, сохраненную в m_pfnSuperWindowProc.
HWND UnsubclassWindow();
Возвращаемое значение
Дескриптор окна, который ранее был подклассирован.
CWindowImpl::WindowProc
Эта статическую функцию реализует процедуру окна.
static LRESULT CALLBACK WindowProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
Параметры
hWnd
[in] Дескриптор окна.
uMsg
[in] Сообщение, отправленное в окно.
wParam
[in] Дополнительные сведения о сообщении.
lParam
[in] Дополнительные сведения о сообщении.
Возвращаемое значение
Результат обработки сообщения.
Замечания
WindowProc
использует карту сообщений по умолчанию (объявленную с BEGIN_MSG_MAP) для перенаправления сообщений соответствующим обработчикам. При необходимости WindowProc
вызывает DefWindowProc для дополнительной обработки сообщений. Если окончательное сообщение не обрабатывается, WindowProc
выполните следующие действия:
Выполняет отмену классификации, если окно было неуправляемо.
Очищает
m_hWnd
.Вызывает OnFinalMessage перед уничтожением окна.
Можно переопределить WindowProc
для предоставления другого механизма обработки сообщений.