Здравствуйте.
Создаю ActiveX-элемент. Необходимо добавить в компонент перечисляемое свойство (типа
enum), т.е. такое свойство, которое в окне свойств компонента выглядело бы как выпадающий список.
Здесь описано, как это сделать в ATL. Мне же нужно реализовать в MFC. Не соображу, как это провернуть. Мастер («ClassWizard->Automation->Add Property») предлагает выбрать тип из списка. Как добавить свой тип – не понятно? Делаю в Visual Studio 6.0.
Подскажите, пожалуйста.
Здравствуйте, _PRIZRAK_, Вы писали:
_PR>Создаю ActiveX-элемент. Необходимо добавить в компонент перечисляемое свойство (типа enum), т.е. такое свойство, которое в окне свойств компонента выглядело бы как выпадающий список.
_PR>Здесь описано, как это сделать в ATL. Мне же нужно реализовать в MFC. Не соображу, как это провернуть. Мастер («ClassWizard->Automation->Add Property») предлагает выбрать тип из списка. Как добавить свой тип – не понятно? Делаю в Visual Studio 6.0.
Можно воспользоваться, наверное, той же техникой, что и в lessons, а именно: задать произвольный тип на месте предполагаемого enum-а, а псоле создания метода/свойства руками исправить тот произвольный тип на enum (в idl, h и cpp файлах). Добавив, естественно, этот enum вначало idl файла.
Можно также обратиться на форум MFC — может там кто подскажет более комфортный способ, а мы тут не сильно избалованы Визардами.
Разобрался!
Вот это помогло. Не уверен, что всё правильно делаю. Тем не менее всё работает.
Расскажу как делал.
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, спасибо за подсказки.