VC++条形码、二维码生成DLL应用
前言
前期开发物料编码系统,用到条形码、二维码,网上查了相关标准,也从网上下载了一些条形码、二维码生成开源代码,总的来说,支持数字、字母均没有问题,支持纯汉字也没有问题,但中西文混合产生的编码,在用微信等通用扫码工具扫码时经常出错,尝试转换成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
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggecia
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13