Определение интерфейса элемента управления. Добавление свойства

   
На этом шаге мы рассмотрим алгоритм добавления свойств.

   
ControlWizard определяет в элементе управления два диспетчерских интерфейса:
_DOneArmedBandit и _DOneArmedBanditEvent. В первый мы добавим методы и свойства, а во
второй - собьггия. Хотя мы можем сделать это, щелкая правой кнопкой мыши элементы интерфейса и выбирая
соответствующую команду из контекстного меню, лучше все-таки воспользоваться мастером ClassWizard.
Добавление свойства

   
Сейчас мы добавим в класс COneArmedBanditCtrl стандартные свойства ForeColor и BackColor и
специальное свойство NumberOfSymbols.

  • Добавление свойства в ActiveX-элемент.
  • Нажмите CTRL+W, чтобы открыть ClassWizard. Щелкните вкладку Automation.
  • Откройте диалоговое окно Add Property, щелкнув Add Property.
  • Раскройте список External name со стандартными свойствами, поддерживаемыми классом
    COleControl. Укажите в этом списке BackColor.
  • Обратите внимание, что переключатель Stock в группе Implementation выбирается автоматически.
    Диалоговое окно также указывает, что будут созданы функции GetBackColor() и SetBackColor().
    Щелкните ОК, чтобы завершить создание стандартного свойства BackColor и функций Get и Set.


    Рис.1. Создание свойства BackColor

  • Повторите такую же последовательность операций для создания стандартного свойства ForeColor.
  • Чтобы создать специальное свойство, откройте диалоговое окно Add Property и в список External name добавьте имя
    NumberOfSymbols. Обратите внимание, что ClassWizard создаст переменную-член
    m_numberOfSymbols, где будет храниться значение свойства, а также уведомляющую функцию
    OnNumberOfSymboIsChanged(), вызываемую при изменении свойства.
  • В раскрывающемся списке Туре выберите short и щелкните OK, чтобы завершить создание специального свойства.
    Рис.2. Создание специального свойства
  • Щелкните ОК, чтобы закончить создание свойств.

   
Все новые свойства перечислены в ClassView в интерфейсе _DOneArmedBandit. Заметьте, что переменная-член
и уведомляющая функция помещены в класс COneArmedBanditCtrl. Дважды щелкнув функцию
OnNumberOfSymbolsChanged(), Вы просмотрите ее исходя текст в файле OneArmedBanditCtl.cpp. Созданная
по умолчанию версия этой функции просто вызывает COLeControl::SetModifiedFlag().

   
В начале файла OneArmedBanditCtl.cpp Вы найдете такой код:

BEGIN_DISPATCH_MAP(COneArmedBanditCtrl, COleControl)
	//{{AFX_DISPATCH_MAP(COneArmedBanditCtrl)
	DISP_PROPERTY_NOTIFY(COneArmedBanditCtrl, "NumberOfSymbols", 
                            m_numberOfSymbols, OnNumberOfSymbolsChanged, VT_I2)
	DISP_STOCKPROP_BACKCOLOR()
	DISP_STOCKPROP_FORECOLOR()
	//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()

   
Этот код и соответствующий макрос DECLARE_DISPATCH_MAP в заголовочном файле реализуют диспетчерскую карту
(dispatch map) этого класса. Диспетчерская карта очень похожа на карту сообщений. Отличие заключается в том, что вместо
отображения сообщений на функции-обработчики класса она связывает запросы клиента Automation со свойствами и методами класса
элемента управления. Например, когда клиент, написанный на Visual Basic, запрашивает свойство
NumberOfSymbols, элемент управления использует диспетчерскую карту (а точнее, макрос
DISP_PROPERTY_NOTIFY), чтобы узнать значение переменной m_numberOfSymbols и передать его клиенту:

  Dim myobj As OneArmedBandit 
  Set myobj = New OneArmedBandit 
  MsgBox myobj. NumberOfSymbols

   
Как Вы увидите в коде диспетчерской карты, стандартные свойства поддерживаются соответствующими макросами.

   
Текст приложения можно взять здесь (28,5 Кб).

   
На следующем шаге мы рассмотрим постоянство свойств.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий