程序运行背景条件:

1、将扫码枪调制串口驱动模式

2、将扫码枪所在串口拆分成几个虚拟串口

3、扫码枪扫描条码就打印条码

4、WinForm程序

条码控件使用 DevExpress.XtraEditors.BarCodeControl   控件 BarMa

BarMa 控件加载时将文本居中

BarMa.VerticalAlignment = DevExpress.Utils.VertAlignment.Center;
BarMa.HorizontalAlignment = DevExpress.Utils.HorzAlignment.Near;
BarMa.HorizontalTextAlignment = DevExpress.Utils.HorzAlignment.Center;
BarMa.VerticalTextAlignment = DevExpress.Utils.VertAlignment.Center;

BarMa 添加事件

BarMa.TextChanged += BarMa_TextChanged;
BarMa.Paint += BarMa_Paint;

为窗体添加printPreviewDialog和printDocument控件

printPreviewDialog1的Document属性设置为printDocument1

printDocument1添加事件  printDocument1.PrintPage += PrintDocument1_PrintPage;

虚拟串口:

SerialPort spReceive; //spReceive接受数据
private delegate void MyDelegate(string indata);
private MyDelegate showDelegate = null;

spReceive = new SerialPort(cbReviceSerial.SelectedItem.ToString(), Convert.ToInt32(cbDataRate.SelectedItem.ToString()), Parity.None, 8, StopBits.One);
spReceive.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
spReceive.Open();
showDelegate = new MyDelegate(show);

//串口数据监听事件

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
this.Invoke(showDelegate, new object[] { sp.ReadExisting() });
}
void show(string indata)
{
txtBarCode.Text = indata;
BarMa.Text = indata;
}

private void BarMa_TextChanged(object sender, EventArgs e)
{
btnCreat_Click(sender, e);
}

//生成条码事件

private void btnCreat_Click(object sender, EventArgs e)
{
BarMa.Text = txtBarCode.Text.Trim();
BarMa.Size = new Size(Convert.ToInt32(txtBarW.Text), Convert.ToInt32(txtBarH.Text));
}

//条码控件重绘事件。在条码重绘事件中打印条码可以有效的将条码重绘之后的条码打印,在其他情况下打印条码会打印之前的条码

private void BarMa_Paint(object sender, PaintEventArgs e)
{
if (iOpent)//虚拟串口打开状态下
{
captureScreen(BarMa); //绘制条形码
 printDocument1.Print();
}
}

//打印条码事件

private void btnPrint_Click(object sender, EventArgs e)
{
captureScreen(BarMa); //绘制条形码
printDocument1.Print();
}

#region 绘制条形码

/// <summary>
/// 绘制条形码
/// </summary>
private void captureScreen(Control control)
{
using (Graphics g = control.CreateGraphics())
{
Size s = control.Size;
mImage = new Bitmap(s.Width, s.Height, g); //实例化Bitmap对象
using (Graphics mg = Graphics.FromImage(mImage)) //实例化Graphics画图对象
{
IntPtr dc1 = g.GetHdc(); //获取panel句柄
IntPtr dc2 = mg.GetHdc(); //获取绘图对象句柄
//绘制panel控件中内容
BitBlt(dc2, 0, 0, control.Width, control.Height, dc1, 0, 0, 13369376);
g.ReleaseHdc(dc1); //释放panel句柄资源
mg.ReleaseHdc(dc2); //释放绘图对象句柄资源
}
}
}

private void PrintDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawImage(mImage, 0, 0); //img大小
e.HasMorePages = false;
//e.Graphics.DrawString(BarMa.Text, FT, System.Drawing.Brushes.Black, 0, 0);
}

#endregion

#region 将一幅位图从一个设备场景复制到另一个
/// <summary>
/// 将一幅位图从一个设备场景复制到另一个
/// </summary>
/// <param name="hdcDest">目标设备场景</param>
/// <param name="nXDest">对目标DC中目标矩形左上角位置进行描述的那个点,用目标DC的逻辑X坐标表示</param>
/// <param name="nYDest">对目标DC中目标矩形左上角位置进行描述的那个点,用目标DC的逻辑Y坐标表示</param>
/// <param name="nWidth">欲传输图象的宽度</param>
/// <param name="nHeight">欲传输图象的高度</param>
/// <param name="hdcSrc">源设备场景,如光栅运算未指定源,则应设为0</param>
/// <param name="nXSrc">对源DC中源矩形左上角位置进行描述的那个点用源DC的逻辑X坐标表示</param>
/// <param name="nYSrc">对源DC中源矩形左上角位置进行描述的那个点用源DC的逻辑Y坐标表示</param>
/// <param name="dwRop">传输过程要执行的光栅运算</param>
/// <returns>非零表示成功,零表示失败</returns>
[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);

#endregion

C# 霍尼韦尔扫码枪扫码打印的更多相关文章

  1. 霍尼韦尔1450g二维码扫码枪中文识别。

    USB接口模拟COM串口驱动程序 HSM USB Serial Driver 链接: https://pan.baidu.com/s/1aOV-Fz0OYdQGc5dMmkHzgg 提取码: fwgt ...

  2. C# serialPort的DataReceived事件无法触发 ,用的霍尼韦尔的扫码枪并且装了相应的USB转串口驱动。

    昨天想试试霍尼韦尔的扫码枪,扫码枪有两种模式,键盘模式和串口模式, 1.键盘模式直接插上就行了,就像一个键盘一样不需要任何驱动,扫出来的数据直接落到PC的输入焦点上.就像一个键盘一样,只能输入字符. ...

  3. 霍尼韦尔FC400A与FC400B的区别

    给霍尼韦尔官方打电话咨询了下,发现两者区别不大,唯一的区别是400B可以和主机联动,也就是主机关的时候,400B也可以自动关闭,不需要手动去关闭电源,这样非常方便. 本来官方是只有400A的时候,但是 ...

  4. C# 无焦点获取扫码枪扫码信息

    代码网上有的是,多是需要窗体焦点直接show出扫码信息(usb,模拟键盘,hook) 怎样才能真的无焦点获取? 用串口方式 usb转串口 以接收串口通讯消息的方式获取扫码信息

  5. alipay 当面付扫码支付实战开发

    alipay 当面付扫码支付开发 参考官网地址:https://opendocs.alipay.com/open/194/105072 1.当面付介绍: 当面付包括付款码支付和扫码支付两种收款方式.适 ...

  6. 微信公众号 扫码支付 模式二 demo

    扫码支付 本文附有代码,在下方,如果不熟悉场景的可以看看下面的场景介绍 场景介绍 官网介绍地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?ch ...

  7. Odoo 仓库扫码打包方案

        Odoo仓库扫码的设计,前提是操作人在PC上先做好分拣单,然后根据打印出来的分拣单去仓库进行扫码打包,默认的情况下,分拣在被确认的时候会自动保留库位中已经存在的库存(已经分配批次\序列号),而 ...

  8. ASP.NET Core 2.0 支付宝当面付之扫码支付

    前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等.我本人是很喜欢.net的,并 ...

  9. Thinkphp5整合微信扫码支付开发实例

    ThinkPHP框架是比较多人用的,曾经做过的一个Thinkphp5整合微信扫码支付开发实例,分享出来大家一起学习 打开首页生成订单,并显示支付二维码 public function index() ...

随机推荐

  1. vue 中使用sass实现主体换肤

    有如下代码要实现换肤功能 <template> <div class="app-root" :class="themeClass"> & ...

  2. Fundebug微信小程序错误监控插件更新至1.1.0,新增test()与notifyHttpError()方法

    摘要: 1.1.0新增fundebug.test()和fundebug.notifyHttpError()方法,同时大小压缩至15K. Fundebug是专业的小程序BUG监控服务,可以第一时间为您捕 ...

  3. CSS消除button标签的默认样式

    button{ /*消除button的默认样式*/ /*这种写法是对所有的button标签同时生效*/ margin: 0px; padding: 0px; /*自定义边框*/ border: 0px ...

  4. Vscode新建html文件

    在Vscode新建html文件 1.点击Open Folder: 2.选择目标文件夹,新建一个拓展名为html的文件: 3.在第1行输入!(英文状态下),按tab键,新建成功.界面如下图所示:

  5. 首发福利!全球第一开源ERP Odoo系统架构部署指南 电子书分享

    引言 Odoo,以前叫OpenERP,是比利时Odoo S.A.公司开发的一个企业应用软件套件,开源套件包括一个企业应用快速开发平台,以及几千个Odoo及第三方开发的企业应用模块.Odoo适用于各种规 ...

  6. Echarts 南海诸岛简图显示位置调整

        最近需要echart同时显示海南岛和南海诸岛,开始想寻找南海诸岛的数据,经过查找,这种简图数据是没有的(china.js地图数据一一找过了),下图是echarts的一些示例,没有满足我们的要求 ...

  7. Android组件化探索与实践

    什么是组件化 不用去纠结组件和模块语义上的区别,如果模块间不存在强依赖且模块间可以任意组合,我们就说这些模块是组件化的. 组件化的好处 实现组件化本身就是一个解耦的过程,同时也在不断对你的项目代码进行 ...

  8. Python写爬虫爬妹子

    最近学完Python,写了几个爬虫练练手,网上的教程有很多,但是有的已经不能爬了,主要是网站经常改,可是爬虫还是有通用的思路的,即下载数据.解析数据.保存数据.下面一一来讲.   1.下载数据 首先打 ...

  9. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

  10. Scanner对象及其获取数据出现小问题和解决方案

    Scanner类简介: Java 5添加了java.util.Scanner类,我们可以通过Scanner类来获取用户输入.它是以前的StringTokenizer和Matcher类之间的某种结合.由 ...