ActiveX с нуля

         

Добавление свойств пользователя к элементу управления.


К элементу 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 в карте диспетчеризации.

Для отражения состояния выбора и формы элемента управления необходимо к объявлению его класса вручную добавить переменные. В файл MyCtrlCtrl.h добавьте объявления:

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;

}


Содержание раздела