我已经有了这段代码,但它给了我错误的结果。
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是一个文本框。
答案 0 :(得分:2)
这应该可以解决问题。将变量转换为整数时要小心。如果Width
属性小于1,您将在零开始时将自己打开为零除零。你的应用程序可能不太可能有这么小的字体,但它仍然是一种很好的做法。
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 +在一个边界矩形内为你设置文本,而不需要知道一行上有多少个字符。
This sample from 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
重载来打印表格边框
如果您发布有关实际尝试实现内容的更多详细信息,我们可以提供更多帮助。