Использование Graphics.DrawString для имитации рендеринга TextBox - PullRequest
0 голосов
/ 18 мая 2011

У меня есть C # UserControl, который содержит TextBox.

Когда пользовательский элемент управления отключен, я бы хотел, чтобы TextBox отображался так, как если бы он был отключен + ReadOnly (то есть не серым). Поэтому, когда пользовательский элемент управления перехватывает EnabledChanged, он соответствующим образом устанавливает свойства размещенного TextBox.

Тем не менее, состояние «Включено» UserControl имеет приоритет над всем остальным, и TextBox по-прежнему отображается серым (даже если его внутренний ForeColor правильный).

Поэтому я решил скрыть размещенный TextBox, когда пользовательский элемент управления отключен, и нарисовать его сам. Я могу успешно визуализировать границу TextBox, используя различные функции ControlPaint.DrawXxx.

Однако рисование текста приводит к растянутым выводам по сравнению с собственным рендерингом. То есть текст начинается в том же месте пикселя, но расстояние между символами заметно больше.

Я использую собственный шрифт TextBox для выполнения рендеринга, поэтому я не знаю, что я делаю неправильно. Единственное оправдание, которое я могу сделать, это то, что C # TextBox визуализируется непосредственно Windows (используя ExtTextOut Win32 API), и это приводит к очевидным различиям.

Какие параметры можно использовать для имитации встроенного рендеринга TextBox?

1 Ответ

2 голосов
/ 18 мая 2011

Разница в том, что Graphics.DrawString использует GDI + для визуализации текста, в то время как Win32 API использует GDI внутренне для всего, включая рисование текста на элементах управления .

Начиная с .NET 2.0 , вы можете легко имитировать его внешний вид, используя TextRenderer.DrawText метод , который также использует GDI для рисования.

В большинстве случаев заменить Graphics.DrawString на TextRenderer.DrawText просто. Вы не показываете никакого кода, поэтому трудно привести конкретный пример.


Что касается того, почему вы должны сделать это в первую очередь ... Отключение элемента управления контейнера всегда отключает все его дочерние элементы управления. Это жесткое правило в Windows без исключений. Конечно, это довольно разумно.
Если вы не хотите, чтобы все элементы управления внутри контейнера были отключены, вы не должны отключать весь контейнер - просто отключите отдельные элементы управления внутри этого контейнера.

Даже вооружившись немного лучшим методом рендеринга текста, я все равно настоятельно рекомендую вам , а не , попытаться повторно реализовать элемент управления TextBox. Это довольно сложная часть работы, и вы вряд ли поймете ее правильно, потратив всего несколько дней / недель.

...