Какой самый быстрый способ рисовать форматированный текст в Win32 API? - PullRequest
11 голосов
/ 05 апреля 2011

Я реализую текстовый редактор на C ++, используя только API Win32 Vanilla, и я пытаюсь найти лучший способ реализовать подсветку синтаксиса.Я знаю, что существуют существующие средства управления, такие как сцинтилла, но я делаю это для развлечения, поэтому я хочу сделать большую часть работы самостоятельно.Я также хочу, чтобы он был быстрым и легким.

Из того, что я узнал до сих пор, похоже, что наиболее низкоуровневой опцией для рисования текста в GDI является функция TextOut.Однако, если мне нужно постоянно менять цвет шрифта, это означает, что мне нужно будет сделать много вызовов на TextOut, чтобы нарисовать одно тело текста со смешанным форматированием.Это неэффективно?Когда будут реализованы подсветка синтаксиса и элементы управления расширенным текстом, будут ли они использовать TextOut за кулисами или есть какой-то другой способ?Является ли любой другой метод рисования текста в GDI просто оберткой более высокого уровня вокруг TextOut?

Ответы [ 3 ]

12 голосов
/ 05 апреля 2011

DrawText и TextOut являются оболочками для ExtTextOut, поэтому ExtTextOut является низкоуровневым API. По моему опыту, ExtTextOut работает довольно быстро, поэтому я сомневаюсь, что вы столкнетесь с какими-либо проблемами с производительностью самого ExtTextOut. Однако создание / выбор шрифтов может быть источником проблем с производительностью, поэтому если вы переключаетесь между шрифтами туда и обратно, вы можете добиться значительного прироста производительности, кэшируя и повторно используя шрифты (HFONT), а не каждый раз CreateFont / SelectObject / DeleteObject. По сути, при первом вызове SelectObject после создания нового шрифта Windows выполнит процесс сопоставления шрифтов, чтобы найти наилучший физический шрифт для запрошенного вами логического шрифта. Это довольно сложный процесс, поэтому вы хотите минимизировать количество раз, которое происходит в ситуациях, когда важна производительность.

Я разработал богатый элемент управления для редактирования много лет назад, который по сути был мини-версией Microsoft Word. Я использовал ExtTextOut в качестве основной рабочей лошадки для всего вывода текста. Элемент управления будет поддерживать кэш шрифтов самых последних использованных шрифтов (размер кэша по умолчанию составляет 10 шрифтов). Он поддерживал макет WYSIWYG, поэтому фактически выполнял всю компоновку с использованием DC-принтера и шрифтов, а затем отображал версию, совместимую с экраном, с использованием DC-экрана и аналогичных шрифтов, поэтому потребовалось много дополнительной работы, которая, вероятно, не применима к твоя ситуация. Несмотря на это, производительность была отличной при работе на типичном оборудовании того времени (например, 266 МГц Pentium).

6 голосов
/ 05 апреля 2011

Вместо того, чтобы подумать о том, какая функция «рисовать текст» является самой быстрой, вероятно, гораздо выгоднее подумать: «Как я могу минимизировать объем текста, который мне нужно визуализировать при всех », будучи умным? о том, что нужно перерисовать / сделать недействительным при изменении текста, или как можно кэшировать отображаемый текст для прокрутки.

1 голос
/ 05 апреля 2011

Для комплексного использования вы, вероятно, захотите DrawText, поскольку он дает вам больше контроля, чем TextOut. Он имеет некоторую базовую поддержку форматирования, но меньше, чем нужно для редактора. Следующим шагом является расширенный текстовый редактор из библиотеки общих элементов управления, который в значительной степени позаботится обо всем этом для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...