1.Invoke 跨线程访问
有些回调函数不能直接访问控件的属性,这时就需要用到这个。
用法:
Invoke(new Action(() =>
{
//正常代码
receiveCount++;
tb_recvCount.Text = Convert.ToString(receiveCount);
}));
2.控制打印机打印
2.1.绘制表格
准备一个 panel ,在里面放入 label ,将 label 的宽度设置为 1 或者 2 ,背景色改为黑色,就能得到一根直线,再放入几个 label 作为文本容器。
2.2.填充数据
使用 label ,给 label.Text 赋值即可。
2.3.开始打印
在页面中添加如下两个控件。
将 printPreviewDialog 的 Document 属性设置为 刚刚添加的 printDocument 。
在 printDocument 的 PrintPage 事件中绘制打印的内容。
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
//打印内容 为 局部的 this.panel1
Bitmap _NewBitmap = new Bitmap(panel_label.Width, panel_label.Height);
panel_label.DrawToBitmap(_NewBitmap, new Rectangle(0, 0, _NewBitmap.Width, _NewBitmap.Height));
e.Graphics.DrawImage(_NewBitmap, 0, 0, _NewBitmap.Width, _NewBitmap.Height);
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
Pen pen01 = new Pen(Color.Black, 0.5f);
//g.DrawLine(pen01, 5, 93, 233, 93);
}
3.威纶通触摸屏使用MQTT发送打印指令
- 触摸屏的MQTT发送的数据为 JSON 格式,带有 “d” 层和时间戳,值为数组格式,访问时应访问:
json["d"]["SN"][0]
- 触摸屏发送打印指令,使用位状态切换开关,操作模式为“设为ON”。这样点击打印按钮之后,直到 MQTT 发布完成, LB-20 都为 true ,如果设置为 “切换开关”,MQTT发送的时候 LB-20 很可能为 false ,为 false 不打印。
- 以下是发送的 MQTT 主题,发送模式为触发式,触发地址为第 2 点提到的 LB-20 。
- 发送的信息有 LB-20 ,打印机控制程序通过判断 Print 的值是否为 true 来判断是否打印这条讯息,如果点击打印之后,发送过去的 Print 为 false 。打印机就不会打印 。
4.打印机控制程序接收打印信息
4.1.使用 MQTT 客户端订阅讯息
获得触摸屏发送到 MQTT 服务器的讯息,解析讯息为 JSON 格式。
4.2.判断 Print 是否为 true
为 true 则将数据填充到表格,切换默认打印机,开始打印。
切换默认打印机的代码如下:
class SetPrinter
{
[DllImport("winspool.drv")]
public static extern bool SetDefaultPrinter(String Name); //调用win api将指定名称的打印机设置为默认打印机
}
5.打印机配置
5.1. 配置特定机台对应特定的打印机
如下图,以主题来区分机台。
5.2. 获取打印机列表
private void mbtn_getPrinterList_Click(object sender, EventArgs e)//获取打印机列表
{
cbb_printerList.Items.Clear();
int i;