我有一张需要打印的长表格。表单本身可能比屏幕上显示的更大(在将数据加载到表单之前,高度未知)。我尝试了几种方法,但没有一种方法有效。
以下是我试图完成的最接近的方法。下面的方法的问题是它只打印屏幕的一部分。我还不确定它是否会捕获完整表单或用户屏幕上显示的内容。
private void print_Click(object sender, EventArgs e)
{
PrintScreen();
DialogResult result = printDialog1.ShowDialog();
if (result == DialogResult.OK)
{
printDocument1.Print();
}
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
private void PrintScreen()
{
Graphics mygraphics = this.CreateGraphics();
Size s = this.Size;
memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
IntPtr dc1 = mygraphics.GetHdc();
IntPtr dc2 = memoryGraphics.GetHdc();
BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
mygraphics.ReleaseHdc(dc1);
memoryGraphics.ReleaseHdc(dc2);
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawImage(memoryImage, 0, 0);
}
请帮忙。
答案 0 :(得分:1)
如果您尝试将WinForm的内容打印到打印机,则向打印机绘制UI控件是行不通的。您不能像屏幕一样调整大小或滚动一张纸。你会发现在屏幕上看起来不错的东西在纸上看起来不太好;字体是像素化的,渐变是抖动的,文字被切断,屏幕上看起来很好的布局将在纸上的疯狂位置打印。
您需要使用System.Drawing.Printing类来确定打印机指标,例如页面大小,颜色,边距等。然后,将输出划分为适合页面的文本段落或图形切片。如果段落或图块溢出页面,请确定如何拆分它并在多个页面上打印一个部分。 PrintDocument文档中有一个打印多个页面的示例。
除了最简单的输出之外,这将是很多工作。您可能最好使用Report Viewer或nReports之类的报告引擎生成PDF或RDL输出并将其发送到打印机。