C# 用C打印控件的整个区域#
这不是一个重复的问题-我的问题和其他问题之间的区别是我的控制器包含一个滚动条,所以它们更多的是无法打印的信息 我有一个C#应用程序,它包含一个主窗体名C# 用C打印控件的整个区域#,c#,winforms,printing,C#,Winforms,Printing,这不是一个重复的问题-我的问题和其他问题之间的区别是我的控制器包含一个滚动条,所以它们更多的是无法打印的信息 我有一个C#应用程序,它包含一个主窗体名MainForms。此MainForms具有控件main display。我想将我们在main显示屏上找到的全部信息打印到打印机上 问题是控件上的信息太大,我必须滚动查看所有信息 有人有什么功能可以让我打印此控件main display,其中包含全部信息 这是myMain显示区的打印屏幕,在右侧您可以看到滚动条: 我使用这个函数(来源:) 但是我
MainForms
。此MainForms
具有控件main display
。我想将我们在main显示屏上找到的全部信息打印到打印机上
问题是控件上的信息太大,我必须滚动查看所有信息
有人有什么功能可以让我打印此控件main display
,其中包含全部信息
这是myMain显示区的打印屏幕,在右侧您可以看到滚动条:
我使用这个函数(来源:)
但是我的问题仍然不能打印我控制中包含的所有信息,它只是打印一个小区域,仍然需要打印更多未打印的信息 我找到了解决办法。以下是我要做的步骤:
1-我们有一个mainForm
,这个主窗体包含一个控件mainDisplay
,具有特定的维度和区域,假设这个维度更小,我们得到了滚动
2-我要做的是将此main显示设置为空
3-我创建了另一个控件myControlToDisplay
。我绘制并放置我想要的所有字段,而不滚动,因此这一个myControlToDisplay
将有一个大维度
4-在启动应用程序时,我告诉main显示屏
加载myControlToDisplay
。这一次,myControlToDisplay
的所有内容都将显示在main显示屏上,并显示一个滚动条。因为main显示屏的面积很小
5-我编写了以下函数:
Bitmap MemoryImage;
PrintDocument printDoc = new PrintDocument();
PrintDialog printDialog = new PrintDialog();
PrintPreviewDialog printDialogPreview = new PrintPreviewDialog();
Control panel = null;
public void Print(Control pnl)
{
DateTime saveNow = DateTime.Now;
string datePatt = @"yyyy-M-d_hh-mm-ss tt";
panel = pnl;
GetPrintArea(pnl);
printDialog.AllowSomePages = true;
printDoc.PrintPage += new PrintPageEventHandler(Print_Details);
printDialog.Document = printDoc;
printDialog.Document.DocumentName = "Document Name";
//printDialog.ShowDialog();
if (printDialog.ShowDialog() == DialogResult.OK)
{
printDoc.Print();
}
}
public void PrintPreview(Control pnl)
{
DateTime saveNow = DateTime.Now;
string datePatt = @"yyyy-M-d_hh-mm-ss tt";
panel = pnl;
GetPrintArea(pnl);
printDoc.PrintPage += new PrintPageEventHandler(Print_Details);
printDialogPreview.Document = printDoc;
printDialogPreview.Document.DocumentName = "Document Name";
//printDialog.ShowDialog();
if (printDialogPreview.ShowDialog() == DialogResult.OK)
{
printDoc.Print();
}
}
private void Print_Details(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
RectangleF marginBounds = e.MarginBounds;
DateTime saveNow = DateTime.Now;
string datePatt = @"M/d/yyyy hh:mm:ss tt";
//String dtString = saveNow.ToString(datePatt);
// create header and footer
string header = "Put all information you need to display on the Header";
string footer = "Print date : " + saveNow.ToString(datePatt);
Font font = new Font("times new roman", 10, System.Drawing.FontStyle.Regular);
Brush brush = new SolidBrush(Color.Black);
// measure them
SizeF headerSize = e.Graphics.MeasureString(header, font);
SizeF footerSize = e.Graphics.MeasureString(footer, font);
// draw header
RectangleF headerBounds = new RectangleF(marginBounds.Left-80, marginBounds.Top-80, marginBounds.Width, headerSize.Height);
e.Graphics.DrawString(header, font, brush, headerBounds);
// draw footer
RectangleF footerBounds = new RectangleF(marginBounds.Left-80, marginBounds.Bottom - footerSize.Height+80, marginBounds.Width, footerSize.Height);
e.Graphics.DrawString(footer, font, brush, footerBounds);
// dispose objects
font.Dispose();
brush.Dispose();
}
public void GetPrintArea(Control pnl)
{
MemoryImage = new Bitmap(pnl.Width, pnl.Height);
Rectangle rect = new Rectangle(0, 0, pnl.Width, pnl.Height);
pnl.DrawToBitmap(MemoryImage, new Rectangle(0, 0, pnl.Width, pnl.Height));
}
protected override void OnPaint(PaintEventArgs e)
{
if (MemoryImage != null)
{
e.Graphics.DrawImage(MemoryImage, 0, 0);
base.OnPaint(e);
}
}
void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
Rectangle pageArea = e.PageBounds;
Rectangle m = e.MarginBounds;
if ((double)MemoryImage.Width / (double)MemoryImage.Height > (double)m.Width / (double)m.Height) // image is wider
{
m.Height = (int)((double)MemoryImage.Height / (double)MemoryImage.Width * (double)m.Width);
}
else
{
m.Width = (int)((double)MemoryImage.Width / (double)MemoryImage.Height * (double)m.Height);
}
e.Graphics.DrawImage(MemoryImage, m);
}
最后,我们假设我们有两个按钮,一个用于打印,另一个用于打印预览。
您只需调用此函数:
private void PrintButton_Click(object sender, EventArgs e)
{
try
{
Print(mainDisplay.getCurentPanel());
}
catch (Exception exp)
{
MessageBox.Show("Error: \n" + exp.Message);
}
}
private void PrintPreviewButton_Click(object sender, EventArgs e)
{
try
{
PrintPreview(mainDisplay.getCurentPanel());
}
catch (Exception exp)
{
MessageBox.Show("Error: \n" + exp.Message);
}
}
希望它能帮助某人:)
祝你好运,我找到了解决办法。以下是我要做的步骤:
1-我们有一个mainForm
,这个主窗体包含一个控件mainDisplay
,具有特定的维度和区域,假设这个维度更小,我们得到了滚动
2-我要做的是将此main显示设置为空
3-我创建了另一个控件myControlToDisplay
。我绘制并放置我想要的所有字段,而不滚动,因此这一个myControlToDisplay
将有一个大维度
4-在启动应用程序时,我告诉main显示屏
加载myControlToDisplay
。这一次,myControlToDisplay
的所有内容都将显示在main显示屏上,并显示一个滚动条。因为main显示屏的面积很小
5-我编写了以下函数:
Bitmap MemoryImage;
PrintDocument printDoc = new PrintDocument();
PrintDialog printDialog = new PrintDialog();
PrintPreviewDialog printDialogPreview = new PrintPreviewDialog();
Control panel = null;
public void Print(Control pnl)
{
DateTime saveNow = DateTime.Now;
string datePatt = @"yyyy-M-d_hh-mm-ss tt";
panel = pnl;
GetPrintArea(pnl);
printDialog.AllowSomePages = true;
printDoc.PrintPage += new PrintPageEventHandler(Print_Details);
printDialog.Document = printDoc;
printDialog.Document.DocumentName = "Document Name";
//printDialog.ShowDialog();
if (printDialog.ShowDialog() == DialogResult.OK)
{
printDoc.Print();
}
}
public void PrintPreview(Control pnl)
{
DateTime saveNow = DateTime.Now;
string datePatt = @"yyyy-M-d_hh-mm-ss tt";
panel = pnl;
GetPrintArea(pnl);
printDoc.PrintPage += new PrintPageEventHandler(Print_Details);
printDialogPreview.Document = printDoc;
printDialogPreview.Document.DocumentName = "Document Name";
//printDialog.ShowDialog();
if (printDialogPreview.ShowDialog() == DialogResult.OK)
{
printDoc.Print();
}
}
private void Print_Details(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
RectangleF marginBounds = e.MarginBounds;
DateTime saveNow = DateTime.Now;
string datePatt = @"M/d/yyyy hh:mm:ss tt";
//String dtString = saveNow.ToString(datePatt);
// create header and footer
string header = "Put all information you need to display on the Header";
string footer = "Print date : " + saveNow.ToString(datePatt);
Font font = new Font("times new roman", 10, System.Drawing.FontStyle.Regular);
Brush brush = new SolidBrush(Color.Black);
// measure them
SizeF headerSize = e.Graphics.MeasureString(header, font);
SizeF footerSize = e.Graphics.MeasureString(footer, font);
// draw header
RectangleF headerBounds = new RectangleF(marginBounds.Left-80, marginBounds.Top-80, marginBounds.Width, headerSize.Height);
e.Graphics.DrawString(header, font, brush, headerBounds);
// draw footer
RectangleF footerBounds = new RectangleF(marginBounds.Left-80, marginBounds.Bottom - footerSize.Height+80, marginBounds.Width, footerSize.Height);
e.Graphics.DrawString(footer, font, brush, footerBounds);
// dispose objects
font.Dispose();
brush.Dispose();
}
public void GetPrintArea(Control pnl)
{
MemoryImage = new Bitmap(pnl.Width, pnl.Height);
Rectangle rect = new Rectangle(0, 0, pnl.Width, pnl.Height);
pnl.DrawToBitmap(MemoryImage, new Rectangle(0, 0, pnl.Width, pnl.Height));
}
protected override void OnPaint(PaintEventArgs e)
{
if (MemoryImage != null)
{
e.Graphics.DrawImage(MemoryImage, 0, 0);
base.OnPaint(e);
}
}
void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
Rectangle pageArea = e.PageBounds;
Rectangle m = e.MarginBounds;
if ((double)MemoryImage.Width / (double)MemoryImage.Height > (double)m.Width / (double)m.Height) // image is wider
{
m.Height = (int)((double)MemoryImage.Height / (double)MemoryImage.Width * (double)m.Width);
}
else
{
m.Width = (int)((double)MemoryImage.Width / (double)MemoryImage.Height * (double)m.Height);
}
e.Graphics.DrawImage(MemoryImage, m);
}
最后,我们假设我们有两个按钮,一个用于打印,另一个用于打印预览。
您只需调用此函数:
private void PrintButton_Click(object sender, EventArgs e)
{
try
{
Print(mainDisplay.getCurentPanel());
}
catch (Exception exp)
{
MessageBox.Show("Error: \n" + exp.Message);
}
}
private void PrintPreviewButton_Click(object sender, EventArgs e)
{
try
{
PrintPreview(mainDisplay.getCurentPanel());
}
catch (Exception exp)
{
MessageBox.Show("Error: \n" + exp.Message);
}
}
希望它能帮助某人:)
祝你好运这不是一个重复的问题-我的问题和其他问题之间的区别是我的控制器包含一个滚动条,因此它们是更多无法打印的信息。很难想象,这一点会反复出现。像这样的打印控件有很多问题,滚动是较少(几乎不可能)解决的问题。更严重的是显示器和打印机之间分辨率的巨大差异。屏幕上的每一个像素都会被放大到一个6x6的墨水滴。对于文本而言,效果尤其差,使低分辨率监视器上的文本可读的抗锯齿像素会在纸上变成难看的、高度可见的斑点。编写一个接受图形对象参数并绘制网格的方法。现在你可以叫它了。这不是一个重复的问题-我的问题和其他问题之间的区别是我的控制器包含一个滚动条,所以它们是更多无法打印的信息。很难想象,这个问题会反复出现。像这样的打印控件有很多问题,滚动是较少(几乎不可能)解决的问题。更严重的是显示器和打印机之间分辨率的巨大差异。屏幕上的每一个像素都会被放大到一个6x6的墨水滴。对于文本而言,效果尤其差,使低分辨率监视器上的文本可读的抗锯齿像素会在纸上变成难看的、高度可见的斑点。编写一个接受图形对象参数并绘制网格的方法。现在你可以叫它了。