Это должно сработать.Будьте осторожны при делении на переменную, приведенную к целому числу.Вы оставляете себя открытым для деления на ноль здесь в случае, если свойство 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
для печати границ таблицы.
Если вы опубликуете больше информации о том, чего вы на самом деле пытаетесь достичь, мы можем помочь больше.