当然,写到这,肯定是能打印了
如果要做到超市小票的打印有以下几个问题:
1.小票需要在后台打印
2.小票没有分页,或者说,小票的长度是0,或者是无限长
后台打印就要用到微软的那篇文章了,http://msdn.microsoft.com/zh-cn/library/ms252172(VS.80).aspx#Y120
这篇文章好是好,并且在网上很多版本,但是这段代码是有问题的
private
void
PrintPage(
object
sender, PrintPageEventArgs ev)
{
Metafile pageImage =
new
Metafile(m_streams[m_currentPageIndex]);
<span style=
"color: #ff0000;"
> ev.Graphics.DrawImage(pageImage, 0, 0);</span>
m_currentPageIndex++;
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}
|
这段代码,注意红色那句,通过PrintPageEventArgs 把通过stream生成的PageImage画出来的一步,(PrintPageEventArgs 的属性是对应的所设置打印机的属性,例如:设定A4纸,则PageBounds就是A4纸的大小)
<span style=
"color: #ff0000;"
> ev.Graphics.DrawImage(pageImage, 0, 0);</span>
|
这句话的原型应该是
public void DrawImage( Image image, x, y)
在0,0位置把pageImage输出出来,可事实上根本不行,并且输出的字体大小,格式都很糟糕,无法控制。
后来看这段代码的VB代码里面却是
ev.Graphics.DrawImage(pageImage, ev.PageBounds)
我也依葫芦画瓢的换成了ev.PageBounds(是PageBounds不是MarginBounds否则又要出问题)效果很好,并且把报表应该有的样式输出来了,解决了上面提到的问题1.
同时通过页面设置把 Margins都设置成零,问题2也能解决了。
还有一个问题就是打印的时候,会弹出一个框,提示”正在打印“,这个问题
StandardPrintController spc=new StandardPrintController(); pdoc.PrintController=spc;
通过上面的代码就能去掉(StandardPrintController 指定一个打印控制器,它向打印机发送信息。)
还是非常感谢这个文章的内容。
下面这篇则是比较全,并且在 ev.Graphics.DrawImage(pageImage, 0, 0);做了修改
至此,应该就能打印出一个漂亮的报表了,并且速度还行。
演练:在不预览的情况下打印本地报表
http://msdn.microsoft.com/zh-cn/library/ms252091(v=VS.90)#Y720