• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

VC++条形码、二维码生成DLL应用

武飞扬头像
CRRC_Shizhongnian
帮助1

前言

前期开发物料编码系统,用到条形码、二维码,网上查了相关标准,也从网上下载了一些条形码、二维码生成开源代码,总的来说,支持数字、字母均没有问题,支持纯汉字也没有问题,但中西文混合产生的编码,在用微信等通用扫码工具扫码时经常出错,尝试转换成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
系列文章
更多 icon
同类精品
更多 icon
继续加载