Шаг 214.
Среда программирования Visual C++.
Создание ActiveX-элементов средствами ATL. Создание страницы свойств
На этом шаге мы рассмотрим алгоритм создания страницы свойств.
Теперь напишем код страницы свойств Symbols, позволяющей пользователям задавать значение специального
свойства NumberOfSymbols. ATL создает каждую страницу свойств элемента управления как отдельный
объект класса, производного от IPropertyPage. Добавим в свой проект новый класс страницы свойств.
- Создание страницы свойств Symbols.
- В меню Insert выберите команду New ATL Object. В списке Category укажите Controls.
- В списке Objects выберите пункт Property page и щелкните Next.
Рис.1. Добавление страницы свойств
- Выберите вкладку Names. В поле Short Name введите BanditPP.
- На вкладке Strings в поле Title введите имя Symbols. Текст остальных двух полей удалите.
Рис.2. Вкладка Strings
- Щелкните ОК, чтобы добавить страницу свойств. В редакторе диалогов откроется шаблон диалога для этой страницы.
- Создайте шаблон диалога так же, как Вы это делали для MFC-элемента управления. Добавьте статический
текст и поле ввода с идентификатором IDC_NUMSYMBOLS.
Рис.3. Вид страницы свойств
Вернувшись в ClassView, Вы заметите, что в проекте появился новый класс CBanditPP. Кроме того, мастер
ATL Object Wizard создал для этого класса тело функции IPropertyPageImpl::Apply(). Она вызывается, когда пользователь
страницы свойств щелкает кнопку ОК или Apply. Сейчас мы напишем код этой функции.
- Реализация функции CBanditPP::Apply().
Найдите тело функции CBanditPP::Apply() в файле BanditPP.h. Замените шаблонный код следующим текстом:
STDMETHOD(Apply)(void)
{
CComQIPtr<IATLBandit> pIBandit(m_ppUnk[0]);
pIBandit->put_NumberOfSymbols(GetDlgItemInt(IDC_NUMSYMBOLS));
m_bDirty = FALSE;
return S_OK;
}
Эта функция присваивает свойству NumberOfProperties целочисленное значение, полученное из поля ввода.
Обратите внимание на использование ATL-класса интеллектуального указателя CComQIPtr для получения указателя на
IATLBandit. Переменная-член m_ppUnk является массивом указателей IUnknown на объекты,
связанные со страницей свойств.
Функция Аррlу() сохраняет значение из поля ввода в постоянном свойстве IATLBandit::NumberOfSymbols. Кроме того,
нам придется написать функцию, инициализирующую поле ввода текущим значением свойства. По сути, эта функция
противоположна Аррlу().
- Реализация функции CBanditPP::OnInitDialog().
- В ClassWizard щелкните правой кнопкой мыши класс CBanditPP и в контекстном меню выберите
Add Windows Message Handler.
- В списке New Windows messages/events выберите сообщение WM_INITDIALOG.
Рис.4. Создание функции CBanditPP::OnInitDialog()
- Щелкните Add and Edit, чтобы добавить функцию OnInitDialog() и перейти к редактированию ее кода.
- Напишите тело функции, как показано ниже:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled)
{
CComQIPtr<IATLBandit> pIBandit(m_ppUnk[0]);
short i = 0;
pIBandit->get_NumberOfSymbols(&i);
SetDlgItemInt(IDC_NUMSYMBOLS, i);
return 0;
}
На этом этапе Вам также надо добавить функцию, уведомляющую об изменении страницы свойств. Она должна обрабатывать событие
EN_CHANGE, генерируемое при изменении пользователем значения в поле ввода.
- Реализация функции CBanditPP::OnChangeNumsymbols().
- В ClassWizard щелкните правой кнопкой мыши класс CBanditPP и в открывшемся меню выберите
Add Windows Message Handler.
- В списке Class or object to handle щелкните объект IDC_NUMSYMBOLS.
- В списке New Windows messages/events выберите событие EN_CHANGE.
Рис.5. Добавление функции CBanditPP::OnChangeNumsymbols()
- Щелкните Add and Edit и затем - OK, чтобы добавить функцию OnChangeNumsymbols()
и перейти к редактированию ее кода.
- Замените строчку с комментарием // TODO следующим текстом:
Теперь, после реализации страницы свойств, мы готовы перейти к созданию записей в карте свойств класса элемента управления,
чтобы сделать свойство NumberOfSymbols постоянным.
- Реализация постоянства свойства NumberOfSymbols.
- Найдите карту свойств в файле ATLBandit.h.
- Добавьте новую запись в свойстве NumberOfSymbols так, чтобы карта свойств имела следующий вид:
BEGIN_PROP_MAP(CATLBandit)
PROP_DATA_ENTRY("_cx", m_sizeExtent.ex, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
PROP_ENTRY("NumberOfSymbols", 1, CLSID_BanditPP)
PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)
PROP_ENTRY("ForeColor", DISPID_FORECOLOR, CLSID_StockColorPage)
END_PROP_MAP()
Второй параметр в макросе PROP_ENTRY - идентификатор DISPID, который находится в IDL-файле.
Константа CLSID_BanditPP определена в файле OneArmedBanditATL_i.c.
Текст приложения можно взять здесь (39,0 Кб).
На следующем шаге мы рассмотрим отображение элемента управления.
Предыдущий шаг
Содержание
Следующий шаг