在对话框中添加 WM_PAINT的相应消息,

具体函数实现,如下:

void CTaskRewardDlg::OnPaint()
{CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码if (m_bDataEncoded){int nBmpWidth = pQR_Encode->m_nSymbleSize;//获取控件的边界大小  CRect rect;  GetDlgItem(IDC_STATIC_QRCODE)->GetClientRect(&rect);//定义并创建一个内存设备环境DC  CDC *pCurCDC = GetDlgItem(IDC_STATIC_QRCODE)->GetDC();//CDC *pCurCDC = GetDC();//创建兼容性的DC  CDC* pWorkDC = new CDC;pWorkDC->CreateCompatibleDC(pCurCDC);//pWorkDC->CreateCompatibleDC(NULL);CBitmap workBitmap;//workBitmap.CreateCompatibleBitmap(pWorkDC, nBmpWidth, nBmpWidth);workBitmap.CreateCompatibleBitmap(pWorkDC, rect.Width(), rect.Height());CBitmap* pOldBitmap = pWorkDC->SelectObject(&workBitmap);//将位图选入临时内存设备环境// 背景全部画成白色pWorkDC->PatBlt(0, 0, nBmpWidth, nBmpWidth, WHITENESS);// 根据二维码内容绘制位图for (int i = 0; i < pQR_Encode->m_nSymbleSize; ++i){for (int j = 0; j < pQR_Encode->m_nSymbleSize; ++j){if (pQR_Encode->m_byModuleData[i][j]){pWorkDC->SetPixel(i,j, RGB(0, 0, 0));}}}// 图片显示调用函数stretchBlt //::StretchBlt(pCurCDC->GetSafeHdc(),335, 33, 150, 150, pWorkDC->GetSafeHdc(), 0, 0,nBmpWidth, nBmpWidth, SRCCOPY);pCurCDC->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), pWorkDC, 0, 0, nBmpWidth, nBmpWidth, SRCCOPY);pWorkDC->SelectObject(pOldBitmap); DeleteObject(pOldBitmap); //删除内存中的位图  pWorkDC->DeleteDC(); //删除CreateCompatibleDC得到的图片DCdelete pWorkDC;ReleaseDC(pCurCDC); //释放获取的DC句柄}// 不为绘图消息调用 CIBADialog::OnPaint()
}

效果图:

说明:

1. 获取IDC_STATIC_QRCODE控件的矩形坐标,用这个坐标来指定新位图的宽和高、指定展示图片的位置,而不是用写死的坐标。一旦这个界面有所更改,代码层面就不需要重新指定坐标了。

//获取控件的边界大小
CRect rect;
GetDlgItem(IDC_STATIC_QRCODE)->GetClientRect(&rect);

2. 定义并创建一个内存设备环境DC 时,直接获取IDC_STATIC_QRCODE控件,使二维码直接显示在这个控件的区域内,而不需要自己去指定像素位置了。

如果直接改成

CDC *pCurCDC = GetDC();
//创建兼容性的DC
CDC* pWorkDC = new CDC;
pWorkDC->CreateCompatibleDC(NULL);

也是可以正常显示二维码的,只不过显示的位置就不在指定控件上了。

3.  如果代码前面获取的是IDC_STATIC_QRCODE控件范围内的DC,后面显示图片的代码

::StretchBlt(pCurCDC->GetSafeHdc(),335, 33, 150, 150, pWorkDC->GetSafeHdc(), 0, 0,nBmpWidth, nBmpWidth, SRCCOPY);

执行后,二维码在页面上显示不出来。

4. 二维码的生成,在C++中没有可以直接生成并显示二维码的API,只能自己一步步去实现。

这一步我是从网上下载了C源代码QR ENCODE,自己封装成了一个类来调用。

调用接口,输入二维码的字符串内容,可以生成一个内容为1或者0的二维数组。

得到这个数组后,先把DC的背景色画成白色,再循环遍历数组,如果数组中的内容为1,则在DC上画一个黑色的像素点,最终就在内存里画好了一个二维码。最后再把二维码位图显示在显卡上。

MFC对话框中使用GDI画二维码相关推荐

  1. 在H5、微信小程序中使用canvas绘制二维码、分享海报

    在H5.微信小程序中使用canvas绘制二维码.分享海报 文章目录 在H5.微信小程序中使用canvas绘制二维码.分享海报 前言 一.canvas绘制二维码 1.H5中使用canvas 2.微信小程 ...

  2. 使用canvas画二维码

    使用canvas画二维码 需要使用 qrcode 依赖 具体代码如下 <template><div><canvas ref="code">< ...

  3. Excel中批量生成含二维码和条形码的产品标签,#Excel插件

    Excel中批量生成含二维码和条形码的产品标签,工厂文员必备 Excel中批量生成产品标签,标签中同时包含二维码和条形码.工厂出货时必备,有了此标签可以扫码入库,效率提升数几倍.

  4. uniapp中应用H5自定义二维码扫码界面

    uniapp中应用H5自定义二维码扫码界面 最终效果 pages配置 组件代码 最终效果 pages配置 {"path": "components/barcode/sca ...

  5. 最最完整的二维码生成教程:MFC下利用libqrencode库生成二维码,显示在屏幕上并保存

    最近做项目的时候,需要用MFC写一个二维码生成器,要求根据指定内容生成二维码,显示在屏幕上,并能够保存在电脑中. 一. libqrencode库编译 libqrencode是一个日本人写的生成二维码的 ...

  6. Winform中使用zxing实现二维码生成(附dll下载)

    场景 zxing.dll下载 https://download.csdn.net/download/badao_liumang_qizhi/11623214 效果 实现 新建Winform程序,将上面 ...

  7. 打印modal框中在线生成的二维码

    二维码由jquery.qrcode.min.js将json字符串转换而成,细节不再赘述,效果如图: 调用浏览器打印功能(window.print())时,会连同底层父页面中的活动列表一起叠加打印,效果 ...

  8. H5+在浏览器中打开相机扫描二维码

    刚开始提出要在手机浏览器中的HTML页面做扫描是有点懵的,一顿百度后搜到两种方法: 方案一,浏览器中打开相机navigator.mediaDevices.getUserMedia 自带浏览器不支持该属 ...

  9. 如何在H5页面中实现长按二维码关注微信公众号?

    一.平台 1.微信公众号平台 2.WPS的秀堂H5 3.在线二维码解码器 二.步骤 1.登录"微信公众平台" --> 左侧"设置"中的"公众号设 ...

最新文章

  1. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型
  2. 原来BCH是这样转给别人的
  3. jQuery - 获取并设置 CSS 类
  4. Prolog基本程序
  5. web服务器的性能体现,Web应用服务器的性能问题分析
  6. CentOs中怎样打开默认网卡并查看ip
  7. 国产服务器芯片对比分析,影速分析:通过国内云主机评测对比国内服务器异同...
  8. php 重定向到https,php – Laravel 5 – 重定向到HTTPS
  9. [转载] 什么是Java中的自动拆装箱 integer
  10. java的多线程机制(文字描述区别)
  11. Pwn2Own 2020 曝出的Linux 内核漏洞已修复
  12. galera cluster数据备份
  13. 今日download工程的奇怪问题error C2039: 'readStdErr' : is not a member of 'Programer',
  14. 毕业设计:基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类
  15. sql语句实现动态添加查询条件
  16. 如何解决电脑桌面图标显示为空白文件?
  17. 【软件网每日新闻播报│第9-18期】
  18. java项目笔记 - 第18章:坦克大战2.1
  19. 66.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。
  20. Named Route index has a default child route. When navigating to this named route to name index

热门文章

  1. C/C++程序固定单核CPU运行(几个示例)
  2. 机器学习三 归一化_正则化_多项式升维
  3. OTL电路与OCL功放电路的区别
  4. 南柯服务器压力,南柯梦崇洋(十一)
  5. 微信第三方开平台代公众号发起网页授权 获取用户信息 openid,uninoid
  6. iOS中3DTouch的使用
  7. 英语语法汇总(4.数量词)
  8. web IDE theia-ide安装
  9. 【APT】The following signatures were invalid
  10. CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+Toolbar实现渐变透明的状态栏