Возможная ошибка с Graphics.DrawString и TextRenderingHint в .Net Winforms - PullRequest
3 голосов
/ 01 октября 2010

Вот метод OnPaint элемента управления, который просто наследует от элемента управления и предоставляет свойство для получения / установки textrenderinghint:

 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 изменил системную ошибку по умолчанию.

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

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

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

(3) TextRenderer.DrawText не воспроизводит проблему.

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

Я нахожусь на XP с включенным cleartype и использую Visual Studio 2008 Express Edition.

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

Ответы [ 2 ]

1 голос
/ 01 октября 2010

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

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

0 голосов
/ 13 ноября 2011

У меня была похожая проблема. Я назвал это:

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);

Потом я попробовал то, что предложил Джуда Химанго, и все отлично заработало.
Для меня это определенно похоже на ошибку!

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

    Application.SetCompatibleTextRenderingDefault(true);

Работал на меня!

...