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


Класс 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 объекта вызовите либоSubclassWindowCreate. Не вызывайте оба метода в одном объекте.

Кроме того CWindowImpl, ATL предоставляет CContainedWindow для создания окна, содержащегося в другом объекте.

Деструктор базового класса (~ CWindowImplRoot) гарантирует, что окно исчезнет до уничтожения объекта.

CWindowImplпроизводный от , который является производным от CWindowImplBaseT, который является производным от CWindowImplRootTBase CMessageMap.

Дополнительные сведения Смотрите
Создание элементов управления Учебник по ATL
Использование окон в ATL Классы окон ATL
Мастер проектов ATL Создание проекта ATL

Иерархия наследования

CMessageMap

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.

Примечание.

Не вызывайте SubclassWindow вызов, если вы уже вызвали create.

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

См. также

BEGIN_MSG_MAP
Класс CComControl
Общие сведения о классе