首页 > 其他分享 >基于soui4实现一个打印排版软件(六)条形码元素控件

基于soui4实现一个打印排版软件(六)条形码元素控件

时间:2024-09-01 18:22:43浏览次数:15  
标签:控件 rcTmp 条形码 void point CPoint CEleBarcode soui4 symbol

条码生成使用了开源库zint。该库实现了全部的常用码制。
在项目头文件中将库导入项目:

//zint
#include "../zint/include/backend/zint.h"
#ifdef _DEBUG
#pragma comment(lib, "../zint/lib/debug/zint.lib")
#else
#pragma comment(lib, "../zint/lib/release/zint.lib")
#endif 

条码元素的移动、拉伸参考rect的实现,这里我们主要看看条码的绘制部分代码

#pragma once
#include "CEleBase.h"
class CEleBarcode : public CEleBase
{
	DEF_SOBJECT(SWindow, L"ele_barcode")
public:
	CEleBarcode();
	~CEleBarcode();
public:
	void OnPaint(IRenderTarget* pRT);
protected:
	LRESULT OnCreate(LPVOID);
	void OnLButtonDown(UINT nFlags, SOUI::CPoint point);
	void OnLButtonUp(UINT nFlags, SOUI::CPoint point);
	void onm ouseMove(UINT nFlags, SOUI::CPoint point);
	void OnLButtonDblClk(UINT nFlags, SOUI::CPoint point);
	void OnRButtonUp(UINT nFlags, CPoint point);

protected:
	SOUI_MSG_MAP_BEGIN()
		MSG_WM_CREATE(OnCreate)
		MSG_WM_PAINT_EX(OnPaint)

		MSG_WM_LBUTTONDOWN(OnLButtonDown)
		MSG_WM_LBUTTONUP(OnLButtonUp)
		MSG_WM_LBUTTONDBLCLK(OnLButtonDblClk)
		MSG_WM_RBUTTONUP(OnRButtonUp)
		MSG_WM_MOUSEMOVE(OnMouseMove)

		SOUI_MSG_MAP_END()
private:
	CPoint  m_ptDown;
	EcPosType m_curEcPosType;
};
#include "stdafx.h"
#include "CEleBarcode.h"

CEleBarcode::CEleBarcode()
{
	//
}

CEleBarcode::~CEleBarcode()
{
	//
}

void CEleBarcode::OnPaint(IRenderTarget* pRT)
{
	SetMsgHandled(FALSE);
	pRT->SetAntiAlias(TRUE);
	CRect rcWindow = GetWindowRect();

	SStringW sstrContent = L"0123456789";
	//计算文本所占的大小
	SIZE szContent;
 	pRT->MeasureText(sstrContent, sstrContent.GetLength(), &szContent);

	//将绘制条码的区域跟绘制文本的区域分开(此处只考虑文本在下方的情况,如有其他的需求可自己实现)
	CRect rcBar(rcWindow);
	rcBar.bottom = rcBar.bottom - szContent.cy;
	CRect rcText(rcWindow);
	rcText.top = rcBar.bottom;

	std::string strContent = S_CW2A(sstrContent);
	struct zint_symbol* symbol;
	symbol = ZBarcode_Create();
	symbol->symbology = BARCODE_CODE128;
	symbol->input_mode = DATA_MODE; //编码格式
	int nRet = ZBarcode_Encode_and_Buffer_Vector(symbol, (unsigned char*)strContent.c_str(), strContent.size(), 0);
	if (nRet == 0)
	{
		ZBarcode_Print(symbol, 0);
		std::vector<CRect> vecLines;
		if (symbol->vector)
		{
			struct zint_vector_rect* rect = symbol->vector->rectangles;
			while (rect)
			{
				CRect rcLine;
				rcLine.left = rect->x;
				rcLine.top = rect->y;
				rcLine.right = rcLine.left + rect->width;
				rcLine.bottom = rcLine.top + rect->height;
				vecLines.push_back(rcLine);
				rect = rect->next;
			}
			double nDrawUint = (double)rcBar.Width() / symbol->width;
			double nUint = (double)symbol->bitmap_width / symbol->width;
			
			CAutoRefPtr<IPathS> path;
			GETRENDERFACTORY->CreatePath(&path);
			for (int i = 0; i < vecLines.size(); i++)
			{
				CRect rcTmp(vecLines[i]);
				rcTmp.left = rcTmp.left / nUint * nDrawUint;
				rcTmp.right = rcTmp.right / nUint * nDrawUint;
				rcTmp.bottom = rcTmp.top + rcBar.Height();
				
				CRect rcBlack;
				rcBlack.left += rcTmp.left + rcBar.left;
				rcBlack.top += rcTmp.top + rcBar.top;
				rcBlack.right = rcBlack.left + rcTmp.Width();
				rcBlack.bottom = rcBlack.top + rcTmp.Height();
				path->addRect(rcBlack);
			}

			COLORREF clrFrg = GETCOLOR(L"RGB(0,0,0)");
			CAutoRefPtr<IBrush> brush, oldbrush;
			pRT->CreateSolidColorBrush(clrFrg, &brush);
			pRT->SelectObject(brush, (IRenderObj**)&oldbrush);
			pRT->FillPath(path);
			pRT->SelectObject(oldbrush, NULL);

			//绘制文本
			{
				pRT->DrawText(sstrContent, -1, (LPRECT)rcText, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
			}
		}
	}
	//...
}

LRESULT CEleBarcode::OnCreate(LPVOID)
{
	SetMsgHandled(FALSE);
	//生成元素ID
	std::string strUUID = CGlobalUnits::GetInstance()->GenerateUUID();
	m_strUUID = strUUID;

	return __super::OnCreate(NULL);
}

void CEleBarcode::OnLButtonDown(UINT nFlags, SOUI::CPoint point)
{
	SetMsgHandled(FALSE);
	SetCapture();

	//...
}
void CEleBarcode::OnLButtonUp(UINT nFlags, SOUI::CPoint point)
{
	SetMsgHandled(FALSE);
	ReleaseCapture();
	//...
}
void CEleBarcode::OnMouseMove(UINT nFlags, SOUI::CPoint point)
{
	SetMsgHandled(FALSE);
	//...
}
void CEleBarcode::OnLButtonDblClk(UINT nFlags, SOUI::CPoint point)
{
	SetMsgHandled(FALSE);
}
void CEleBarcode::OnRButtonUp(UINT nFlags, CPoint point)
{
	SetMsgHandled(FALSE);
}

控件使用:
先注册,再在容器中创建元素

m_theApp->RegisterWindowClass<CEleBarcode>();
	CEleBarcode* pEle = (CEleBarcode*)SApplication::getSingleton().CreateWindowByName(L"ele_barcode");
	SASSERT(pEle);
	SApplication::getSingleton().SetSwndDefAttr(pEle);
	this->InsertChild(pEle);
	pEle->SSendMessage(WM_CREATE);
	CPoint ptReal(point);
	ptReal.x -= rcContainer.left;
	ptReal.y -= rcContainer.top;

	SStringT sstrRectPos;
	sstrRectPos.Format(_T("%d,%d,@%d,@%d"), ptReal.x, ptReal.y, 100, 30);
	pEle->SetAttribute(L"pos", sstrRectPos);

	//将位置、长宽等信息转为毫米
	CPoint ptRB(ptReal.x + 100, ptReal.y + 30);
	pEle->m_ptLT = ptReal;
	pEle->m_ptRB = ptRB;

以上就是条码控件的实现以及使用,此处只实现了CODE128码,其他码制的实现类似。需要注意的是这里文本跟条码的绘制是分开绘制的。如果是EAN8、EAN13、UPCA或者UPCE此类长短不一的线条还需要做特殊的处理。
在这里插入图片描述

标签:控件,rcTmp,条形码,void,point,CPoint,CEleBarcode,soui4,symbol
From: https://blog.csdn.net/ceffans/article/details/141785227

相关文章

  • 【Material-UI】Switches with FormGroup:如何有效管理多选控件
    文章目录一、Switch组件与FormGroup的基本概述1.Switch组件简介2.FormGroup组件的作用二、SwitcheswithFormGroup的应用场景三、如何实现SwitcheswithFormGroup1.代码详解2.事件处理四、使用FormGroup的注意事项1.确保控件关联性2.多选情况下的替代......
  • .NET 多版本兼容的精美 WinForm UI控件库
    目录前言项目介绍项目使用项目源码项目案例项目组件项目地址前言有粉丝小伙伴在后台留言咨询有没有WinForm控件库推荐,现在就给安排上。.NET平台进行Windows应用程序开发的我们来说,找一个既美观又实用的WinFormUI控件库至关重要。本文将介绍ReaLTaiizor一......
  • 【Qt笔记】QListView控件详解
     目录引言一、QListView基本概念1.1定义与功能1.2架构原理二、QListView基本使用2.1创建QListView和Model2.2设置QListView的属性2.3处理用户交互三、QListView高级技巧3.1自定义委托3.2使用QStandardItemModel3.3实现拖放功能四、QListView......
  • pygame封装常用控件,第二日,有滑块的文本显示域
    #coding=utf-8importos,sys,re,timeimportpygameimportrandomfromwin32apiimportGetSystemMetricsfromtkinterimportmessageboxpygame.init()pygame.display.set_caption("我的控件")percent=0.6screen_width=GetSystemMetrics(0)screen_heig......
  • QT在控件graphicsView中绘制箭头
    这里写自定义目录标题前言:基础夯实:成功效果展示:失败效果展示:核心代码:前言:对之前箭头没有成功绘制的补充,因为没有直接的箭头项,所以需要自己进行绘制基础夯实:可以直接看,建议看一下之前的绘制过程在控件graphicsView中实现绘图功能(一)在控件graphicsView中实现绘图功......
  • 【C#】【WinForm】 按功能列出常见窗体控件
    Windows窗体提供执行多个功能的控件和组件。下表按常规功能列出了Windows窗体控件和组件。此外,如果存在多个提供相同功能的控件,则会列出推荐的控件,并附有关于它所取代的控件的说明。在单独的后续表中,列出了被取代的控件及其建议的替换项。按功能列出的推荐控件和组件......
  • 界面控件Telerik UI for ASP.NET Core 2024 Q2亮点 - AI与UI的融合
    TelerikUIforASP.NETCore是用于跨平台响应式Web和云开发的最完整的UI工具集,拥有超过60个由KendoUI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格,提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。本文将介绍界面组件TelerikUIforASP.NETCore在今年......
  • 知名界面控件包DevExpress v24.1.5全新来袭——发布一些重要更改
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress近期重要版本v24.1已正式发布,该版本拥有众多新产品和数十个具有高影响力的功......
  • 关于shadow-root影子控件的selenium ui自动化
    首先这个控件和iframe有异曲同工之妙,也是嵌套的一个html,所以定位不能像普通定位一样下面实践一下首先准备一个root.html<!DOCTYPEhtml><html><head><title>带有shadow-root的页面</title></head><body><h1class="test">带有shadow-root的页面</h1>......
  • pygame封装连个常用控件
    #coding=utf-8importos,sys,re,timeimportpygameimportrandomfromwin32apiimportGetSystemMetricsfromtkinterimportmessageboxpygame.init()pygame.display.set_caption("我的控件")percent=0.6screen_width=GetSystemMetrics(0)screen_heig......