C# 如何打印panel 里所有的控件

zfy244 2010-10-22 09:46:52
如题,
在网上找了半天都没有全解,只能求CSDN的大侠帮忙
请问如何打印panel里的所有数据.
说明一下,我panel里是添加的是动态label控件和一个pictruebox

最好有全一点的代码...
...全文
1321 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhougang8687 2011-07-30
  • 打赏
  • 举报
回复
解决了,谢谢!!
dafei198607 2010-10-23
  • 打赏
  • 举报
回复
 private static Bitmap mBitmap = null;
private static System.Drawing.Printing.PrintDocument printDoc = new System.Drawing.Printing.PrintDocument();


public static void PrintPanel(Panel p)
{
PrintPreviewDialog ppvw;
Graphics mygraphics = p.CreateGraphics();
Size s = p.Size;
mBitmap = new Bitmap(s.Width, s.Height, mygraphics);
Graphics memoryGraphics = Graphics.FromImage(mBitmap);
IntPtr dc1 = mygraphics.GetHdc();
IntPtr dc2 = memoryGraphics.GetHdc();
BitBlt(dc2, 0, 0, p.ClientRectangle.Width, p.ClientRectangle.Height, dc1, 0, 0, 13369376);
mygraphics.ReleaseHdc(dc1);
memoryGraphics.ReleaseHdc(dc2);

ppvw = new PrintPreviewDialog();
ppvw.Width = 800;
ppvw.Height = 600;
ppvw.Document = printDoc;
printDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
if (ppvw.ShowDialog() != DialogResult.OK)
{
printDoc.PrintPage -= new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
return;
}
printDoc.Print();
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt(IntPtr HDest, int nXDest, int nYDest, int nWidth, int hHeight, IntPtr HSrc, int nXSrc, int nYSrc, int DwRop);

private static void PrintDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawImage(mBitmap, 0, 0);
}
兔子-顾问 2010-10-23
  • 打赏
  • 举报
回复
你看了如梦给你的链接没。貌似有一个答案比较通俗易懂。
如果窗体有滚动条显示不完整,则每次滚动一屏,抓图拼接,最终得到一个完整的图,进行打印。不需要遍历控件。
zfy244 2010-10-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wuyazhe 的回复:]
你看了如梦给你的链接没。貌似有一个答案比较通俗易懂。
如果窗体有滚动条显示不完整,则每次滚动一屏,抓图拼接,最终得到一个完整的图,进行打印。不需要遍历控件。
[/Quote]
我看了下,好像是我想要的那种,但是我有个问题存在,现在打印的内容都能在打印预览里看见,但是就是打印不了.
怎么搞啊,我已经为这打印的事情搞了三天了,没有多少时间了
请帮帮忙帮我解决下
zfy244 2010-10-23
  • 打赏
  • 举报
回复
我找到了一个比较好的方法

Bitmap bitM = new Bitmap(this.panel1.Width, this.panel1.Height); //定义Bitmap对象实例

Graphics g = Graphics.FromImage(bitM); //定义Graphics对象实例
g.Clear(panel1.BackColor);
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{

Point panPos = panel1.Parent.PointToScreen(panel1.Location);
Point textPos = n[i].Parent.PointToScreen(n[i].Location);
int x, y, w, h;
x = textPos.X - panPos.X;
y = textPos.Y - panPos.Y;
w = textPos.X;
h = textPos.Y;
g.DrawString(n[i].Text, new Font("宋体", 10, FontStyle.Regular), new SolidBrush(n[i].ForeColor), x, y);
}
this.panel1.BackgroundImage = bitM;

以上代码是将所有控件的值转成图片做panel1的背景图并且打印
但是遇到了一个问题,如何将PictureBox控件上的图一起画到bitM里面去..
大家帮帮忙...
兔子-顾问 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyq11 的回复:]
http://topic.csdn.net/u/20100707/17/7d7d1b97-ffeb-49fa-9527-f9069d85a5d5.html
[/Quote]
非常好的答案。
nnzao 2010-10-22
  • 打赏
  • 举报
回复
至于打印的位置坐标,自己可以根据情况调整
nnzao 2010-10-22
  • 打赏
  • 举报
回复
如果你想自己控件打印过程,我建议你自己循环打印Panel中的控件,大致代码如下:

Panel parentPanel; //要打印内容所在Panel

printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
//遍历Panel中所有Label和PictureBox
//
foreach (Control c in parentPanel.Controls)
{
if(c.getType() == typeof(Label))
{
e.Graphics.DrawString(c.Text, c.Font,
new SolidBrush(c.ForeColor), c.Location);
}
else if(c.getType() == typeof(PictureBox))
{
e.Graphics.DrawImage((PictureBox)c.Image, c.Location.X,
c.Location.y, c.Width, c.Height);
}
}
}
Rock870210 2010-10-22
  • 打赏
  • 举报
回复
既然是动态添加的Label,那就需要在窗体中记录添加的Label的ID和PictureBox的ID,
然后自己用GDI+定位,循环打印。
IvyAngta 2010-10-22
  • 打赏
  • 举报
回复
你截屏试一下呢! 当前界面显示什么 就打印什么 这样可以不?
Zhang_Work 2010-10-22
  • 打赏
  • 举报
回复
把要打印的DataGrid用div包含起来。
<div id="divPrint">
//需要打印的内容
</div>

2、调用JavaScript脚本打印函数。
function CallPrint()
{
var prtContent = document.getElementById("divPrint");
var WinPrint = window.open('','','resizable=yes,scrollbars=yes');
WinPrint.document.write(prtContent.innerHTML);
WinPrint.document.close();
WinPrint.focus();
WinPrint.print();
WinPrint.close();
//prtContent.innerHTML=strOldOne;

}
三岁、就很帅 2010-10-22
  • 打赏
  • 举报
回复
额没去研究过 回帖又分 嘿嘿

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧