Как использовать DrawString без обрезки? - программирование
Подтвердить что ты не робот

Как использовать DrawString без обрезки?

Я нахожу, как функция DrawString отключает целые символы или слова, чтобы они не противоречили друг другу. Показ частей текста ясно передает, что что-то не хватает.

Вот несколько примеров:

StringTrimming.None: enter image description here

StringTrimming.Character: enter image description here

Что я хочу: enter image description here (Макет GIMP)

Является ли StringTrimming.None тем же, что и StringTrimming.Character? Кажется, они ведут себя точно так же, как в моем случае. Есть ли что-то, что я мог бы упустить или это известная "особенность"?

В соответствии с docs StringTrimming.None "Не требует обрезки".

Этот сайт с примерами, созданными с Java, даже показывает "Нет", чтобы обрезать больше символов, чем "Символ".

Есть ли другие трюки, чтобы получить этот эффект?

Примечание. Я не хочу отображать "..." или подобное. Я считаю, что это пустая трата пространства, но это, вероятно, обсуждение UX.

4b9b3361

Ответ 1

Возможно, текст выглядит обрезанным, потому что он фактически невидимо закрывается на следующую строку. При вызове Graphics.DrawString отключите упаковку, передав объект StringFormat, свойство FormatFlags установлен на NoWrap:

StringFormat format =
    new StringFormat
    {
        FormatFlags = StringFormatFlags.NoWrap,
        Trimming = StringTrimming.None
    };
g.DrawString(s, font, brush, rect, format);

Ответ 2

В качестве обходного пути вы можете дать методу DrawString больше RectangleF, чем вы действительно хотите, и установите область отсечения вашего объекта Graphics на фактический RectangleF, который вы хотите нарисовать в строке.

RectangleF rect = new RectangleF(10, 10, 30, 15);
e.Graphics.DrawRectangle(Pens.Red, Rectangle.Truncate(rect));

RectangleF fakeRect = new RectangleF(rect.Location, new SizeF(short.MaxValue, short.MaxValue));

Region r = e.Graphics.Clip;
e.Graphics.SetClip(rect);            
e.Graphics.DrawString("1 Default", this.Font, SystemBrushes.ControlText, fakeRect);
e.Graphics.Clip = r;

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