本次使用的打印机是Gprinter GP-9134T
实现打印的主要代码就是
PrintDocument printDocument = new PrintDocument();
//设置边距
printDocument.PrinterSettings.DefaultPageSettings.Margins = new Margins(0,0,0,0);
//纸张大小
printDocument.DefaultPageSettings.PaperSize = new PaperSize("A4", 178, 52);
//绑定打印事件
printDocument.PrintPage += printDocument_PrintPage;
//打印
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
g.PageScale = 0.18f;//缩小比例
Bitmap bitmap = new Bitmap(445, 260);
pDraw.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
e.Graphics.DrawImage(bitmap, (int)(3 / g.PageScale), 0, bitmap.Width, bitmap.Height);
e.Graphics.DrawImage(bitmap, (int)(98 / g.PageScale), 0, bitmap.Width, bitmap.Height);
}
在点击按钮时,执行Print()
printDocument.Print();
分析
如果要实现双排打印,打印出不同的内容
我们需要清楚一点就是,每执行printDocument.Print()打印机都会打印一次,如果打印纸是单排的,则打印一张,如果打印纸是双排的,则打印两张
现在有两种方法
第一种,用两个Panel,当点击打印时,更改两个Pabel上字段的值,然后执行Print()方法
第二种,打印前将要打印的所有内容保存为图片,再执行Print(),执行printDocument_PrintPage()里,更改需要打印的图片
第一种方法,也实现过但是觉得太麻烦了,还要做第二种吧
实现
我们需要先新建一个临时的文件夹,存放图片
定义一个变量来存储打印的次数,比如打印第一张时,num++,则打印一次,执行两次num++,因为是双排打印
打印时只需将临时文件夹里的图片打印出来即可
保存图片代码
//临时目录
TempPath = DateTime.Now.ToString("yyyyMMddHHmmss");
int count = int.Parse(tbNum.Text);
int loopI = int.Parse(lbNewFidld.Text);
for (int i = 0; i < count;i++)//将控件图片保存在临时目录中
{
lbNewFidld.Text = loopI.ToString();
DrawToBitmap(pDraw, Application.StartupPath + "\\Temp\\" + TempPath, i.ToString() + ".bmp");
loopI++;
}
num = 0;
for (int i = 0; i < count / 2 + 1; i++)
{
printDocument.Print();
}
打印实现
string fileName = Application.StartupPath + "\\Temp\\" + TempPath + "\\" + num.ToString() + ".bmp";
if (File.Exists(fileName))
{
bitmap = (Bitmap)Image.FromFile(fileName);
e.Graphics.DrawImage(bitmap, (int)(3 / g.PageScale), 0, bitmap.Width, bitmap.Height);
num++;
}
fileName = Application.StartupPath + "\\Temp\\" + TempPath + "\\" + num.ToString() + ".bmp";
if (File.Exists(fileName))
{
bitmap = (Bitmap)Image.FromFile(fileName);
e.Graphics.DrawImage(bitmap, (int)(98 / g.PageScale), 0, bitmap.Width, bitmap.Height);
num++;
}
这里涉及到另一个知识点,WinForm运行时调整控件大小和位置,请看我的另一篇博文
实现这个功能,就可以在Panel编辑字段了
效果