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);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通俗理解词向量模型,预训练模型,Transfomer,Bert和GPT的发展脉络和如何实践

最近研究GPT&#xff0c;深入的从transfomer的原理和代码看来一下&#xff0c;现在把学习的资料和自己的理解整理一下。 这个文章写的很通俗易懂&#xff0c;把transformer的来龙去脉&#xff0c;还举例了很多不错的例子。 Transformer通俗笔记&#xff1a;从Word2Vec、Seq2S…

6 个有效且可用的顶级 Android 数据恢复工具

经过测试 42 种数据恢复软件产品&#xff0c;发现奇客数据恢复安卓版是 Android 设备的最佳选择。 过去几十年来&#xff0c;我一直在科技行业工作&#xff0c;经常帮助人们应对计算机灾难&#xff0c;包括丢失数据。 Android 数据恢复应用程序不在您的设备上运行&#xff0c…

IDEA中注释快捷键及模板

单行注释 将光标放置于要注释所在行&#xff0c;使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&#xff0c;去掉行注释 若需要将多行进行单行注释&#xff0c;只需要选中要注释的多行&#xff0c;然后使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&a…

【PTA题目】L1-6 整除光棍 分数 20

L1-6 整除光棍 分数 20 全屏浏览题目 切换布局 作者 翁恺 单位 浙江大学 这里所谓的“光棍”&#xff0c;并不是指单身汪啦~ 说的是全部由1组成的数字&#xff0c;比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如&#xff0c;111111就可以被…

leetcode中“复杂的二分”类题目

复杂的二分题目难点 第 410、1011、1482、1552、1760、2187、2226 题 1 根据题意确定二分的数据范围 2 避免死循环: 决定是int m (leftright1)/2还是int m (leftright)/2 3 返回结果的指针是left还是right 1 LC875. 爱吃香蕉的珂珂 class Solution {public int minEati…

聚焦数据要素跨域运营,构建数据要素统一大市场地方数据局局长闭门会正式召开

11月23日&#xff0c;在第二届全球数字贸易博览会期间&#xff0c;杭州市数据资源局、中国电子云、杭州数据交易所联合组织各地数据主管部门&#xff0c;召开构建数据要素统一大市场地方数据局局长闭门会&#xff0c;交流数据要素统一大市场构建思路&#xff0c;共探公共数据运…

写给女朋友的python软件开发教程——从入门到实践01——总体规划

文章目录 学习路径chatGPT文心一言 学习资源推荐理论学习——一些这些分别录制视频讲解&#xff08;后面会更&#xff09;实战——以自己想开发的一个软件为例进行教学 学习路径 问&#xff1a; 我已经有python基础了&#xff0c;想快速学会用python的pyqt开发单机软件&#x…

人人都会Blazor—— 3.2 组件

Blazor 应用是使用 Razor 组件(非正式地称为 Blazor 组件或组件)构建的。 组件是用户界面 (UI) 的自包含部分,具有用于启用动态行为的处理逻辑。 组件可以嵌套、重用、在项目间共享,并可在 MVC 和 Razor Pages 应用中使用。 组件呈现为浏览器文档对象模型 (DOM) 的内存中表…

通过一个例子理解pytest的fixture的使用

需求 希望编写登陆web后做一些操作的测试用例&#xff0c;使用pytest框架具体测试用例执行前&#xff0c;需要先拿到web的token&#xff0c;这个获取token的动作只执行一次 例一 先上测试用例代码 adminpc-1:~$ cat my_test.py import pytestclass TestWebLogin:pytest.fi…

基于springboot实现农机电招平台系统项目【项目源码+论文说明】

基于springboot实现农机电招平台系统演示 摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算…

软件开发中对图片的加工处理的一些个人思考和总结

前言&#xff1a; 最近在公司做项目的时候&#xff0c;有一个业务场景就是同一张图片&#xff0c;在不同的位置上展示的效果是不一致的&#xff0c;其实理解起来也很简单&#xff0c;就以大家熟悉的微信头像而言&#xff0c;我们在正常使用的情况下&#xff0c;一个微信头像的大…

寻找多个项目的漏洞赏金实战,不同技术的详细实现

寻找多个项目的漏洞赏金实战,不同技术的详细实现。 破-解Slack App得到3500美金漏洞赏金 文章的核心要点如下: 漏洞发现:作者在Slack的安卓应用中发现了一个漏洞。这个漏洞是由于目录遍历,导致可以窃取密码。这个漏洞的重要性在于,它允许“跳跃”在账户之间,也就是说,你…

[kingbase锁等待问题分析]

参考文章:https://www.modb.pro/db/70021 概述 为了确保复杂的事务可以安全地同时运行&#xff0c;kingbase&#xff08;PostgreSQL&#xff09;提供了各种级别的锁来控制对各种数据对象的并发访问&#xff0c;使得对数据库关键部分的更改序列化。事务并发运行&#xff0c;直到…

关闭EntityFramework日志输出SQL

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; EntityFramework日志输出SQL 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; EntityFramework日志输出SQL&#xff0c;造成发布后&#xff0c;无效日志太多&#xff0c;且容器化部…

Linux安全之AIDE系统入侵检测工具安装和使用

一、AIDE 系统入侵检测工具简介 AIDE&#xff0c;全称为Advanced Intrusion Detection Environment&#xff0c;是一个主要用于检测文件完整性的入侵检测工具。它能够构建一个指定文件的数据库&#xff0c;并使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性&am…

Django(十、中间件)

文章目录 一、中间件的介绍中间件有什么用中间件功能自定义中间中间件的顺序 一、中间件的介绍 中间件顾名思义&#xff0c;是介于request与response处理之间的一道处理过程&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出。因为改变的是全局&…

U盘启动制作工具Rufus

U盘启动制作工具Rufus 下载U盘启动制作工具Rufus&#xff0c;进入Rufus官网&#xff1a;http://rufus.ie/en/&#xff0c;打开之后往后滑动&#xff0c;找到download即可点击下载。 需要插入U盘 首先需要插入U盘&#xff0c;如果U盘有重要文件一定要备份&#xff0c;然后右键…

mysql安装亲测有效

http://t.csdnimg.cn/UHuy4

Grails 启动

Grails系列 Grails项目启动 文章目录 Grails系列Grails一、项目创建二、可能的问题1.依赖下载2.项目导入到idea失败3.项目导入到idea后运行报错 Grails Grails是一款基于Groovy语言的Web应用程序框架&#xff0c;它使用了许多流行的开源技术&#xff0c;如Spring Framework、…

Go语言初始化已有环境,跟踪已有依赖环境

在Go语言中&#xff0c;go.mod文件是Go模块的管理文件&#xff0c;用于跟踪和管理项目的依赖关系。go.sum 文件是 Go 语言模块的另一个关键文件&#xff0c;它记录了项目依赖的确切版本以及相应的哈希值。如果你得到了一个包含go.mod和go.sum文件的Go代码&#xff0c;&#xff…