Создание ActiveX, перечисляемое свойство (типа enum)
От: _PRIZRAK_  
Дата: 11.12.06 10:24
Оценка:
Здравствуйте.

Создаю ActiveX-элемент. Необходимо добавить в компонент перечисляемое свойство (типа enum), т.е. такое свойство, которое в окне свойств компонента выглядело бы как выпадающий список.

Здесь описано, как это сделать в ATL. Мне же нужно реализовать в MFC. Не соображу, как это провернуть. Мастер («ClassWizard->Automation->Add Property») предлагает выбрать тип из списка. Как добавить свой тип – не понятно? Делаю в Visual Studio 6.0.

Подскажите, пожалуйста.
Re: Создание ActiveX, перечисляемое свойство (типа enum)
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.12.06 07:10
Оценка:
Здравствуйте, _PRIZRAK_, Вы писали:

_PR>Создаю ActiveX-элемент. Необходимо добавить в компонент перечисляемое свойство (типа enum), т.е. такое свойство, которое в окне свойств компонента выглядело бы как выпадающий список.


_PR>Здесь описано, как это сделать в ATL. Мне же нужно реализовать в MFC. Не соображу, как это провернуть. Мастер («ClassWizard->Automation->Add Property») предлагает выбрать тип из списка. Как добавить свой тип – не понятно? Делаю в Visual Studio 6.0.


Можно воспользоваться, наверное, той же техникой, что и в lessons, а именно: задать произвольный тип на месте предполагаемого enum-а, а псоле создания метода/свойства руками исправить тот произвольный тип на enum (в idl, h и cpp файлах). Добавив, естественно, этот enum вначало idl файла.

Можно также обратиться на форум MFC — может там кто подскажет более комфортный способ, а мы тут не сильно избалованы Визардами.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Создание ActiveX, перечисляемое свойство (типа enum)
От: _PRIZRAK_  
Дата: 14.12.06 01:11
Оценка:
Разобрался!

Вот это помогло. Не уверен, что всё правильно делаю. Тем не менее всё работает.

Расскажу как делал.

1. Пусть для примера мы создали новый компонент под названием "EnumPropCntrl".

2. Добавляем в компонент с помощью мастера (или без него) свойство типа short. Назовём наше свойство "MyProp", а переменную — "m_MyProp".

3. Как обычно, пишем код
void CEnumPropCntrlCtrl::DoPropExchange(CPropExchange* pPX)
{
    ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    COleControl::DoPropExchange(pPX);

    PX_Short(pPX, "MyProp", m_MyProp, 0);
}
Конечно, вместо нуля должна быть константа, но для примера пусть будет так.

4. Открываем файл с расширение odl и после строк
importlib(STDOLE_TLB);
importlib(STDTYPE_TLB);
пишем что-нибудь вроде этого
    [
        uuid(C5F2743B-8E85-4423-BCC7-9576559A601B), 
        version(1.0)
    ]
    typedef enum tagTMyProp 
    {
        mpValue0, 
        mpValue1, 
        mpValue2
    } TMyProp;
Затем в том же файле строчку
[id(1)] short MyProp;
заменяем на
[id(1)] TMyProp MyProp;

Вот и всё! Теперь разместив где-нибудь наш компонент, мы обнаружим у него свойство "MyProp". Значение "MyProp" будет задаваться путем выбора из выпадающего списка.



Vi2, спасибо за подсказки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.