Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все по ФБ (VS6).doc
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
210 Кб
Скачать
☆
  1. Создание ActiveX контрола

    • С пом wizard создать New ATL object -> controls -> Full control.

    • Подключить файл #include "IVisualControlImpl.h"

    • В список наследования добавить public IVisualControlImpl<ИмяКлассаКонтрола>

    • В список интерфейсов добавить макрос VISUAL_CONTROL_ENTRY

    • Обеспечить персистентность данных, отвечающих за связь, с помощью функций LoadFBData (pStream) и SaveFBData (pStream). Это можно сделать автоматически, вставив в декларацию класса макрос VISUAL_CONTROL_STANDARD_LOAD_SAVE(ИмяКлассаКонтрола) (в классе также должен быть указан раздел BEGIN_PROP_MAP).

    • Если в списке наследования есть класс IPerPropertyBrowsingImpl<ControlClass>, заменить его на IPerPropertyBrowsingImplFixed<ControlClass>.

    • Поскольку контрол реализует два dual-интерфейса, необходимо разрешить неоднозначность, возникающую для декларации в COM MAP интерфейса IDispatch. Это можно сделать, заменив вводящий его макрос COM_INTERFACE_ENTRY(IDispatch) на макрос COM_INTERFACE_ENTRY2, наподобие следующего:

    • COM_INTERFACE_ENTRY2(IDispatch, INewControl)

    • Доступ к переменным, как и в ФБ (последние два пункта).

  1. Чтобы создать свойства нужно:

  1. создать страницу свойств: New ATL Object - Property Page

  2. в BEGIN_PROP_MAP //контрола

PROP_PAGE(CLSID_ИмяСтрСвойств) // вписать (без «С»)

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

  2. в

BEGIN_PROP_MAP

PROP_ENTRY(«Описание», N, CLSID_ИмяСтрСвойств)

N взять из интерфейса, там где id(N)

  1. В контроле описать переменную того же типа (напр int X) и заполнить функции

…get…

{ *pVal = X;}

и

…put…

{X = pVal;}

  1. В OnInitDialog (который надо добавить через Add Windows Message Handler для WM_INITDIALOG)

CComQIPtr<ИмяИнтерфейса>pEx(m_ppUnk[0]); //pEx – любое имя

ASSERT(pEx)

If (!pEx) return 1;

Завести переменную типа свойства

int X

вызвать pEx->…get…(&X)

в конце вызвать SetDirty(FALSE)

  1. в Apply()

сначала

If (!pEx) return 1;

Завести переменную типа свойства

int X

вызвать pEx->…get…(&X)

потом pEx->put…

8. Добавить функции, которые реагируют на изменения в стр всойств. На классе РР сделать Add WM Handler, выбрать нужный элемент управления, слева выбрать сообщение, добавить функцию. В добавленной функции сделать SetDirty(TRUE), в put-ах вызвать FireViewChange(), если MASTERGraph не перерисовывает автоматически.

Замечание: не стоит разделять функциональность между ФБ и контролом, так как мнемосхемы могут открываться и закрываться в runtime, при этом контролы будут создаваться и уничтожаться. Также, если необходимо использовать информацию о предыдущих состояниях, не следует хранить ее в контроле.