COM. CustomEntity. Палитра свойств. Локализация подсказок

Автор Тема: COM. CustomEntity. Палитра свойств. Локализация подсказок  (Прочитано 7854 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Для Custom Entity реализована палитра свойств, все работает отлично.

Названия свойств локализировал просто (возвращаю нужную строку в GetDisplayName относительно языка AutoCAD).

Вопрос о подскасках. Как можно локализировать подсказки которые выводятся при наведении на поле в палитре? Когда навести выводится строка с *.idl файла helpstring("property PropertyName").

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопрос о подскасках. Как можно локализировать подсказки которые выводятся при наведении на поле в палитре? Когда навести выводится строка с *.idl файла helpstring("property PropertyName").
Увы, но это невозможно. Я задавал такой вопрос в ADN DevHelp год назад и они сообщили, что в данный момент это невозможно. И даже добавили change request (запрос на изменение). Но видимо это задача не слишком приоритетная. Так что пока видимо следует делать несколько COM-wrapper (для каждого из языков локализации), так как подсказка может браться только из helpstring в idl-файле.

А вот если добавить динамическое свойство (как у меня сделано в GeomProps), то можно локализовывать не только название свойства, но и подсказку:

Код - C++ [Выбрать]
  1. // Наименование свойства
  2. STDMETHODIMP CCAreaProps::GetDisplayName (BSTR *pBstrName) {
  3.         if ( pBstrName == NULL )
  4.                 return (E_POINTER) ;
  5.         // TODO: add your code here (and comment the line below)
  6.     *pBstrName =::SysAllocString ((::lcid == 0x0419)?L"Площадь (сумма)":L"Area (total)") ;
  7.  
  8.         return (S_OK) ;
  9. }
  10. // Подсказка свойства
  11. STDMETHODIMP CCAreaProps::GetDescription (BSTR *pBstrName) {
  12.         if ( pBstrName == NULL )
  13.                 return (E_POINTER) ;
  14.         // TODO: add your code here (and comment the line below)
  15.         *pBstrName =::SysAllocString ((::lcid == 0x0419)?
  16.                 L"Суммарная площадь выбранных примитивов":
  17.                 L"Total area of selected entities"
  18.         ) ;
  19.         return (S_OK) ;
  20. }





« Последнее редактирование: 20-07-2016, 22:02:09 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Dziubyna 22-07-2016, 09:47:30

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Опишу как я решил проблему у себя. Может кому пригодится.

*.idl файл
Тут объявил два интерфейса и два класса для двух языков (ru, en) с разными гуидами:

Код - INI [Выбрать]
  1. //- Interface definition
  2.         // ENG
  3.     [
  4.         object,        
  5.         uuid(23FFF105-B579-41CD-9ECB-F39B2D7A2241), // New for 2013
  6.         dual,
  7.         nonextensible,
  8.         helpstring("ITraceCOMObjEng Interface"),
  9.         pointer_default(unique)
  10.     ]
  11.     interface ITraceCOMObjEng : IAcadEntity     {
  12.         [propget, id(1), helpstring("Name of trace")] HRESULT TraceName([out, retval] BSTR* pVal);
  13.         [propput, id(1), helpstring("Name of trace")] HRESULT TraceName([in] BSTR newVal);
  14.         .....
  15.     };
  16.     //- Library section of interface ITraceCOMObjEng
  17.     [        
  18.         uuid(06F84F9F-51D4-45A3-939E-C9E3827221E9), // New for 2013
  19.         helpstring("TraceCOMObjEng Class")
  20.     ]
  21.     coclass TraceCOMObjEng
  22.     {
  23.         [default] interface ITraceCOMObjEng;
  24.         [source] interface IAcadObjectEvents;
  25.     };
  26.  
  27.  //---------------------------------------------------------------------------
  28.         //- Interface definition
  29.         // RUS
  30.         [
  31.                 object,
  32.                 uuid(6D95A6D8-DC71-4754-BB91-19D356DEEE39), // New for 2013
  33.                 dual,
  34.                 nonextensible,
  35.                 helpstring("ITraceCOMObjRus Interface"),
  36.                 pointer_default(unique)
  37.         ]
  38.         interface ITraceCOMObjRus : IAcadEntity {
  39.                 [propget, id(1), helpstring("Наименование трассы")] HRESULT TraceName([out, retval] BSTR* pVal);
  40.                 [propput, id(1), helpstring("Наименование трассы")] HRESULT TraceName([in] BSTR newVal);
  41.                 ....
  42.         };
  43. //- Library section of interface ITraceCOMObjRus
  44.         [
  45.                 uuid(3F390E44-9DBF-476F-BB57-947DBAD53498), // New for 2013
  46.                 helpstring("TraceCOMObjRus Class")
  47.         ]
  48.         coclass TraceCOMObjRus
  49.         {
  50.                 [default] interface ITraceCOMObjRus;
  51.                 [source] interface IAcadObjectEvents;
  52.         };
  53.  

*.rgs файл
Зарегистрировал эти два COM объекты:

Код - Microsoft Registry [Выбрать]
  1. HKCR
  2. {
  3.         UnisTraceDBX.TraceCOMObjEng.1 = s 'TraceCOMObjEng Class'
  4.         {
  5.                 CLSID = s '{06F84F9F-51D4-45A3-939E-C9E3827221E9}'
  6.         }
  7.         UnisTraceDBX.TraceCOMObjEng = s 'TraceCOMObjEng Class'
  8.         {
  9.                 CLSID = s '{06F84F9F-51D4-45A3-939E-C9E3827221E9}'
  10.                 CurVer = s 'UnisTraceDBX.TraceCOMObjEng.1'
  11.         }
  12.         NoRemove CLSID
  13.         {
  14.                 ForceRemove {06F84F9F-51D4-45A3-939E-C9E3827221E9} = s 'TraceCOMObjEng Class'
  15.                 {
  16.                         ProgID = s 'UnisTraceDBX.TraceCOMObjEng.1'
  17.                         VersionIndependentProgID = s 'UnisTraceDBX.TraceCOMObjEng'
  18.                         ForceRemove 'Programmable'
  19.                         InprocServer32 = s '%MODULE%'
  20.                         {
  21.                                 val ThreadingModel = s 'Apartment'
  22.                         }
  23.                         val AppID = s '%APPID%'
  24.                         'TypeLib' = s '{33FDA779-B116-418C-89A2-198962137723}'
  25.                 }
  26.         }
  27.  
  28.         UnisTraceDBX.TraceCOMObjRus.1 = s 'TraceCOMObjRus Class'
  29.         {
  30.                 CLSID = s '{3F390E44-9DBF-476F-BB57-947DBAD53498}'
  31.         }
  32.         UnisTraceDBX.TraceCOMObjRus = s 'TraceCOMObjRus Class'
  33.         {
  34.                 CLSID = s '{3F390E44-9DBF-476F-BB57-947DBAD53498}'
  35.                 CurVer = s 'UnisTraceDBX.TraceCOMObjRus.1'
  36.         }
  37.         NoRemove CLSID
  38.         {
  39.                 ForceRemove {3F390E44-9DBF-476F-BB57-947DBAD53498} = s 'TraceCOMObjRus Class'
  40.                 {
  41.                         ProgID = s 'UnisTraceDBX.TraceCOMObjRus.1'
  42.                         VersionIndependentProgID = s 'UnisTraceDBX.TraceCOMObjRus'
  43.                         ForceRemove 'Programmable'
  44.                         InprocServer32 = s '%MODULE%'
  45.                         {
  46.                                 val ThreadingModel = s 'Apartment'
  47.                         }
  48.                         val AppID = s '%APPID%'
  49.                         'TypeLib' = s '{33FDA779-B116-418C-89A2-198962137723}'
  50.                 }
  51.         }
  52. }

Кода не много, и он простой, главное не напутать с гуидами. Но вот сам код COM-класса большой, у меня много проперти неохотно дублировать логики работы с ними.

*.h файл COM-класа

Код - C++ [Выбрать]
  1. // Шаблонный класс палитры свойств для локализации
  2. template <class ClassType, class InterfaceType, const CLSID* CLSIDtype, const IID* IIDtype>
  3. class ATL_NO_VTABLE CTraceCOMObj
  4. : public CComObjectRootEx<CComSingleThreadModel>,
  5.         public CComCoClass<ClassType, CLSIDtype>,
  6.         public IAcPiCategorizeProperties,
  7.         public IOPMPropertyExtensionImpl<ClassType>,
  8.         public ISupportErrorInfo,
  9.         public IAcadEntityDispatchImpl<ClassType, CLSIDtype, InterfaceType, IIDtype, &LIBID_UnisTraceDBXLib>
  10. #ifdef NEVER   
  11.         , public IDispatchImpl<IProfileCOMObjEng, &IID, &LIBID_UnisProfileDBXLib>
  12. #endif
  13. {
  14. ...
  15. /// всю логику работы с палитрой пишем здесь
  16. ...
  17. };
  18.  
  19. //////////////////////////////////////////////////////////////////////////
  20. // Оглавление двух классов пустышек для разных локализаций
  21. //////////////////////////////////////////////////////////////////////////
  22. // Класс палитры свойств трассы для английского языка
  23. class ATL_NO_VTABLE CTraceCOMObjEng : public CTraceCOMObj<CTraceCOMObjEng, ITraceCOMObjEng, &CLSID_TraceCOMObjEng, &IID_ITraceCOMObjEng>{};
  24. OBJECT_ENTRY_AUTO(__uuidof(TraceCOMObjEng), CTraceCOMObjEng)
  25. // Класс палитры свойств трассы для русского языка
  26. class ATL_NO_VTABLE CTraceCOMObjRus : public CTraceCOMObj<CTraceCOMObjRus, ITraceCOMObjRus, &CLSID_TraceCOMObjRus, &IID_ITraceCOMObjRus>{};
  27. OBJECT_ENTRY_AUTO(__uuidof(TraceCOMObjRus), CTraceCOMObjRus)
  28.  

Ну вот и все. Локализированные подсказки конечно пишем в *.idl файле.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Это конечно выход из положения, но если понадобится добавить еще и немецкий, французкий, чешский, польский... это будет жуть...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Будет много интерфейсов и регистраций :( :( но хотя бы не нужно будем менять кода COM-класса. Конечно хотелось бы такой же метод как GetDisplayName. Пока так выкрутился

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Конечно хотелось бы такой же метод как GetDisplayName.
Для динамики - это как раз GetDescription. Почему его не сделали для статики - для меня загадка.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение