WinForm条形码打印打印
![](https://images.cnblogs.com/cnblogs_com/liucfy/200464/r_Barcode.jpg)
图2009-07-19
对于条形码,微软VS2005自带的报表软件并没有此设计功能。虽然网上有比较多的关于在.NET下制作条形码的控件,担忧不少
功能不全,需要更多的功能的条形码控件就得付钱,最近做一个进销货存的软件就遇到了这个问题。需求就是能打印指定的条码。
如果全部自己画画出来比较费劲。所以我选择改造现有的条码控件。我就用的控件就是Cobainsoft的Barcode控件,这个控件能
够实现几种规格的条码,但是并不能实现像上图(2009-07-19这中效果),所以下面就是改造了。
1.首先把要实现上图的条形码做成一个用户控件。
该控件包含一个BarCode控件来实现条码,一个Panel来实现边框、加上几个Lable是存放商品名称、价格,并且通过封装
把需要的功能做进用户控件。要实现这个图形的边框就需要针对Panel的Paint方法编写代码。
private GraphicsPath GetGraphicsPath(Rectangle rc, int r)
{
int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height;
GraphicsPath path = new GraphicsPath();
path.AddArc(x, y, r, r, 180, 90); //
path.AddArc(x + w - r, y, r, r, 270, 90); //
path.AddArc(x + w - r, y + h - r, r, r, 0, 90); //
path.AddArc(x, y + h - r, r, r, 90, 90); //
path.CloseFigure();
return path;
}
private void panelContaioner_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Rectangle rc = new Rectangle(0+2, 0+2, this.Width - 10, this.Height -5);
SolidBrush brush = new SolidBrush(Color.Black);
Pen pen = new Pen(brush, 1);
g.DrawPath(pen, this.GetGraphicsPath(rc, 20));
}
{
int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height;
GraphicsPath path = new GraphicsPath();
path.AddArc(x, y, r, r, 180, 90); //
path.AddArc(x + w - r, y, r, r, 270, 90); //
path.AddArc(x + w - r, y + h - r, r, r, 0, 90); //
path.AddArc(x, y + h - r, r, r, 90, 90); //
path.CloseFigure();
return path;
}
private void panelContaioner_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Rectangle rc = new Rectangle(0+2, 0+2, this.Width - 10, this.Height -5);
SolidBrush brush = new SolidBrush(Color.Black);
Pen pen = new Pen(brush, 1);
g.DrawPath(pen, this.GetGraphicsPath(rc, 20));
}
2.然后我们就可以实例化该用户控件,然后将制定的值赋给该控件生成不同的条码。由于微软自带的报表控件报表项
不支持此控件,但是它支持图片,那么我们就需要把该控件生成的条码转换成图片,网上有不少方法是通过截屏来取
的图片的,这种办法在多于一个条码的时候是不好现在,幸运的是继承UserControl类的控件有一个方法DrawToBitmap
该方法支持把该控件在显示器上呈现的外观呈现到指定的位图对象。
3.把生成的图片转换成字节数组(微软的Report中的图片,如果是从数据库中取得的就要有转换成字节数组)然后传递
给报表指定的数据源就可以了。
首先实例化一个位图对象Btmp,通过DrawToBitmap方法呈现控件到该对象中,然后实例化一个内存流对象
MemoryStream ms=new MemoryStream(),通过Btmp的Save方法吧位图对象保存到内存流里面,然后通过流对象
的GetBuffer()对象获取字节数组。