как узнать количество символов в строке (печать c #) - PullRequest
0 голосов
/ 19 февраля 2012

У меня уже есть этот код, но он дает неправильный результат.

    private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    int charPerLine = e.MarginBounds.Width / (int)e.Graphics.MeasureString("m", txtMain.Font).Width;
    }

Текстовое поле txtMain.

1 Ответ

2 голосов
/ 19 февраля 2012

Это должно сработать.Будьте осторожны при делении на переменную, приведенную к целому числу.Вы оставляете себя открытым для деления на ноль здесь в случае, если свойство Width меньше единицы, которое будет усечено до нуля.Может быть маловероятно, что у вас будет такой маленький шрифт в вашем приложении, но это все еще хорошая практика.

private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    if( (int)e.Graphics.MeasureString("m", txtMain.Font).Width > 0 )
    {

        int charPerLine = 
            e.MarginBounds.Width / (int)e.Graphics.MeasureString("m", txtMain.Font).Width;
    }
}

Реальная проблема заключается в том, почему вам даже нужно знать количество символов в строке,Если вы не пытаетесь сделать что-то вроде ASCII-графики, вы можете использовать различные перегрузки Graphics.DrawString, чтобы GDI + разметил текст внутри ограничительного прямоугольника без необходимости знать, сколько символов помещается на строке.

Этот пример из MSDN показывает, как это сделать:

// Create string to draw.
String drawString = "Sample Text";

// Create font and brush.
Font drawFont = new Font("Arial", 16);
SolidBrush drawBrush = new SolidBrush(Color.Black);

// Create rectangle for drawing.
float x = 150.0F;
float y = 150.0F;
float width = 200.0F;
float height = 50.0F;
RectangleF drawRect = new RectangleF(x, y, width, height);

// Draw rectangle to screen.
Pen blackPen = new Pen(Color.Black);
e.Graphics.DrawRectangle(blackPen, x, y, width, height);

// Set format of string.
StringFormat drawFormat = new StringFormat();
drawFormat.Alignment = StringAlignment.Center;

// Draw string to screen.
e.Graphics.DrawString(drawString, drawFont, drawBrush, drawRect, drawFormat);

Так что, если вы пытаетесь напечатать страницу текста, вы можете просто установить drawRect вe.MarginBounds и вставьте текст на странице для drawString.

Другое дело, если вы пытаетесь распечатать табличные данные, вы можете просто разбить страницу на прямоугольники - по одному для каждого столбца / строки (как бы вам это ни понадобилось), и используйте перегрузки e.Graphics.DrawLine для печати границ таблицы.

Если вы опубликуете больше информации о том, чего вы на самом деле пытаетесь достичь, мы можем помочь больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...