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


Класс CContainedWindowT

Этот класс реализует окно, содержащееся в другом объекте.

Важно!

Этот класс и его члены нельзя использовать в приложениях, выполняемых в среде выполнения Windows.

Синтаксис

template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
class CContainedWindowT : public TBase

Параметры

ТБ ase
Базовый класс нового класса. Базовый класс по умолчанию.CWindow

TWinTraits
Класс признаков, определяющий стили окна. Значение по умолчанию — CControlWinTraits.

Примечание.

CContainedWindow является специализацией CContainedWindowT. Если вы хотите изменить базовый класс или признаки, используйте CContainedWindowT напрямую.

Участники

Открытые конструкторы

Имя Описание
CContainedWindowT::CContainedWindowT Конструктор. Инициализирует элементы данных, чтобы указать, какая карта сообщений будет обрабатывать сообщения автономного окна.

Открытые методы

Имя Описание
CContainedWindowT::Create Создает окно.
CContainedWindowT::D efWindowProc Предоставляет обработку сообщений по умолчанию.
CContainedWindowT::GetCurrentMessage Возвращает текущее сообщение.
CContainedWindowT::RegisterWndSuperclass Регистрирует класс окна в автономном окне.
CContainedWindowT::SubclassWindow Подклассы окна.
CContainedWindowT::SwitchMessageMap Изменяет карту сообщений, используемую для обработки сообщений в автономном окне.
CContainedWindowT::UnsubclassWindow Восстанавливает ранее подклассное окно.
CContainedWindowT::WindowProc (статический) Обрабатывает сообщения, отправленные в автономное окно.

Открытые члены данных

Имя Описание
CContainedWindowT::m_dwMsgMapID Определяет, какая карта сообщений будет обрабатывать сообщения, содержащиеся в окне.
CContainedWindowT::m_lpszClassName Указывает имя существующего класса окна, на котором будет основан новый класс окна.
CContainedWindowT::m_pfnSuperWindowProc Указывает на исходную процедуру окна класса окна.
CContainedWindowT::m_pObject Указывает на содержащий объект.

Замечания

CContainedWindowT реализует окно, содержащееся в другом объекте. CContainedWindowTПроцедура окна использует карту сообщений в содержащий объект для направления сообщений соответствующим обработчикам. При создании CContainedWindowT объекта необходимо указать, какую карту сообщений следует использовать.

CContainedWindowT позволяет создать новое окно путем суперкласса существующего класса окна. Метод Create сначала регистрирует класс окна, основанный на существующем классе, но используется CContainedWindowT::WindowProc. Create затем создает окно на основе этого нового класса окна. Каждый экземпляр CContainedWindowT может суперклассового класса окна.

CContainedWindowT также поддерживает подклассы окон. Метод SubclassWindow присоединяет существующее окно к CContainedWindowT объекту и изменяет процедуру CContainedWindowT::WindowProcокна на . Каждый экземпляр CContainedWindowT может подклассить другое окно.

Примечание.

Для любого заданного CContainedWindowT объекта вызовите либоSubclassWindowCreate. В одном объекте не следует вызывать оба метода.

При использовании элемента управления Add на основе параметра в мастере проекта ATL мастер автоматически добавит CContainedWindowT член данных в класс, реализующий элемент управления. В следующем примере показано, как объявлено автономное окно:

public:
   // Declare a contained window data member
   CContainedWindow m_ctlEdit;

   // Initialize the contained window:
   // 1. Pass "Edit" to specify that the contained 
   //    window should be based on the standard 
   //    Windows Edit box
   // 2. Pass 'this' pointer to specify that CAtlEdit 
   //    contains the message map to be used for the 
   //    contained window's message processing
   // 3. Pass the identifier of the message map. '1'
   //    identifies the alternate message map declared
   //    with ALT_MSG_MAP(1)
   CAtlEdit()
      : m_ctlEdit(_T("Edit"), this, 1)
   {
      m_bWindowOnly = TRUE;
   }

 

// Declare the default message map, identified by '0'
BEGIN_MSG_MAP(CAtlEdit)
   MESSAGE_HANDLER(WM_CREATE, OnCreate)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
   CHAIN_MSG_MAP(CComControl<CAtlEdit>)
// Declare an alternate message map, identified by '1'
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_CHAR, OnChar)
END_MSG_MAP()

 

// Define OnCreate handler
// When the containing window receives a WM_CREATE
// message, create the contained window by calling
// CContainedWindow::Create
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
   BOOL& /*bHandled*/)
{
   RECT rc;
   GetWindowRect(&rc);
   rc.right -= rc.left;
   rc.bottom -= rc.top;
   rc.top = rc.left = 0;
   m_ctlEdit.Create(m_hWnd, rc, _T("hello"), WS_CHILD | WS_VISIBLE | 
      ES_MULTILINE | ES_AUTOVSCROLL);
   return 0;
}
Дополнительные сведения См.
Создание элементов управления Учебник по ATL
Использование окон в ATL Классы окон ATL
Мастер проектов ATL Создание проекта ATL
Windows Windows и последующие разделы пакета SDK для Windows

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

TBase

CContainedWindowT

Требования

Заголовок: atlwin.h

CContainedWindowT::CContainedWindowT

Конструктор инициализирует элементы данных.

CContainedWindowT(
    LPTSTR lpszClassName,
    CMessageMap* pObject,
    DWORD dwMsgMapID = 0);

CContainedWindowT(
    CMessageMap* pObject,
    DWORD dwMsgMapID = 0)
    CContainedWindowT();

Параметры

lpszClassName
[in] Имя существующего класса окна, на котором будет основано содержащееся окно.

pObject
[in] Указатель на содержащий объект, объявляющий карту сообщений. Класс этого объекта должен быть производным от CMessageMap.

dwMsgMapID
[in] Определяет карту сообщений, которая будет обрабатывать сообщения в автономном окне. Значение по умолчанию , 0, указывает карту сообщений по умолчанию, объявленную с помощью BEGIN_MSG_MAP. Чтобы использовать альтернативную карту сообщений, объявленную с ALT_MSG_MAP(msgMapID),передайте msgMapID.

Замечания

Если вы хотите создать новое окно с помощью create, необходимо передать имя существующего класса окна для параметра lpszClassName . Пример см. в обзоре CContainedWindow .

Существует три конструктора:

  • Конструктор с тремя аргументами обычно называется.

  • Конструктор с двумя аргументами использует имя класса из TBase::GetWndClassName.

  • Конструктор без аргументов используется, если вы хотите указать аргументы позже. При последующем вызове Createнеобходимо указать имя класса окна, объект карты сообщений и идентификатор карты сообщения.

Если вы подклассуете существующее окно через SubclassWindow, значение lpszClassName не будет использоваться. Таким образом, можно передать значение NULL для этого параметра.

CContainedWindowT::Create

Вызывает RegisterWndSuperclass для регистрации класса окон, основанного на существующем классе, но использует CContainedWindowT::WindowProc.

HWND Create(
    HWND hWndParent,
    _U_RECT rect,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

HWND Create(
    CMessageMap* pObject,
    DWORD dwMsgMapID,
    HWND hWndParent,
    _U_RECT rect,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

HWND Create(
    LPCTSTR lpszClassName,
    CMessageMap* pObject,
    DWORD dwMsgMapID,
    HWND hWndParent,
    _U_RECT rect,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

Параметры

lpszClassName
[in] Имя существующего класса окна, на котором будет основано содержащееся окно.

pObject
[in] Указатель на содержащий объект, объявляющий карту сообщений. Класс этого объекта должен быть производным от CMessageMap.

dwMsgMapID
[in] Определяет карту сообщений, которая будет обрабатывать сообщения в автономном окне. Значение по умолчанию , 0, указывает карту сообщений по умолчанию, объявленную с помощью BEGIN_MSG_MAP. Чтобы использовать альтернативную карту сообщений, объявленную с ALT_MSG_MAP(msgMapID),передайте msgMapID.

hWndParent
[in] Дескриптор родительского или владельца окна.

rect
[in] Структура RECT , указывающая положение окна. Его RECT можно передать по указателю или по ссылке.

szWindowName
[in] Указывает имя окна. Значение по умолчанию — NULL.

dwStyle
[in] Стиль окна. Значение по умолчанию — WS_CHILD | WS_VISIBLE. Список возможных значений см. в статье CreateWindow в пакете SDK для Windows.

dwExStyle
[in] Стиль расширенного окна. Значение по умолчанию равно 0, что означает отсутствие расширенного стиля. Список возможных значений см. в статье CreateWindowEx в пакете SDK для Windows.

MenuOrID
[in] Для дочернего окна идентификатор окна. Для окна верхнего уровня дескриптор меню для окна. Значение по умолчанию — 0U.

lpCreateParam
[in] Указатель на данные создания окна. Полное описание см. в описании окончательного параметра CreateWindowEx.

Возвращаемое значение

В случае успешного выполнения дескриптор в только что созданное окно; в противном случае значение NULL.

Замечания

Существующее имя класса окна сохраняется в m_lpszClassName. Create затем создает окно на основе этого нового класса. Созданное окно автоматически присоединяется к объекту CContainedWindowT .

Примечание.

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

Примечание.

Если значение 0 используется в качестве значения параметра MenuOrID , его необходимо указать как 0U (значение по умолчанию), чтобы избежать ошибки компилятора.

CContainedWindowT::D efWindowProc

Вызывается WindowProc для обработки сообщений, не обработанных картой сообщений.

LRESULT DefWindowProc()
LRESULT DefWindowProc(
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

Параметры

uMsg
[in] Сообщение, отправленное в окно.

wParam
[in] Дополнительные сведения о сообщении.

lParam
[in] Дополнительные сведения о сообщении.

Возвращаемое значение

Результат обработки сообщения.

Замечания

По умолчанию вызывает функцию DefWindowProc CallWindowProc Win32, чтобы отправить сведения о сообщении в процедуру окна, указанную в m_pfnSuperWindowProc.

CContainedWindowT::GetCurrentMessage

Возвращает текущее сообщение (m_pCurrentMsg).

const _ATL_MSG* GetCurrentMessage();

Возвращаемое значение

Текущее сообщение, упаковаемое в структуру MSG .

CContainedWindowT::m_dwMsgMapID

Содержит идентификатор карты сообщений, используемой в настоящее время для автономного окна.

DWORD m_dwMsgMapID;

Замечания

Эта карта сообщений должна быть объявлена в содержаемом объекте.

Карта сообщений по умолчанию, объявленная с BEGIN_MSG_MAP, всегда определяется нулем. Альтернативная карта сообщений, объявленная с ALT_MSG_MAP(msgMapID), определяется по msgMapID.

m_dwMsgMapID сначала инициализирован конструктором и может быть изменен путем вызова SwitchMessageMap. Пример см. в обзоре CContainedWindowT.

CContainedWindowT::m_lpszClassName

Указывает имя существующего класса окна.

LPTSTR m_lpszClassName;

Замечания

При создании окна создание регистрирует новый класс окна, основанный на этом существующем классе, но использует CContainedWindowT::WindowProc.

m_lpszClassName инициализируется конструктором. Пример см. в обзоре CContainedWindowT .

CContainedWindowT::m_pfnSuperWindowProc

Если в автономном окне подклассы, m_pfnSuperWindowProc указывает на исходную процедуру окна класса окна.

WNDPROC m_pfnSuperWindowProc;

Замечания

Если автономное окно суперклассировано, то есть он основан на классе окна, который изменяет существующий класс, m_pfnSuperWindowProc указывает на процедуру окна существующего класса окна.

Метод DefWindowProc отправляет сведения о сообщении в процедуру окна, сохраненную в m_pfnSuperWindowProc.

CContainedWindowT::m_pObject

Указывает на объект, CContainedWindowT содержащий объект.

CMessageMap* m_pObject;

Замечания

Этот контейнер, класс которого должен быть производным от CMessageMap, объявляет карту сообщений, используемую в автономном окне.

m_pObject инициализируется конструктором. Пример см. в обзоре CContainedWindowT .

CContainedWindowT::RegisterWndSuperclass

Вызывается путем создания для регистрации класса окна в автономном окне.

ATOM RegisterWndSuperClass();

Возвращаемое значение

При успешном выполнении атом, который однозначно идентифицирует зарегистрированный класс окна; в противном случае — ноль.

Замечания

Этот класс окна основан на существующем классе, но использует CContainedWindowT::WindowProc. Имя и процедура окна существующего класса окна сохраняются в m_lpszClassName и m_pfnSuperWindowProc соответственно.

CContainedWindowT::SubclassWindow

Подклассы окна, определяемого hWnd , и присоединяет его к объекту CContainedWindowT .

BOOL SubclassWindow(HWND hWnd);

Параметры

hWnd
[in] Дескриптор подкласса окна.

Возвращаемое значение

ЗНАЧЕНИЕ TRUE, если окно успешно подклассировано; в противном случае — ЗНАЧЕНИЕ FALSE.

Замечания

В подклассном окне теперь используется CContainedWindowT::WindowProc. Исходная процедура окна сохраняется в m_pfnSuperWindowProc.

Примечание.

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

CContainedWindowT::SwitchMessageMap

Изменения карты сообщений, которые будут использоваться для обработки сообщений в автономном окне.

void SwitchMessageMap(DWORD dwMsgMapID);

Параметры

dwMsgMapID
[in] Идентификатор карты сообщений. Чтобы использовать карту сообщений по умолчанию, объявленную с BEGIN_MSG_MAP, передайте ноль. Чтобы использовать альтернативную карту сообщений, объявленную с ALT_MSG_MAP(msgMapID),передайте msgMapID.

Замечания

Карта сообщений должна быть определена в содержаемом объекте.

Изначально в конструкторе указывается идентификатор карты сообщений.

CContainedWindowT::UnsubclassWindow

Отсоединяет подклассное окно от CContainedWindowT объекта и восстанавливает исходную процедуру окна, сохраненную в m_pfnSuperWindowProc.

HWND UnsubclassWindow(BOOL bForce = FALSE);

Параметры

bForce
[in] Задайте значение TRUE, чтобы принудительно восстановить исходную процедуру окна, даже если процедура окна для этого CContainedWindowT объекта в настоящее время не активна. Если для этого объекта задано значение FALSE, а процедура окна для этого CContainedWindowT объекта в настоящее время не активна, исходная процедура окна не будет восстановлена.

Возвращаемое значение

Дескриптор окна, который ранее был подклассирован. Если для этого объекта задано значение FALSE, а процедура окна для этого CContainedWindowT объекта сейчас не активна, возвращает значение NULL.

Замечания

Используйте этот метод, только если вы хотите восстановить исходную процедуру окна перед уничтожением окна. В противном случае ОкноProc будет автоматически выполнять это при уничтожении окна.

CContainedWindowT::WindowProc

Этот статический метод реализует процедуру окна.

static LRESULT CALLBACK WindowProc(
    HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

Параметры

hWnd
[in] Дескриптор окна.

uMsg
[in] Сообщение, отправленное в окно.

wParam
[in] Дополнительные сведения о сообщении.

lParam
[in] Дополнительные сведения о сообщении.

Возвращаемое значение

Результат обработки сообщения.

Замечания

WindowProc направляет сообщения на карту сообщений, определяемую m_dwMsgMapID. При необходимости WindowProc вызывает DefWindowProc для дополнительной обработки сообщений.

См. также

Класс CWindow
Класс CWindowImpl
Класс CMessageMap
BEGIN_MSG_MAP
ALT_MSG_MAP(msgMapID)
Общие сведения о классе