Добавление страницы свойств (учебник ATL, часть 6)
Примечание.
Мастер поставщика OLE DB в ATL недоступен в Visual Studio 2019 и более поздних версиях.
Страницы свойств реализуются в качестве отдельных COM-объектов, которые при необходимости позволяют предоставлять к ним общий доступ. В рамках этой части вы добавите страницу свойств в элемент управления, выполнив следующие задачи:
Создание ресурса страницы свойств
Добавление кода для создания страницы свойств и управления ею.
Добавление страницы свойств в элемент управления
Создание ресурса страницы свойств
Чтобы добавить страницу свойств в свой элемент управления, используйте шаблон страницы свойств ATL.
Добавление страницы свойств
В обозревателе решений щелкните
Polygon
правой кнопкой мыши.В контекстном меню выберите Добавить>Новый элемент.
В списке шаблонов выберитеБиблиотека ATL>Страница свойств ATL и щелкните Добавить.
После открытия мастера страницы свойств ATL введите PolyProp в поле Краткое имя.
Щелкните Строки, чтобы открыть страницу Строки и введите &Polygon в поле Заголовок.
Заголовок страницы свойств представляет собой строку, расположенную на вкладке страницы. Строка документации — это описание, которое фрейм свойства помещает в строку состояния или подсказку. Обратите внимание, что стандартный фрейм свойств в настоящее время не использует эту строку, поэтому вы можете оставить в ней содержимое по умолчанию. На данном этапе вы не будете создавать файл справки, поэтому удалите запись, указанную в этом текстовом поле.
Щелкните Готово и объект страницы свойств будет создан.
Будут созданы следующие три файла:
Файл | Description |
---|---|
PolyProp.h | Содержит класс C++ CPolyProp , который реализует страницу свойств. |
PolyProp.cpp | Включает файл PolyProp.h. |
PolyProp.rgs | Сценарий для реестра, который регистрирует объект страницы свойств. |
Кроме того, в код будут внесены следующие изменения:
В файле Polygon.cpp в карту записи объекта добавляется новая страница свойств.
В файл Polygon.idl добавляется класс
PolyProp
.В ресурс проекта добавляется новый файл сценария для реестра PolyProp.rgs.
В ресурс проекта для страницы свойств добавляется шаблон диалогового окна.
В таблицу строк ресурсов добавляются указанные вами строки свойств.
Теперь добавьте поля, которые должны отображаться на странице свойств.
Добавление полей на страницу свойств
В обозревателе решений дважды щелкните файл ресурсов Polygon.rc. Откроется представление ресурсов.
В представлении ресурсов разверните узел
Dialog
и дважды щелкнитеIDD_POLYPROP
. Обратите внимание, что открывшееся диалоговое окно пустое. В нем находится лишь метка, указывающая, что сюда необходимо вставить элементы управления.Щелкните эту метку и измените ее на значение
Sides:
, изменив текст заголовка в окне свойств.Измените размер поля метки, чтобы оно соответствовало размеру текста.
Перетащите элемент управления "Поле ввода" с панели инструментов, расположенной справа от метки.
Наконец, в окне Свойства измените идентификатор элемента управления "Поле ввода" на
IDC_SIDES
.
На этом процесс создания ресурса страницы свойств завершается.
Добавление кода для создания страницы свойств и управления ею.
Теперь, после создания ресурса страницы свойств, вам нужно написать код реализации.
Сначала включите класс CPolyProp
, чтобы задать количество сторон в вашем объекте при нажатии кнопки Применить.
Изменение функции Apply для установки количества сторон
Замените функцию
Apply
в файле PolyProp.h следующим кодом:STDMETHOD(Apply)(void) { USES_CONVERSION; ATLTRACE(_T("CPolyProp::Apply\n")); for (UINT i = 0; i < m_nObjects; i++) { CComQIPtr<IPolyCtl, &IID_IPolyCtl> pPoly(m_ppUnk[i]); short nSides = (short)GetDlgItemInt(IDC_SIDES); if FAILED(pPoly->put_Sides(nSides)) { CComPtr<IErrorInfo> pError; CComBSTR strError; GetErrorInfo(0, &pError); pError->GetDescription(&strError); MessageBox(OLE2T(strError), _T("Error"), MB_ICONEXCLAMATION); return E_FAIL; } } m_bDirty = FALSE; return S_OK; }
К странице свойств можно подключить несколько клиентов одновременно, поэтому функция Apply
выполняет циклические запросы put_Sides
для каждого клиента со значением, извлеченным из поля редактирования. Вы используете класс CComQIPtr, который выполняет запрос QueryInterface
для каждого объекта, чтобы получить интерфейс IPolyCtl
из интерфейса IUnknown
, который хранится в массиве m_ppUnk
.
Теперь код проверяет, действительно ли выполняется настройка свойства Sides
. Если происходит сбой, код отображает окно сообщения с подробными сведениями об ошибке из интерфейса IErrorInfo
. Как правило, контейнер запрашивает у объекта интерфейс ISupportErrorInfo
и для начала вызывает InterfaceSupportsErrorInfo
, чтобы определить, поддерживает ли объект сведения об ошибках настройки. Этот этап можно пропустить.
CComPtr помогает автоматически обрабатывать подсчет ссылок, поэтому нет необходимости вызывать Release
в интерфейсе. CComBSTR
помогает в обработке BSTR, поэтому вам не нужно выполнять последний вызов SysFreeString
. Кроме того, вы используете один из множества классов преобразования строк, поэтому при необходимости можете преобразовать BSTR (именно поэтому в начале функции находится макрос USES_CONVERSION).
Вам также нужно установить флаг наличия несохраненных изменений на странице свойств, чтобы указать необходимость включения кнопки Применить. Это происходит, когда пользователь изменяет значение в поле редактирования Sides (Стороны).
Обработка кнопки "Применить"
В представлении классов щелкните правой кнопкой мыши
CPolyProp
и выберите Свойства в контекстном меню.В окне Свойства щелкните значок События.
Разверните узел
IDC_SIDES
в списке событий.Выберите
EN_CHANGE
и в раскрывающемся меню справа нажмите кнопку <"Добавить> OnEnChangeSides". Объявление обработчикаOnEnChangeSides
будет добавлено в файл Polyprop.h, а реализация обработчика — в файл Polyprop.cpp.
После этого вам необходимо изменить обработчик.
Изменение метода OnEnChangeSides
В файле Polyprop.cpp добавьте следующий код в метод
OnEnChangeSides
(удалив код, который там поместил мастер):LRESULT CPolyProp::OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { SetDirty(TRUE); return 0; }
OnEnChangeSides
вызывается при отправке сообщения WM_COMMAND
с уведомлением EN_CHANGE
для элемента управления IDC_SIDES
. Затем OnEnChangeSides
вызывает SetDirty
и передает значение TRUE, чтобы указать, что страница свойств теперь является черновиком, а кнопка Применить должна быть включена.
Добавление страницы свойств в элемент управления
Шаблон и мастер страницы свойств ATL не добавляют страницу свойств в элемент управления автоматически, так как в проекте может содержаться несколько элементов управления. Вам нужно будет добавить запись в карту свойств элемента управления.
Добавление страницы свойств
Откройте файл PolyCtl.h и добавьте приведенные ниже строки в карту свойств:
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT) PROP_PAGE(CLSID_PolyProp)
Карта свойств элемента управления должна выглядеть следующим образом:
BEGIN_PROP_MAP(CPolyCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
#ifndef _WIN32_WCE
PROP_ENTRY_TYPE("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage, VT_UI4)
#endif
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT)
PROP_PAGE(CLSID_PolyProp)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
Вы могли бы добавить макрос PROP_PAGE
с CLSID вашей страницы свойств, но при использовании макроса PROP_ENTRY
, как показано выше, значение свойства Sides
также сохраняется при сохранении элемента управления.
К трем параметрам макроса относится описание свойства, DISPID свойства и CLSID страницы свойств, которая содержит свойство. Это удобно если, к примеру, вы загружаете элемент управления в Visual Basic и задаете количество сторон во время разработки. Так как количество сторон сохранено, при перезагрузке проекта Visual Basic оно будет восстановлено.
Сборка и тестирование элемента управления
Теперь выполните сборку этого элемента управления и вставьте его в контейнер для проверки элементов ActiveX. В контейнере для проверки в меню Правка щелкните PolyCtl Class Object (Объект класса PolyCtl). Откроется страница свойств с добавленными сведениями.
Кнопка Применить изначально отключена. Начните вводить значение в поле Sides (Стороны) и кнопка Применить станет активной. После ввода значения нажмите кнопку Применить. Отображение элемента управления изменится и кнопка Применить снова отключится. Попробуйте ввести недопустимое значение. Отобразится окно сообщения с описанием ошибки, которое вы настроили с помощью функции put_Sides
.
После этого необходимо разместить элемент управления на странице.
Вернуться к шагу 5 | На шаге 7