Общая ошибка в GDI+ при использовании MeasureString

У меня есть переопределенный (WinForms) элемент управления MemoEdit (к сожалению, я не могу дать вам код). Если я ввожу более 32000 символов, возникает ошибка «В GDI+ произошла общая ошибка». Я думал, что в моем элементе управления есть ошибка (исключение), но затем я проверил на простом приложении WinForm этот код:

var myString = new string('G', 32001);
var g = this.CreateGraphics();
g.MeasureString(myString, Font, 1000);

и вылетает точно с такой же ошибкой кто-нибудь знает почему так происходит или где указана эта константа 32000 ? В гугле ничего полезного не нашел.


person Victor George Cojocaru    schedule 31.05.2015    source источник
comment
Какой шрифт и размер вы используете?   -  person Icemanind    schedule 04.06.2015
comment
На моем компе работает до 65535. Он ломается 65536   -  person Icemanind    schedule 04.06.2015


Ответы (2)


Кажется, это новая ошибка, появившаяся в Windows 8. Мне было бы любопытно узнать, что происходит в более старой версии Windows:

https://connect.microsoft.com/VisualStudio/feedback/details/776722/label-control-throws-an-exception-if-its-text-is-set-to-very-long-string

person Frank Hileman    schedule 03.06.2015
comment
Эта ссылка не работает. Любая идея, если есть новая ссылка на эту проблему? - person Tim Andersen; 30.09.2015
comment
Они не хотят это исправлять, я так понимаю. Последние два сообщения можно найти в кэшированной версии веб-страницы. webcache.googleusercontent.com/ - person Frank Hileman; 02.10.2015
comment
Спасибо за ссылку на кэшированную страницу, Фрэнк. Что ж, это не сулит ничего хорошего для нового отчета об ошибке, который я только что открыл пару дней назад (connect.microsoft.com/VisualStudio/feedback/details/1850428/) . Мы сталкиваемся с этой проблемой на любой машине с Win8 или более поздней версией, что, похоже, соответствует объяснению этого другого сообщения об ошибке. Я еще не получил ответа от MS, но сомневаюсь, что мне понравится их ответ... - person Tim Andersen; 02.10.2015

Возможно, ширина строки превышает Int32.Max (можно обратиться к эта тема).

Я знаю, что ваша ошибка возникает, если вы используете арабский язык, в котором используются специальные символы (см. 85%29.aspx" rel="nofollow">MSDN-ссылка: For bidirectional languages, such as Arabic, the string length must not exceed 2046 characters).

Чтобы решить вашу проблему, я бы предложил разбить строку на каждый 31999-й символ и добавить разные размеры/длины.

person unknown6656    schedule 31.05.2015
comment
32000 != 32к. Кроме того: происходит сбой MeasureString, а не назначение строки. - person TaW; 31.05.2015
comment
@TaW: я это знаю, я имел в виду, что ширина строки в пикселях больше, чем Int32 - person unknown6656; 31.05.2015
comment
Ага, ну любопытно же: 32000 работает, а 32001 нет. Нет никакой ширины строки в пикселях, кроме 1000 пикселей, которые он вводит в MeasureString. И результирующая высота (которую он на самом деле измеряет) составляет несколько сотен пикселей, в зависимости от шрифта. Исходники ведут к основной процедуре, длина которой передается как int... довольно странно. - person TaW; 31.05.2015
comment
Я использую английский как язык. Другие языки не пробовал. - person Victor George Cojocaru; 01.06.2015