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.pswp.cn/news/166068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166068.shtml
英文地址,請注明出處:http://en.pswp.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…