ADN Open CIS
Сообщество программистов Autodesk в СНГ

29/05/2013

Показ локализованных имён свойств с использованием Не-COM системы свойств

Если вы уже начали использовать Не-COM систему свойств в AutoCAD, пожалуйста, посмотрите эту презентацию (DevTV) моего коллеги, Adam Nagy. В этой статье мы рассмотрим изменения, которые потребуются для показа локализованных имён с использованием Не-COM системы свойств.

1) Первый шаг заключается в обеспечении того, что строки выбираются из таблицы строк. Чтобы связать идентификатор строки со свойством, создаём экземпляр класса "AcRxLocalizedNameAttribute" и добавляем его в коллекцию свойств. Это может быть сделано в конструкторе свойства.

Код - C++: [Выделить]
  1. MyDoubleProperty::MyDoubleProperty() :
  2.     AcRxProperty(_T("My Double Property"),
  3.     AcRxValueType::Desc<double>::value())
  4. {
  5.     // ...
  6.  
  7.     AcRxLocalizedNameAttribute *pAttrib
  8.             = new AcRxLocalizedNameAttribute(IDS_MYDOUBLE_PROPERTY);
  9.     attributes().add(pAttrib);
  10. }

2) Реализуем класс, производный от AcRxResourceLoader и переопредем метод subLoadString. Убедимся, что реализация этого метода возвращает локализованную строку, соответствующую ID передающегося в качестве параметра.

Код - C++: [Выделить]
  1. // Наш класс загрузки ресуросов
  2. class MyResourceLoader : public AcRxResourceLoader
  3. {
  4.     // Возвращаем строку извлекаемую из таблицы строк
  5.     virtual Acad::ErrorStatus subLoadString
  6.                                 (
  7.                                     unsigned int id,
  8.                                     unsigned int sourceHint,
  9.                                     AcString& result
  10.                                 )
  11.     {
  12.         if (sourceHint)
  13.             return AcRxResourceLoader::loadString
  14.                                     (
  15.                                         AcRxObject::desc(),
  16.                                         id,
  17.                                         sourceHint,
  18.                                         result
  19.                                     );
  20.         const int size = 1024;
  21.         ACHAR buf[size];
  22.         int ret = ::LoadString(_hdllInstance, id, buf, size);
  23.  
  24.         if (ret==0)
  25.             return Acad::eKeyNotFound;
  26.  
  27.         ASSERT(ret!=size-1);
  28.         result = buf;
  29.         return Acad::eOk;
  30.     }
  31. };

3) Создаём глобальный экземпляр класса загрузчика ресурсов, созданного на шаге 2.

Код - C++: [Выделить]
  1. // Создаём глобальный экземпляр нашего загрузчика ресурсов
  2. MyResourceLoader _mrl;

4) Добавим глобальный экземпляр класса загрузчика ресурсов, созданного на шаге 3, как объект протокола расширения к классу AcRxClass свойства. Лучшее место для этого – метод On_kInitAppMsg нашего приложения.

Код - C++: [Выделить]
  1. virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt)
  2. {
  3.     AcRx::AppRetCode retCode
  4.                 = AcRxArxApp::On_kInitAppMsg (pkt);
  5.  
  6.     // Добавим глобальный экземпляр класса загрузчика ресрсов
  7.     // как объект протокола расширения к объекту AcRxClass
  8.     // свойства.
  9.     MyDoubleProperty::desc()->addX
  10.                                 (
  11.                                     AcRxResourceLoader::desc(),
  12.                                     &_mrl
  13.                                 );
  14.  
  15.     return (retCode) ;
  16. }

У нас теперь есть всё для того, чтобы показывать локализованное имя свойства.

Это пример проекта с указанными изменениями. Данный проект не создаёт ресурсные DLL-файлы и если не знаете как их сделать – обратитесь к документации: http://support.microsoft.com/kb/198846

Источник: http://adndevblog.typepad.com/autocad/2012/04/displaying-localized-property-name-using-non-com-property-system.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=65.0

Опубликовано 29.05.2013
Отредактировано 08.06.2013 в 00:44:03