Использует ли TextBox GDI или GDI+
По сути, я хочу измерить размер текста в TextBox, и я обнаружил, что TextRenderer дает мне правильные значения, в то время как Graphics даст мне неправильные значения. Так что кажется, что TextBox должен использовать GDI для рисования текста, верно?
Однако везде, где я читаю, я вижу, что он должен использовать GDI+. Например:
- Здесь http://microsoft.public.dotnet.framework.windowsforms.controls.narkive.com/yoHKjPut/text-rendering-accuracy-problem-in-textbox-richtextbox написано, что TextBox и кнопки используют GDI+.
- Вот почему Graphics.MeasureString() возвращает больше ожидаемого числа? он говорит, что по умолчанию "режим совместимости", который рисует в GDI +
Так почему же я получаю согласованные результаты с TextRenderer, а не с Graphics, когда это должно быть наоборот?
3 ответа
Хорошо, еще одно исследование показало, что существует путаница в том, что такое "По умолчанию".
Когда эти источники говорят о "По умолчанию", они говорят о "По умолчанию (1)", как в "Если дополнительный код не выполняется", а не "По умолчанию (2)", как в "Если никаких дополнительных действий не предпринимается".
Поскольку "Default (2)", "Application.SetCompatibleTextRenderingDefault (false)" добавляется в файл Program.cs нового проекта, что заставляет класс TextBox использовать GDI для рендеринга, который не является "Default (1)" для это, но на самом деле это то, что происходит, если вы, как программист, не предпринимаете никаких дополнительных действий.
Это в основном то, что получил меня.
PS: я основываю предположение, что это "по умолчанию (1)", на принятом ответе на этот вопрос. Свойство UseCompatibleTextRendering не создается дизайнером, когда для него установлено значение false
.NET Framework использует GDI+ в большинстве мест. Graphics
класс является оберткой вокруг GDI+.
Тем не менее, WinForms также обертывает родные элементы управления Win32, которые не используют GDI+. Они используют GDI. TextBox и RichTextBox являются примерами этого. Они рисуют свой текст, используя GDI.
Чтобы измерить GDI+ текст, вы будете использовать Graphics.MeasureString
(Обратите внимание Graphics
класс там). Чтобы измерить текст GDI, вы будете использовать TextRenderer.MeasureText
(обратите внимание, что это не предусмотрено Graphics
учебный класс).
Все становится немного сложнее: некоторые элементы управления используют GDI+ для рисования. Элемент управления Button является примером этого. Если вы не установили для FlatStyle значение System, оно отрисовывается владельцем.NET Framework, а рисование этого владельца выполняется с помощью GDI+ (графической подсистемы, используемой в.NET). Однако, если для FlatStyle установлено значение System, рендеринг делегируется собственному элементу управления Win32 Button, который использует GDI (как и все собственные элементы управления Win32).
Мое предложение состоит в том, чтобы использовать GDI (TextRenderer
) по возможности рисовать текст. Если вы используете элемент управления, который реализует свойство FlatStyle, установите для него значение System. Текст, нарисованный с помощью GDI+, по сравнению с ним выглядит просто паршиво. В качестве бонуса вы получите элементы управления, которые на самом деле выглядят как встроенные и гармонируют с системой. FlatStyle.System - единственный способ получить элемент управления кнопки, который фактически пульсирует и светится. Рендерер WinForms не реализует это.
Ошибка GDI+ обычно возникает, когда мы указываем путь для хранения чего-либо в папке, и этот путь неверен, то есть папка не может получить доступ или не может найти этот путь. Итак, просто исправьте путь или разрешите доступ к безопасности папки.