Почему первая строка текстового поля содержит на 1 символ больше, чем остальные с моноширинным шрифтом?

У меня есть текстовое поле в формах Windows с моноширинным шрифтом (Courier New, 10pt), поэтому я предполагаю, что каждая строка текстового поля будет содержать одинаковое количество символов. Однако иногда первая строка содержит на один символ больше, чем все остальные.

Вот как текстовое поле форматируется для строки textbox.Text = "?06?00?00?00?01?00?00?00?00?00?01?00?00?04?00?00?00?00?00?00?01?00?00?00?00?00?00?00?02?00?00?00?":

?06?00?00?00?01?00?00?00?
00?00?01?00?00?04?00?00?
00?00?00?00?01?00?00?00?
00?00?00?00?02?00?00?00?

То же текстовое поле выглядит так для другой строки textbox.Text = "06 00 00 00 01 00 00 00 00 00 01 00 00 04 00 00 00 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 f4 01 00 00 ":

06 00 00 00 01 00 00 00 00 
00 01 00 00 04 00 00 00 00 
00 00 01 00 00 00 00 00 00 
00 02 00 00 00 f4 01 00 00 

Обратите внимание, что для первой строки текстовое поле содержит 25 символов в первой строке и 24 в остальных. Для второй строки текстовое поле содержит 26 символов в каждой строке (в конце каждой строки есть пробел)

Действительно ли Courier New является моноширинным шрифтом? (Я читал в нескольких местах, что это так.)

Если Courier New — моноширинный шрифт, то почему это происходит?

Как это можно исправить? (Я просто хочу иметь одинаковое количество символов в каждой строке).


person Felix Knopp    schedule 30.11.2020    source источник
comment
Я предполагаю, что это текстовое поле со свойством Multiline, установленным в true, и что вам интересно, почему вы получаете такое поведение разрыва строки. Многострочное текстовое поле — это просто элемент управления текстовым полем Win32 (который очень похож на клиентское текстовое окно в Блокноте). Так же, как Блокнот, вы получаете поведение разрыва строки. И, как и в Блокноте, строки разрываются на пробелах или некоторых знаках препинания. В первом случае вы получаете разрывы на вопросительных знаках. Поскольку в вашей первой строке есть лишняя в начале, она немного длиннее. Во втором случае вы получаете перерывы в пробелах.   -  person Flydog57    schedule 30.11.2020
comment
Непонятно, как вы хотите, чтобы был представлен первый блок, учитывая, что у вас разное количество символов в строке. Удалите ведущий знак вопроса, и это похоже на второй блок.   -  person Jimi    schedule 30.11.2020
comment
Чтобы ответить на другие вопросы... Да Courier New моноширинный. Для меня Consolas обычно выглядит лучше (как моноширинный шрифт). Я думаю, но я не уверен, что единственный способ получить желаемое поведение разрыва строки - это сделать это самостоятельно. Используйте Graphics.MeasureString, чтобы выяснить, как долго строка использует графику, связанную с текстовым полем, а затем нарежьте строку самостоятельно, чтобы исправить ее. Вам нужно будет обработать событие изменения размера, чтобы повторить измельчение, если текстовое поле изменит ширину   -  person Flydog57    schedule 30.11.2020
comment
@ Flydog57: Да, это текстовое поле с многострочным свойством, для которого установлено значение true. Я не вижу способа изменить поведение разрыва строки в свойствах текстового поля. Есть ли способ изменить его так, чтобы он ломался на любом символе? Изменить: только что увидел, что вы уже ответили на этот вопрос :)   -  person Felix Knopp    schedule 30.11.2020
comment
@FelixKnopp, основываясь на своем тесте, я воспроизвел вашу проблему. Я обнаружил, что он не будет моноширинным, когда мы используем такие символы, как '?', '!' и т. д. Поэтому я рекомендую вставлять разрыв строки через каждые n символов. Пожалуйста, обратитесь к ссылке разрыв строки C# через каждые n символов.   -  person Jack J Jun - MSFT    schedule 01.12.2020