当前位置: 首页 > news >正文

MFC 中创建并显示二维码

1.创建并显示

QRcode* pQR_Encode;


    pQR_Encode = QRcode_encodeString("12345678901234567890", 0, QR_ECLEVEL_H, QR_MODE_8, 1);
    if (pQR_Encode)
    {
        int nBmpWidth = pQR_Encode->width;

        //获取控件的边界大小  
        CRect rect;
        GetDlgItem(IDC_PIC)->GetClientRect(&rect);
        CStatic* pic =(CStatic * )GetDlgItem(IDC_PIC);
        
        //定义并创建一个内存设备环境DC  
        CDC* pCurCDC = GetDlgItem(IDC_PIC)->GetDC();
        //CDC *pCurCDC = GetDC();
        //创建兼容性的DC  
        CDC* pWorkDC = new CDC;
         
        pWorkDC->CreateCompatibleDC(pCurCDC);
        //pWorkDC->CreateCompatibleDC(NULL);

         CBitmap workBitmap;

         CBitmap backBitmap;

         CDC* pBackDC = new CDC;

         pBackDC->CreateCompatibleDC(pCurCDC);
         


        //workBitmap.CreateCompatibleBitmap(pWorkDC, nBmpWidth, nBmpWidth);


        workBitmap.CreateCompatibleBitmap(pWorkDC, rect.Width(), rect.Height());

        backBitmap.CreateCompatibleBitmap(pBackDC, rect.Width(), rect.Height());

        CBitmap* pOldBitmap = pWorkDC->SelectObject(&workBitmap);//将位图选入临时内存设备环境

        CBitmap* pbackBitmap = pBackDC->SelectObject(&backBitmap);

        // 背景全部画成白色
        pWorkDC->PatBlt(0, 0, nBmpWidth, nBmpWidth, WHITENESS);
    //    pBackDC->PatBlt(0, 0, nBmpWidth, nBmpWidth, WHITENESS);

        // 根据二维码内容绘制位图
        unsigned char* pSourceData = pQR_Encode->data;

        for (int i = 0; i < pQR_Encode->width; ++i)
        {
            for (int j = 0; j < pQR_Encode->width; ++j)
            {
                if (*pSourceData & 1)
                {
                    pWorkDC->SetPixel(i, j, RGB(0, 0, 0));
                    //pCurCDC->SetPixel(i, j, RGB(0, 0, 0));
                }
                pSourceData++;
            }
        }
        pic->ModifyStyle(SS_ENHMETAFILE, SS_BITMAP | SS_CENTERIMAGE);
        //pic->ModifyStyle(SS_ENHMETAFILE, SS_BITMAP | SS_REALSIZEIMAGE);
        
        //pic->SetBitmap(HBITMAP(pWorkDC->GetCurrentBitmap()->GetSafeHandle()));
        //pic->SetBitmap((HBITMAP )workBitmap.GetSafeHandle());
        // 图片显示调用函数stretchBlt 
        //::StretchBlt(pCurCDC->GetSafeHdc(),335, 33, 150, 150, pWorkDC->GetSafeHdc(), 0, 0,nBmpWidth, nBmpWidth, SRCCOPY);

        pBackDC->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), pWorkDC, 0, 0, nBmpWidth, nBmpWidth, SRCCOPY);

    //    pic->SetBitmap(HBITMAP(pCurCDC->GetCurrentBitmap()->Detach()));

        pWorkDC->SelectObject(pOldBitmap);

    

        pBackDC->SelectObject(pbackBitmap);
        
        pic->SetBitmap((HBITMAP)backBitmap.Detach());

        DeleteObject(pOldBitmap); //删除内存中的位图  
        DeleteObject(pbackBitmap); //删除内存中的位图  
        pWorkDC->DeleteDC(); //删除CreateCompatibleDC得到的图片DC

        delete pWorkDC;
        pBackDC->DeleteDC();
        delete pBackDC;


        ReleaseDC(pCurCDC); //释放获取的DC句柄
        QRcode_free(pQR_Encode);
    }

2.创建并保存为图像文件

void GenerateQRcode(char* msg) {

    unsigned int    unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;
    unsigned char* pRGBData, * pSourceData, * pDestData;
    QRcode* pQRC;
    FILE* f;

    if (pQRC = QRcode_encodeString(msg, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
    {
        unWidth = pQRC->width;
        unWidthAdjusted = unWidth * 8 * 3;
        if (unWidthAdjusted % 4)
            unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
        unDataBytes = unWidthAdjusted * unWidth * 8;

        // Allocate pixels buffer

        if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
        {
            exit(-1);
        }
        // Preset to white

        memset(pRGBData, 0xff, unDataBytes);


        // Prepare bmp headers
        // 位图文件头
        BITMAPFILEHEADER kFileHeader;

        kFileHeader.bfType = 0x4d42;  // 位图文件的类型,必须为"BM"
        kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) +
            sizeof(BITMAPINFOHEADER) + unDataBytes;// 位图文件的大小
        kFileHeader.bfReserved1 = 0;// 位图文件保留字,必须为0
        kFileHeader.bfReserved2 = 0;// 位图文件保留字,必须为0
        kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) +
            sizeof(BITMAPINFOHEADER);// 位图数据的起始位,位图文件头+位图信息头+调色板的大小

        // 位图信息头
        BITMAPINFOHEADER kInfoHeader;
        kInfoHeader.biSize = sizeof(BITMAPINFOHEADER);// 本结构所占用字节数
        kInfoHeader.biWidth = unWidth * 8; // 位图的宽度,以像素为单位
        kInfoHeader.biHeight = ((int)unWidth * 8);// 位图的高度,以像素为单位
        kInfoHeader.biPlanes = 1;// 目标设备的级别,必须为1
        kInfoHeader.biBitCount = 24; // 每个像素所需的位数,必须是1(双色)、
                                    //4(16色)、8(256色)或24(真彩色)之一
        kInfoHeader.biCompression = BI_RGB;// 位图压缩格式,必须是0,不压缩
        kInfoHeader.biSizeImage = 0; // 位图的大小,以字节为单位
        kInfoHeader.biXPelsPerMeter = 0; // 位图水平分辨率
        kInfoHeader.biYPelsPerMeter = 0; // 位图垂直分辨率
        kInfoHeader.biClrUsed = 0; // 位图实际使用的颜色表中的颜色数
        kInfoHeader.biClrImportant = 0; // 位图显示过程中重要的颜色数,0表示所有的颜色都重要

        // Convert QrCode bits to bmp pixels

        pSourceData = pQRC->data;
        for (int y = unWidth - 1; y >= 0; y--)
        {
            pDestData = pRGBData + unWidthAdjusted * y * 8;
            // y

            for (x = 0; x < unWidth; x++)
            {
                if (*pSourceData & 1)
                {

                    for (int l = 0; l < 8; l++)
                    {
                        for (int n = 0; n < 8; n++)
                        {
                            *(pDestData + n * 3 + unWidthAdjusted * l) = 0;
                            *(pDestData + 1 + n * 3 + unWidthAdjusted * l) = 0;
                            *(pDestData + 2 + n * 3 + unWidthAdjusted * l) = 0;
                        }
                    }
                }
                pDestData += 3 * 8;
                pSourceData++;
            }
        }
        // Output the bmp file
        if (!(fopen_s(&f, "temp.bmp", "wb")))
        {
            fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);
            fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
            fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);
            fclose(f);
        }
        else
        {
            printf("Unable to open file");
            exit(-1);
        }
        // Free data
        free(pRGBData);
        QRcode_free(pQRC);
    }
    else
    {
        printf("NULL returned");
        exit(-1);
    }
}

相关文章:

MFC 中创建并显示二维码

1.创建并显示 QRcode* pQR_Encode; pQR_Encode QRcode_encodeString("12345678901234567890", 0, QR_ECLEVEL_H, QR_MODE_8, 1); if (pQR_Encode) { int nBmpWidth pQR_Encode->width; //获取控件的边界大小 CRect rect; Ge…...

NX二次开发UF_CAM_set_clear_plane_tag 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_set_clear_plane_tag Defined in: uf_cam_planes.h int UF_CAM_set_clear_plane_tag(tag_t object_tag, tag_t target_tag ) overview 概述 Set the tag of a clearance pl…...

计算机网络:数据链路层

0 本节主要内容 问题描述 解决思路 1 问题描述 数据链路层主要面临四个问题&#xff1a; 封装成帧&#xff1b;透明传输&#xff1b;差错检测&#xff1b;实现相邻节点之间的可靠通信。 1.1 子问题1&#xff1a;封装成帧 怎么知道数据从哪里开始&#xff1f;到哪里结束&a…...

电线电缆行业生产管理怎么数字化?

行业介绍 随着市场环境的变化和现代生产管理理念的不断更新&#xff0c;电缆的生产模式也在发生转变&#xff0c;批量小&#xff0c;规格多&#xff0c;交期短的新型制造需求逐年上升&#xff0c;所以企业车间管理的重要性越发凸显&#xff0c;作为企业良性运营的关键&#xf…...

计算机网络之数据链路层

一、概述 1.1概述 物理层发出去的信号需要通过数据链路层才知道是否到达目的地&#xff1b;才知道比特流的分界线 链路(Link)&#xff1a;从一个结点到相邻结点的一段物理线路&#xff0c;中间没有任何其他交换结点数据链路(Data Link)&#xff1a;把实现通信协议的硬件和软件…...

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 系列文章(目录)

系列文章目录 第一章 技术栈简介 (开篇) 第二章 环境部署 (Node等环境安装) 第三章 项目创建 (Vite项目初始化) 第四章 认识项目目录 (项目整体介绍) 第五章 组件库安装和使用(Element-Plus基础配置) 第六章 样式格式化 (Sass配置) 第七章 路由配置 (vue-router深入解读) 第八…...

uniapp 给小程序添加分享功能

在 Uni-app 中&#xff0c;要为小程序添加分享功能&#xff0c;你可以通过使用小程序的自定义分享组件或通过配置页面的分享信息来实现。下面我将分别介绍这两种方法。 方法一&#xff1a;使用小程序的自定义分享组件 在小程序中&#xff0c;你可以创建一个自定义的分享组件&…...

npm命令

node -v --查看版本 npm install --安装npm npm config get registry --查看npm当前镜像 npm config set registry https://registry.npmmirror.com --设置淘宝镜像 npm版本管理工具...

Halcon Solution Guide I basics(3): Region Of Interest(有兴趣区域/找重点)

文章目录 文章专栏前言文章解读前言创建ROI案例1&#xff1a;直接截取ROI手动截取ROI 总结ROI套路获取窗口句柄截取ROI区域获取有效区域 Stop组合 文章专栏 Halcon开发 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 前言 今天来看第三章内容&#xff0c;既然是…...

以太坊铭文聚合交易平台 Scorpio,铭文爆发的新推手?

在今年 3 月&#xff0c;Ordinals 凭空问世&#xff0c;定义了一套在比特币网络运行的序数协议&#xff0c;使得 Token 和 NFT 能在比特币网络上实现并稳定运行&#xff0c;拉来了比特币铭文市场的新序幕。而在此后&#xff0c;在包括 BRC20 等在内的一系列应用的出现&#xff…...

Socket通信之网络协议基本原理

一台机器将自己想要表达的内容&#xff0c;按照某种约定好的格式发送出去&#xff0c;当另外一台机器收到这些信息后&#xff0c;也能够按照约定好的格式解析出来&#xff0c;从而准确、可靠地获得发送方想要表达的内容。这种约定好的格式就是网络协议&#xff08;Networking P…...

linux 开发板以太网通过Ubuntu上外网方法

在开发板嵌入式设备&#xff0c;有一个mgbe网卡&#xff0c;用网线与连接soc的网卡&#xff0c;和外接网卡&#xff0c;将网卡usb接口插入电脑&#xff0c;选择接入到Ubuntu系统 在Ubuntu将能识别到这个外接网卡&#xff0c;这样就可以通过Ubuntu和soc通讯了&#xff0c; 如下…...

DependencyProperty.Register:wpf 向别的xaml传递参数

一.使用背景&#xff1a;在A.xaml中嵌入B.xaml&#xff0c;并且向B.xaml传递参数。 函数介绍&#xff1a; public static DependencyProperty Register(string name, Type propertyType, Type ownerType );name&#xff08;string&#xff09;&#xff1a; 依赖属性的名称。在…...

uvm白皮书练习_ch2_ch231_加入transaction

2.3 为验证平平台加入各种组件 uvm白皮书练习_ch2_ch231_加入transaction 代码部分 top_tb.sv timescale 1ns / 1ps include "uvm_macros.svh"import uvm_pkg::*; /*只能现在*/include "my_if.sv" include "my_transaction.sv" include "…...

python-泛型实现,类型检查

python-泛型实现&#xff0c;类型检查 泛型类型泛型类 在Python中&#xff0c;没有像Java中的泛型那样的明确语法来指定类型参数。Python是一种动态类型语言&#xff0c;可以灵活地处理不同类型的对象。 然而&#xff0c;如果你希望在Python中添加泛型的注释或提示&#xff0c;…...

黑马React18: Redux

黑马React: Redux Date: November 19, 2023 Sum: Redux基础、Redux工具、调试、美团案例 Redux介绍 Redux 是React最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行 作用&#xff1a;通过集中管理的方式管…...

visionOS空间计算实战开发教程Day 5 纹理和材质

在​​Day 4​​​中我们使用了​​ImmersiveSpace​​并在其中添加了一个立方体&#xff0c;但对这个立方体我们只配置了长宽高&#xff0c;并没有做进一步的操作。 本文中我们会通过纹理和材质对这个立方体的六个面分别进行不同的绘制。首先我们将​​ImmersiveView​​分拆…...

低代码PaaS开发平台

目录 一、低代码概念 低代码目的 低代码核心功能 二、PaaS平台 PaaS服务的低代码平台 1.私有化部署&#xff0c;为数据安全保驾护航 2.业内领先技术&#xff0c;为开发强势赋能 3.超强集成能力&#xff0c;系统对接无忧 4.源代码交付&#xff0c;实现二开自由 三、小结 一、低代…...

阿里云99元服务器ECS经济型e实例性能如何?测评来了

阿里云服务器优惠99元一年&#xff0c;配置为云服务器ECS经济型e实例&#xff0c;2核2G配置、3M固定带宽和40G ESSD Entry系统盘&#xff0c;CPU采用Intel Xeon Platinum架构处理器&#xff0c;2.5 GHz主频&#xff0c;3M带宽下载速度384KB/秒&#xff0c;上传速度1028KB/秒&am…...

vue3-生命周期

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-生命周期 目录 vue3生命周期 vue3生命周期钩子 1.1 onMounted() 1.2 onUpdated() 1.3 onU…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...