Windows窗体中的打印面板C#

我有一个情况。 我需要在Visual Studio 2010中使用C#以Windows窗体创建员工卡结构。该结构可能包含带有白色背景的标签和图片框。 我没有问题创建它,但我也在这个窗体上给出一个名为“打印”的按钮,以便用户可以打印该卡。 我搜索了它,但没有找到具体的东西。 请帮帮我。

namespace Employee_Card_Manager { public partial class Card : Form { public Card(String a, String b, String c, String d, String e, String f, String g, String h, String i) { InitializeComponent(); this.label2.Text = a; this.label9.Text = b; this.label10.Text = c; this.label11.Text = d; this.label12.Text = e; this.label13.Text = f; this.label14.Text = g; this.label16.Text = h; this.pictureBox1.Image = Image.FromFile(i); Image myimg = Code128Rendering.MakeBarcodeImage(h, 2, true); this.pictureBox2.Image = myimg; } private void button1_Click(object sender, EventArgs e) { //Print Card Code } } } 

卡片模板如下:

员工卡结构

我已将所有卡片结构放在Panel Control上,并将Panel背景设置为白色。 你能填写打印这张卡的代码吗? 谢谢

我发现以下代码工作正常!!

  //declare event handler for printing in constructor printdoc1.PrintPage += new PrintPageEventHandler(printdoc1_PrintPage); //Rest of the code Bitmap MemoryImage; public void GetPrintArea(Panel pnl) { MemoryImage = new Bitmap(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 printdoc1_PrintPage(object sender, PrintPageEventArgs e) { Rectangle pagearea = e.PageBounds; e.Graphics.DrawImage(MemoryImage, (pagearea.Width / 2) - (this.panel1.Width / 2), this.panel1.Location.Y); } public void Print(Panel pnl) { pannel = pnl; GetPrintArea(pnl); previewdlg.Document = printdoc1; previewdlg.ShowDialog(); } private void button1_Click(object sender, EventArgs e) { Print(this.panel1); } 

这个MSDN页面不适合你吗? http://msdn.microsoft.com/en-us/library/aa287529(v=vs.71).aspx

编辑:我在上述链接中修改了示例并创建了一个PrintablePanel类,您可以以各种forms重用它:

 public partial class PrintablePanel : Panel { public PrintablePanel() { InitializeComponent(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); } [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); public Bitmap GetImage() { Bitmap memoryImage = null; Graphics mygraphics = 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); return memoryImage; }