Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 1
Регистрация: 25.09.2013
Сообщений: 47

GlyphRun и FontFamily

18.09.2019, 11:22. Показов 2832. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Может кто подсказать или направить в нужном направлении - WPF через GlyphRun пытаюсь отрисовать символ, если это русские или английские символы то норм, если взять корейский символ, то рисуется квадратик, так как в текущем FontFamily нет такого символа, как, например решается это задача в текстовых редакторах, в той же visual studio или NotePad++, там какой символ не вставь - любой отображается нормально, даже если взять обычный контрол TextBlock - там тож че не всавь, все отрисуется вне зависимости текущего FontFamily?

Рисую так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 ushort[] glyphIndexes = new ushort[text.Length];
            double[] advanceWidths = new double[text.Length];
 
            if (_cachedTypeface == null)
            {
                var t = CreateTypeface();
                if (!t.TryGetGlyphTypeface(out _cachedTypeface))
                    throw new NotSupportedException();
            }
 
            double totalWidth = 0;
            for (int n = 0; n < text.Length; n++)
            {
                ushort glyphIndex;
                _cachedTypeface.CharacterToGlyphMap.TryGetValue(text[n], out glyphIndex);
                glyphIndexes[n] = glyphIndex;
                double width = _cachedTypeface.AdvanceWidths[glyphIndex] * FontSize;
                advanceWidths[n] = width;
                totalWidth += width;
            }
 
            GlyphRun run = new GlyphRun(_cachedTypeface,
                bidiLevel: 0,
                isSideways: false,
                renderingEmSize: FontSize,
                glyphIndices: glyphIndexes,
                baselineOrigin: new Point(0, Math.Round(_cachedTypeface.Baseline * FontSize)),
                advanceWidths: advanceWidths,
                glyphOffsets: null,
                characters: null,
                deviceFontName: null,
                clusterMap: null,
                caretStops: null,
                language: null);
 
            drawingContext.PushTransform(new TranslateTransform(bounds.X, bounds.Y));
            drawingContext.DrawGlyphRun((SolidColorBrush)foreColor, run);
            drawingContext.Pop();
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2019, 11:22
Ответы с готовыми решениями:

Преобразование Drawing.FontFamily в Media.FontFamily
Здравствуйте, имеется экземпляр коллекции PrivateFontCollection со шрифтами загруженными из архива, который должны использоваться в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Заблокирован
18.09.2019, 21:44
Цитата Сообщение от AderRol Посмотреть сообщение
там тож че не всавь, все отрисуется вне зависимости текущего FontFamily?
По-моему, отсутствующие символы берутся из других фонтов.
0
1 / 1 / 1
Регистрация: 25.09.2013
Сообщений: 47
19.09.2019, 09:16  [ТС]
Все верно, есть составные шрифты и в обычных контролах при недостающих символах в текущем, берутся из составного. Но как использовать это я не нашел примера.
0
Заблокирован
19.09.2019, 11:02
Цитата Сообщение от AderRol Посмотреть сообщение
Но как использовать это я не нашел примера.
Ни когда надобности не возникало.
Надо порыскать по инету.
Может даже и нет типового решения.
0
1595 / 600 / 185
Регистрация: 05.12.2015
Сообщений: 970
19.09.2019, 13:08
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Glyphs это самый низкоуровневый класс для отображения шрифта.
Ему нужен прямой указатель на файл шрифта.
Для отображения мультиязычного текста есть два подхода:
- ручной когда надо для каждого символа указывать файл шрифта. Это Glyphs
- автоматический, когда система сама находит недостающие символы и подставляет их.

Если надо в ручном режиме, тогда прямо укажите шрифт с корейским алфавитом:
C#
1
2
3
4
5
  <Glyphs            
         FontUri="c:\windows\fonts\batang.ttc"
         FontRenderingEmSize = "20"         
         UnicodeString       = "한자, 漢字 태극"
         Fill                = "Black"/>
Если в автоматическом режиме, то надо использовать класс FontFamily, который умеет распознавать отсутствующие в данном шрифте символы и делать FallBack, то есть обращаться к файлам композитных шрифтов и находить нужный шрифт для отсутствующего символа.
Самый низкоуровневый способ отрисовки с использованием FontFamily это рисование на DrawingVisual.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
   public class MyText : FrameworkElement
   {
      DrawingVisual visual = new DrawingVisual ();
      public MyText ()
      {
         using ( DrawingContext dc = visual.RenderOpen () )
         {
            FormattedText ft = new FormattedText
               (
                  "this is korean 한자, 漢字 태극. По корейски",
                  CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                  new Typeface ( new FontFamily ( "Arial" ), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal, new FontFamily("Global Monospace")),
                  /*последний FontFamily может принимать также: "Global Sans Serif", "Global Serif", "Global User Interface"*/
                  20, Brushes.Black
               );
            dc.DrawText ( ft, new Point ( 0, 0 ) );
            this.Height = ft.Height;
            this.Width = ft.Width;
         }
         AddVisualChild ( visual );
      }
      protected override Visual GetVisualChild ( int index )  {  return visual;  }
      protected override int VisualChildrenCount => 1;
   }
В определении Typeface в последнем параметре можно явно указать шрифт для FallBack. Он будет использован если в текущем шрифте нет нужного символа. Можно и без него - тогда система сама найдет наиболее подходящий.
1
1 / 1 / 1
Регистрация: 25.09.2013
Сообщений: 47
19.09.2019, 15:09  [ТС]
Сасибо, это близко к истине! Вот как раз для того что бы быстро рисовать - нужны глифы. остальные варианты медленные для меня) Буду тогда пилить в ручном режиме
0
1595 / 600 / 185
Регистрация: 05.12.2015
Сообщений: 970
19.09.2019, 17:12
Цитата Сообщение от AderRol Посмотреть сообщение
быстро рисовать
не получится. Это одно и тоже - вывод в TextBox происходит точно так же.
Что бы ускорить в сотни раз отрисовку текста надо сначала отрендерить его на Bitmap, а затем использовать это растровое изображение в DrawingVisual.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
19.09.2019, 19:09
Цитата Сообщение от proa33 Посмотреть сообщение
надо сначала отрендерить его на Bitmap
Bitmap же вроде пиксельный рисунок?
Тогда для каждого размера придётся свой набор рисунков делать?
Ещё и плавное масштабирование будет потеряно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru