前言
前期开发物料编码系统,用到条形码、二维码,网上查了相关标准,也从网上下载了一些条形码、二维码生成开源代码,总的来说,支持数字、字母均没有问题,支持纯汉字也没有问题,但中西文混合产生的编码,在用微信等通用扫码工具扫码时经常出错,尝试转换成UTF8再编码也不行,用很多网络在线编码系统同样存在问题。
比如:用有名的某款软件,对数字汉字混编“12青岛四方”编码,可用微信等工具扫描识别
但对“12中年”编码,通用扫码工具就不能识别了。
为此,总结编码规则,并部分采用开源代码,编写条形码、QR二维码专用类CStoneQrBarCode,主要完成两大功能,一是生成bmp文件,二是生成CBitmap,方便在屏幕或内存显示,为方便大家使用,现打包形成DLL,并在Win10+VS2015 Unicode、MBCS两种字符集环境下验证。奉献给大家(可在https://download.csdn.net/download/m0_37209607/85061668下载,也可邮件联系我szn.csr@163.com),希望对你的工作有所帮助。
DLL的使用有多种方法,这里只介绍最通用的.h+.Lib+.DLL的用法。
1、CStoneQrBarcode.h文件结构如下
#ifdef STONEQRBARCODE_EXPORTS
#define STONEQRBARCODE_API __declspec(dllexport)
#else
#define STONEQRBARCODE_API __declspec(dllimport)
#endif
//条形码类型 BarType
#define BarCode_39 0
#define BarCode_93 1
#define BarCode_128A 2
#define BarCode_128B 3
#define BarCode_128C 4
#define BarCode_I2of5 5
#define BarCode_Ean13 6
//二维码纠错等级 ErrorCorrectLevel
#define ErrorCorrectLevel_L 1
#define ErrorCorrectLevel_M 0
#define ErrorCorrectLevel_Q 3
#define ErrorCorrectLevel_H 2
class STONEQRBARCODE_API CStoneQrBarCode
{
public:
//条形码
BOOL GetBarcodeBitmap(CDC* pDC, int nBarType, const char* szBarcode, int nHPixel, CBitmap &bitmap);
BOOL CreateBarcodeBmpFile(CDC* pDC,int nBarType, const char* szBarcode, int nHPixel, const char* szBmpFile);
//二维码
BOOL GetQrcodeBitmap(CDC* pDC, const char* szQrcode, CBitmap &bitmap, int cellSize = 4, int margin = 4, int ErrorCorrectLevel = ErrorCorrectLevel_H);
BOOL CreateQrcodeBmpFile(CDC* pDC,const char* szQrcode, const char* szBmpFile, int cellSize = 4, int margin = 4, int ErrorCorrectLevel = ErrorCorrectLevel_H);
};
从文件结构不难看出,CStoneQrBarcode支持的条形码类型包括最常用的Code39、Code93、Code128A/B/C、CodeI2of5、CodeEan13七种,QR二维码纠错等级包括L,M、Q、H四种。
- BOOL CreateBarcodeBmpFile(CDC* pDC,int nBarType, const char* szBarcode, int nHPixel, const char* szBmpFile)生成条形码bmp文件,其中nHPixel为条形码高度像素;
- BOOL GetBarcodeBitmap(CDC* pDC, int nBarType, const char* szBarcode, int nHPixel, CBitmap &bitmap)生成条形码CBitmap,方便屏幕或内存显示
- BOOL CreateQrcodeBmpFile(CDC* pDC,const char* szQrcode, const char* szBmpFile, int cellSize = 4, int margin = 4, int ErrorCorrectLevel = ErrorCorrectLevel_H)生成QR二维码文件,cellSize 为单元尺寸,margin 为空格像素,ErrorCorrectLevel 为纠错级别,默认4,4,H;
注意:const char* szBarcode和const char* szQrcode为ANSI字符串,函数内部会自动识别并转换为UTF8格式,解决汉字乱码的问题。
2、DLL使用准备
将StoneQrBarcode.h、StoneQrBarcode.lib和StoneQrBarcode.dll三个文件拷贝到项目子目录下
3、在引用类.h中申明
#include "StoneQrBarcode.h"
#pragma comment(lib,"StoneQrBarcode.lib")
并添加变量
CStoneQrBarCode MyQrBarCode;
HINSTANCE hDLL; //DLL加载句柄
pragma once
#include "afxwin.h"
#include "StoneQrBarCode.h"
#pragma comment(lib,"StoneQrBarCode.lib")
// CStoneQrBarCodeDemoDlg 对话框
class CStoneQrBarCodeDemoDlg : public CDialogEx
{
// 构造
public:
CStoneQrBarCode MyQrBarCode;
HINSTANCE hDLL; //DLL加载句柄
int m_nType; //编码类型,其中0-6对应条形码Code39、Code93、Code128A/B/C、CodeI2of5、
//CodeEan13,7对应QR二维码
CRect m_rectBarcode; //条形码显示区
CRect m_rectQrcode; //QR二维码显示区
CStoneQrBarCodeDemoDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_STONEQRBARCODEDEMO_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
public:
CComboBox m_ctrlType; //类型
CString m_strCode; //编码
afx_msg void OnBnClickedCancel();
afx_msg void OnBnClickedFile();
afx_msg void OnBnClickedShow();
};
4、在应用.cpp中使用CStoneQrBarCode
- 生成条形码CBitmap并显示
CBitmap bitmap;
USES_CONVERSION;
char* szCode = T2A(m_strCode.GetBuffer(0));
CBitmap bitmap, *pOldBmp;
CDC memdc;
BITMAP bm;
memdc.CreateCompatibleDC(&dc);
dc.SetStretchBltMode(HALFTONE);//解决图像拉伸造成的失真
MyQrBarCode.GetBarcodeBitmap(&dc, m_nType, szCode, m_rectBarcode.Height(), bitmap);
bitmap.GetBitmap(&bm);
pOldBmp = (CBitmap *)memdc.SelectObject(&bitmap);
dc.StretchBlt(m_rectBarcode.left, m_rectBarcode.top, m_rectBarcode.Width(), m_rectBarcode.Height(), &memdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
- 生成条形码bmp文件
CDC *pDC = GetDC();
USES_CONVERSION;
char* szCode = T2A(m_strCode.GetBuffer(0));
MyQrBarCode.CreateBarcodeBmpFile(pDC, m_nType, szCode, 100, "Barcode.bmp"); //条形码高度100像素
- 生成QR二维码CBitmap
CBitmap bitmap;
USES_CONVERSION;
char* szCode = T2A(m_strCode.GetBuffer(0));
CBitmap bitmap, *pOldBmp;
CDC memdc;
BITMAP bm;
memdc.CreateCompatibleDC(&dc);
dc.SetStretchBltMode(HALFTONE);//解决图像拉伸造成的失真
MyQrBarCode.GetQrcodeBitmap(&dc, szCode, bitmap);
bitmap.GetBitmap(&bm);
pOldBmp = (CBitmap *)memdc.SelectObject(&bitmap);
dc.StretchBlt(m_rectQrcode.left, m_rectQrcode.top, m_rectQrcode.Width(), m_rectQrcode.Height(), &memdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
- 生成QR二维码bmp文件
CDC *pDC = GetDC();
USES_CONVERSION;
char* szCode = T2A(m_strCode.GetBuffer(0));
MyQrBarCode.CreateQrcodeBmpFile(pDC, szCode, "Qrcode.bmp");
5、总结
随着智能手机、智能设备的普及,条形码、二维码已成为不可或缺的ID元素,希望CStoneQrBarCode能为你的编程开发带来一些便利,有什么好的意见建议,忘不惜赐教!csr.szn@163.com