Добавление свойств пользователя к элементу управления.
К элементу ActiveX можно добавить свойства двух видов: базовые и пользовательские. Базовые свойства уже предусмотрены в базовом классе COleControl.
Добавим к элементу управления два пользовательских свойства: Shape – вид отображаемой в элементе фигуры, Selected – определяет состояние элемента ( включен/выключен).
Для добавления свойства Shape необходимо выполнить следующие действия:
1.
Выберите в меню View пункт ClassWizard.
2. Выберите в открывшемся диалоге закладку Automation.
3. В выпадающем списке Class Name выберите класс CmyCtrlCtrl (рис. 8).
4. Щелкните кнопку Add Property. Появится диалог Add Property (рис. 9).
5. Введите имя свойства Shape в поле External Name, установите тип свойства short, выберите переключатель Get/Set methods для того, чтобы это свойство было доступным для управления из контейнера.
6.
Для добавления свойства Selected надо выполнить почти аналогичные действия. Отличия заключаются в том, что тип свойства – BOOL, и в том, что сделаем это свойство недоступным для изменения извне, то есть уберем метод set. Для отмены метода set просто удалите имя функции set в поле Set function. Тогда свойство становится доступным только для чтения.
7. При выходе из окна мастера ClassWizard c помощью щелчков на кнопках OK генерируются три новые функции в классе элемента управления:
short CMCtrlCtrl::GetShape();
void CMCtrlCtrl::SetShape(short nNewValue);
BOOL CMCtrlCtrl::GetSelected();
Обратите внимание на изменение текста в файле CMyCtrlCtrl.cpp. В карте диспетчеризации (если Вы не знаете, что это такое, не пугайтесь – после общего знакомства с процессом создания элемента ActiveX мы рассмотрим тексты файлов более подробно) появились дополнительные строчки:
BEGIN_DISPATCH_MAP(CMyCtrlCtrl, COleControl)
//{{AFX_DISPATCH_MAP(CMyCtrlCtrl)
DISP_PROPERTY_EX(CMyCtrlCtrl, "Shape", GetShape, SetShape, VT_I2)
DISP_PROPERTY_EX(CMyCtrlCtrl, "Selected", GetSelected, SetNotSupported, VT_BOOL)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(CMyCtrlCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
Каждое добавленное свойство приводит к появлению нового макроса DISP_PROPERTY_EX в карте диспетчеризации.
BOOL m_bSelected;
short m_nShape;
Эти переменные надо инициализировать разумными значениями в конструкторе класса CMyCtrlCtrl:
m_bSelected = FALSE;
m_nShape = 0;
А теперь изменим добавленные мастером функции Get/Set:
short CMyCtrlCtrl::GetShape()
{
return m_nShape;
}
void CMyCtrlCtrl::SetShape(short nNewValue)
{
m_nShape = nNewValue;
SetModifiedFlag();
InvalidateControl();
}
BOOL CMyCtrlCtrl::GetSelected()
{
return m_bSelected;
}