Любые идеи, почему одно из последних обновлений Windows вызывает проблемы с GraphicsPath.AddString()
и некоторыми шрифтами, но только для определенных символов? Как это исправить?Общее исключение GDI + в GraphicsPath.AddString() с определенными шрифтами и символами
Пример шрифта Thin Pencil Handwriting (это общественное достояние, поэтому вы можете попробовать сами). Он отлично работает, если вы используете Graphics.DrawString()
. Он также отлично работает, если вы попытаетесь использовать GraphicsPath.AddString()
с ним, чтобы написать Lorem ipsum
, но не получится, если попытаетесь использовать символ C
(столица c
) или 5
цифр.
Он работал отлично, всего несколько недель назад, и после недавних обновлений он терпит неудачу с печально известным и практически undebuggable Generic GDI + исключением.
Пример кода:
string textOK = "Lorem ipsum";
string broken = "C"; // Yes, only capital letter 'c'!
FontStyle style = FontStyle.Regular;
Bitmap b = new Bitmap(200, 200, PixelFormat.Format32bppPArgb)
using (Graphics g = Graphics.FromImage(b))
{
g.Clear(Color.White);
g.SmoothingMode = SmoothingMode.HighQuality;
using (StringFormat sf = new StringFormat())
{
RectangleF rect = new RectangleF(0, 0, 200, 200);
float size = 8;
using (Font f = new System.Drawing.Font("Thin Pencil Handwriting", size, style))
{
// Works perfectly fine
g.DrawString(textOK, f, Brushes.Black, rect, sf);
g.DrawString(broken, f, Brushes.Black, rect, sf);
}
using (GraphicsPath path = new GraphicsPath())
{
FontFamily family = new FontFamily("Thin Pencil Handwriting");
// This works fine
path.AddString(textOK, family, (int)style, size, rect, sf);
// This causes Generic GDI+ exception!
path.AddString(broken, family, (int)style, size, rect, sf);
g.FillPath(Brushes.Black, path);
}
}
}
Я использую C#, но я не вещь, это особенно C# связаны. Старые машины без недавних обновлений работают нормально, но я не могу сказать людям, чтобы они не устанавливали системные обновления :(Я также заметил два других шрифта, которые вызывают подобные проблемы - как с методом GraphicsPath.AddString()
.
неясно, что вы надеетесь достичь с помощью отладчика, он ISN» я расскажу вам, что не так с шрифтом или как обновление безопасности сделало шрифт несовместимым. Только реальное решение, которое у вас есть, - это прекратить использовать его до некоторого волшебного дня, reeware автор шрифта собирается исправить свой шрифт. То, что вы распространяли шрифт, который * появляется * для использования дыры в безопасности, также должно дать вам некоторую паузу, а также, не забудьте сообщить своим клиентам. –
Что я хочу достичь, так это выяснить, что вызывает эту проблему, и если есть какие-либо обходные пути. Шрифт, который я связал, является лишь примером. Поскольку я разместил этот вопрос, у меня появились отчеты по многим другим шрифтам, поэтому проблема не редкость. Если бы это был один или два шрифта, распространяемых вместе с моим программным обеспечением, это было бы довольно легко исправить, поскольку шлейфы некоторых шрифтов имеют какие-то странные проблемы. Но это не так. Я знаю, что всегда могу добавить дополнительную проверку перед использованием шрифта и сказать пользователю: эй этот шрифт работал раньше, но теперь это угроза безопасности, и мы больше не можем его использовать. Это просто глупо. – SiliconMind