Показ локализованных имён свойств с использованием Не-COM системы свойств
Если вы уже начали использовать Не-COM систему свойств в AutoCAD, пожалуйста, посмотрите эту презентацию (DevTV) моего коллеги, Adam Nagy. В этой статье мы рассмотрим изменения, которые потребуются для показа локализованных имён с использованием Не-COM системы свойств.
1) Первый шаг заключается в обеспечении того, что строки выбираются из таблицы строк. Чтобы связать идентификатор строки со свойством, создаём экземпляр класса "AcRxLocalizedNameAttribute" и добавляем его в коллекцию свойств. Это может быть сделано в конструкторе свойства.
- MyDoubleProperty::MyDoubleProperty() :
- AcRxProperty(_T("My Double Property"),
- AcRxValueType::Desc<double>::value())
- {
- // ...
- AcRxLocalizedNameAttribute *pAttrib
- = new AcRxLocalizedNameAttribute(IDS_MYDOUBLE_PROPERTY);
- attributes().add(pAttrib);
- }
2) Реализуем класс, производный от AcRxResourceLoader и переопредем метод subLoadString. Убедимся, что реализация этого метода возвращает локализованную строку, соответствующую ID передающегося в качестве параметра.
- // Наш класс загрузки ресуросов
- class MyResourceLoader : public AcRxResourceLoader
- {
- // Возвращаем строку извлекаемую из таблицы строк
- virtual Acad::ErrorStatus subLoadString
- (
- unsigned int id,
- unsigned int sourceHint,
- AcString& result
- )
- {
- if (sourceHint)
- return AcRxResourceLoader::loadString
- (
- AcRxObject::desc(),
- id,
- sourceHint,
- result
- );
- const int size = 1024;
- ACHAR buf[size];
- int ret = ::LoadString(_hdllInstance, id, buf, size);
- if (ret==0)
- return Acad::eKeyNotFound;
- ASSERT(ret!=size-1);
- result = buf;
- return Acad::eOk;
- }
- };
3) Создаём глобальный экземпляр класса загрузчика ресурсов, созданного на шаге 2.
- // Создаём глобальный экземпляр нашего загрузчика ресурсов
- MyResourceLoader _mrl;
4) Добавим глобальный экземпляр класса загрузчика ресурсов, созданного на шаге 3, как объект протокола расширения к классу AcRxClass свойства. Лучшее место для этого – метод On_kInitAppMsg нашего приложения.
- virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt)
- {
- AcRx::AppRetCode retCode
- = AcRxArxApp::On_kInitAppMsg (pkt);
- // Добавим глобальный экземпляр класса загрузчика ресрсов
- // как объект протокола расширения к объекту AcRxClass
- // свойства.
- MyDoubleProperty::desc()->addX
- (
- AcRxResourceLoader::desc(),
- &_mrl
- );
- return (retCode) ;
- }
У нас теперь есть всё для того, чтобы показывать локализованное имя свойства.
Это пример проекта с указанными изменениями. Данный проект не создаёт ресурсные DLL-файлы и если не знаете как их сделать – обратитесь к документации: http://support.microsoft.com/kb/198846
Обсуждение: http://adn-cis.org/forum/index.php?topic=65.0
Отредактировано 08.06.2013 в 00:44:03