2010-10-01 1 views
3

Вот метод OnPaint элемента управления, который просто наследует от управления и обеспечивает свойство, чтобы получить/установить textrenderinghint:Возможная ошибка с Graphics.DrawString и TextRenderingHint в .NET WinForms

Private _mode as TextRenderingHint = SystemDefault. 
Public Property Mode as TextRenderingHint 
    Get & Set _mode 
... 

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) 
    Dim g = e.Graphics 
    Dim savMode = g.Save 
    g.TextRenderingHint = Me._mode 
    g.DrawString(Me.Text, Me.Font, Brushes.Black, 0, 0) 
    g.Restore(savMode) 
    MyBase.OnPaint(e) 
End Sub 

Теперь, если вы место два из них на форме оставляют первый по умолчанию и меняют второй на AntiAlias, он отлично смотрится во время разработки, но когда вы запускаете приложение, режим рендеринга первого ярлыка изменился. Как будто метод DrawString изменил systemdefault.

Вот некоторые наблюдения:

(1) Если я в явной форме установить режим первого элемента управления к ClearTypeGridFit, который так же, как по умолчанию в моем случае, это устраняет проблему.

(2) Если вы поместите третий элемент управления в форму и оставьте его в режиме по умолчанию, он устраняет проблему.

(3) TextRenderer.DrawText не реплицирует проблему.

(4) Если я наследую управление меткой и переопределяю метод onpaint для установки режима рендеринга, проблема не реплицируется, даже если я устанавливаю UseCompatibleTextRendering, что заставляет метку визуализировать с помощью DrawString вместо DrawText.

Я нахожусь на XP с включенным разрешением cleartype и с использованием экспресс-редакции visual studio 2008.

ETA: Я попробовал это в C# и то же самое происходит

ответ

1

Это звучит как вопрос мы столкнулись раньше. В вашем стартовом коде приложения есть вызов Application.SetCompatibleTextRenderingDefault (true)? (Или может быть установлено значение false, я забыл).

Если это так, переключите состояние этого bool, чтобы изменить режим рендеринга текста, и он должен работать должным образом.

+0

К сожалению, звонка нет. Я был бы удивлен, если бы это решило проблему, хотя, потому что я сам рисую текст и явно использую метод gdi + drawstring. Кроме того, с моим замечанием 2 выше, это, по-видимому, более глубокая проблема. – Jules

+0

Хорошо. Возможно, стоит сделать снимок, добавьте этот призыв к запуску вашего приложения. Попробуйте установить как SetCompatibleTextRenderingDefault (true), так и SetCompatibleTextRenderingDefault (false) и посмотреть, какое влияние он оказывает на ваше приложение. Прошло некоторое время, давно переключившись на WPF, но, похоже, это напоминает об эффекте даже в материалах DrawString. –

0

У меня была аналогичная проблема. Я назвал это:

Image i = new Bitmap(size, size); 
Graphics g = Graphics.FromImage(i); 

// When this line is uncommented TextRenderingHint is broken for ALL other Graphics-Objects. 
// Setting "g.TextRenderingHint" later works sometimes in unpredictable ways. 
//g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
... 

Мой стартовый код выглядел следующим образом:

[STAThread] 
static void Main(string[] args) 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

Тогда я попробовал то, что Иуда Himango предложил и все работало нормально.
Это выглядит определенно как ошибка для меня!

Так просто убедитесь, что вы звоните:

Application.SetCompatibleTextRenderingDefault(true); 

работал для меня!

Смежные вопросы