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

20/05/2020

Как задать в всплывающих подсказках жирный шрифт?

Вопрос: Недавно на форуме мне задали вопрос о том как можно управлять шрифтом в окне всплывающих подсказок при наведении курсора на примитив?

Ответ: Я начал исследование с этой статьи: https://adndevblog.typepad.com/autocad/2013/03/formatting-in-rollover-tip.html

При анализе её вскрылись некоторые интересные моменты. AutoCAD использует WPF (а точнее XAML) для показа таких всплывающих подсказок. В тексте подсказок можно использовать встроенные теги: <Bold> (для жирного шрифта), <Italic> (для наклонного шрифта), <Underline> (подчеркнутый шрифт) и <Hyperlink> (гиперссылка). Но не всё так просто. AutoCAD использует конструкцию вида:

<TextBlock TextWrapping="Wrap"><![CDATA[текст подсказки]]></TextBlock>

Всё что внутри <![CDATA[]]>интерпретируется как обычный текст и встроенные теги игнорируются. Поэтому требуется некоторая хитрость. А именно, сначала мы закрываем тег <![CDATA[]]>, а затем уже применяем встроенные теги для управления форматом шрифта. В реакторе AcEdInputPointMonitor / AcEdInputPointFilter это будет выглядеть приблизительно так:

Код - C++: [Выделить]
  1. Acad::ErrorStatus ToolTipsFilter::processInputPoint(const AcEdInputPoint& input,
  2.   AcEdInputPointFilterResult& output) {
  3.  
  4.   if (input.pickedEntities().length() > 0) {
  5.     output.setNewTooltipString(
  6.       L"]]>" // <----- Обязательное начало
  7.       L"Обычный текст"
  8.       L"<LineBreak/>"
  9.       L"<Bold>Жирный текст</Bold>"
  10.       L"<LineBreak/>"
  11.       L"<Italic>Наклонный текст</Italic>"
  12.       L"<LineBreak/>"
  13.       L"<Underline>Подчеркнутый текст</Underline>"
  14.       L"<LineBreak/>"
  15.       L"<Underline><Italic>Подчеркнутый наклонный текст</Italic></Underline>"
  16.       L"<LineBreak/>"
  17.       L"<Bold><Italic>Жирный наклонный текст</Italic></Bold>"
  18.       L"<LineBreak/>"
  19.       L"<Bold><Underline><Italic>Жирный подчеркнутый наклонный текст</Italic></Underline></Bold>"
  20.       L"<LineBreak/>"
  21.       L"<Hyperlink NavigateUri = \"https://adn-cis.org\">"
  22.       L"Гиперсылка"
  23.       L"</Hyperlink>"
  24.       L"<![CDATA[" // <----- Обязательный конец
  25.       );
  26.   }
  27.   else output.setNewTooltipString(L"");
  28.   return (Acad::eOk);
  29. }

Аналогично можно сделать и в .NET в PointMonitor и в PointFilter.

И результат будет таким:

 

Автор: Александр Ривилис
Опубликовано 20.05.2020