Почему DrawString показывает неожиданное поведение в C# Winforms?

Создайте логический вектор и затем назначьте нужные значения.

x <- logical(6)    # All FALSE
a <- c(1, 4)
x[a] <- TRUE

x
#[1]  TRUE FALSE FALSE  TRUE FALSE FALSE
6
задан Neil N 8 May 2009 в 14:47
поделиться

3 ответа

Я собираюсь догадаться, что это потому, что вы используете Graphics.DrawString () вместо TextRenderer.DrawText () . Первый рисует текст с использованием GDI +, что является своего рода дрянным и устаревшим. Последний использует GDI, который является более современным (с точки зрения рендеринга текста). Я полагаю, что это отличие, отмеченное в предыдущем ответе (WinForms против Windows).

Вы также можете попробовать перегрузку Graphics.DrawString () , которая принимает объект StringFormat и укажите StringFormat.GenericTypographic . Тем не менее, это действительно немного взломать вокруг проблемы. Если вы используете .NET 2.0 или более позднюю версию, Вы должны использовать класс TextRenderer вместо классного Graphics класса для всех ваших потребностей рендеринга текста. Graphics.MeasureString () и Graphics.DrawString () существуют строго для обратной совместимости с .NET 1.0 и 1.1. Редактирование:

Да, и ваш код пропускает объект GDI на каждом цикле рисования. Объекты Brush являются управляемыми оболочками вокруг неуправляемых ресурсов, поэтому они должны быть явно удалены.

и ваш код пропускает объект GDI на каждом цикле рисования. Объекты Brush являются управляемыми оболочками вокруг неуправляемых ресурсов, поэтому они должны быть явно удалены.

и ваш код пропускает объект GDI на каждом цикле рисования. Объекты Brush являются управляемыми оболочками вокруг неуправляемых ресурсов, поэтому они должны быть явно удалены.

6
ответ дан 17 December 2019 в 02:33
поделиться

Я должен быть честным, но этого никогда не случалось со мной раньше. Однако попробуйте установить для SmoothingMode значение Antialiasing:

e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

Кроме того, убедитесь, что при использовании DoubleBuffer установлено значение true. Также старайтесь не создавать новый SolidBrush при каждом вызове OnPaint.

0
ответ дан 17 December 2019 в 02:33
поделиться

Мой опыт рисования текста в подклассах управления с использованием WinForms заключается в том, что используемый им механизм визуализации текста (GDI +?) Не так хорош, как собственный механизм шрифтов Windows, и, безусловно, дает разные результаты, даже когда он хорошо работает.

Я являюсь автором надстройки Visual Studio ( http://entrian.com/source-search ), который должен рисовать элементы управления в Visual Studio и чтобы шрифты выглядели так же, как стандартные элементы управления в Visual Studio (списки, древовидные представления и т. д.) Я должен обойти WinForms и нарисовать текст, используя Win32 API:

[DllImport("gdi32.dll")]
public static extern bool ExtTextOut(IntPtr hdc, int X, int Y,
   uint fuOptions, [In] ref RECT lprc, string lpString, uint cbCount,
   [In] int[] lpDx);

... и семью.

Возможно, не то, что вы хотели услышать, но это так.

0
ответ дан 17 December 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: