MFC 中创建并显示二维码

news/2024/11/18 14:30:36/

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.ppmy.cn/news/1234306.html

相关文章

除自身以外数组的乘积[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个整数数组nums&#xff0c;返回数组answer&#xff0c;其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法&#xff0…

Windows 系统 - 如何安装 Python

无论是谁在写 Python 代码之前都需要让自己的计算机有一个 Python 解释器&#xff0c;怎么安装这个解释器呢&#xff1f;下面我分为三大步骤来讲解。首先第一步就是去 Python 官网下载一个 Python&#xff0c;第二步肯定就是安装了&#xff0c;第三步是检查你到底有没有安装上。…

【Spring】之注解存取Bean对象

在本系列的上一篇文章中&#xff0c;我们已经了解了Spring的一些核心概念&#xff0c;并且还学习了Spring存取。但是我们发现在存取的过程中还是比较复杂&#xff0c;接下来我们将学习更为简单的Spring存取&#xff0c;其中涉及到的主要内容就是注解。并且在Spring家族的学习过…

数据库之MHA

数据库之MHA 什么是MHA&#xff1f; masterhight availabulity&#xff1a;基于主库的高可用环境下&#xff1a;主从复制 故障切换 主从的架构 MHA&#xff1a;最少要一主两从 mysql的单点故障问题&#xff0c;一旦主库崩溃&#xff0c;MHA可以在0-30秒内自动完成故障切换…

Office文件在线预览大全-Word文档在线预览的实现方法-OFD文档在线预览-WPS文件在线预览

Office文件在线预览大全-Word文档在线预览的实现方法-OFD文档在线预览-WPS文件在线预览 Office文件在线预览指的是文件在浏览器中可以直接预览查看&#xff0c;不需要安装任何插件就可以实现文档的在线预览功能、打印功能、文件转PDF功能、文件转OFD功能、文档内容提取功能、自…

性能测试工具有哪些?原理是什么?怎么选择适合的工具?

前言 本篇文章主要简单总结下性能测试工具的原理以及如何选型。性能测试和功能测试不同&#xff0c;性能测试的执行是基本功能的重复和并发&#xff0c;需要模拟多用户&#xff0c;在性能测试执行时需要监控指标参数&#xff0c;同时性能测试的结果不是那么显而易见&#xff0c…

外卖小程序系统:数字化餐饮的编码之道

在当今数字化时代&#xff0c;外卖小程序系统成为了餐饮业的一项技术巨制。这个系统不仅提供了便捷的点餐体验&#xff0c;更通过先进的技术手段&#xff0c;实现了高效订单处理、实时配送追踪以及个性化推荐。让我们深入了解外卖小程序系统的技术魔法&#xff0c;一起揭秘数字…

训练跳跃(青蛙跳台阶),剑指offer,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 青蛙跳台阶问题 我们直接看题解吧&#xff1a; 相似题目&#xff0c;斐波那契数列&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 小鸡识补充 题…