QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

新鱼友

Rank: 1

积分
14
查看: 393|回复: 1

[技术交流] C语言生成二维码并显示

[复制链接]
最佳答案
0 
累计签到:2 天
连续签到:1 天
sakana 发表于 2017-10-31 09:29:14 3931 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

                               
登录/注册后可看大图


分享一个C语言写的生成二维码的库,可以保存为BMP文件也可以直接显示在GDI上。

Demo下载地址:https://pan.baidu.com/s/1c1UmRhY


  1. #include <windows.h>
  2. #include "qrencode.h"

  3. QRcode* pQRC = NULL;

  4. LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

  5. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
  6. {
  7.         if (pQRC = QRcode_encodeString("测试二维码", 0, QR_ECLEVEL_H, QR_MODE_8, 1))
  8.         {
  9.                 QRcode_NewBGR24(pQRC,0x00,0x00,0x00);
  10.                 QRcode_SaveBMP(pQRC,"1.bmp");

  11.                 char* clsName = "MyApp";
  12.                 WNDCLASS wc;
  13.                 ZeroMemory(&wc,sizeof(WNDCLASS));
  14.                 wc.hInstance = hInstance;
  15.                 wc.lpszClassName = clsName;
  16.                 wc.lpfnWndProc = MyWindowProc;
  17.                 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  18.                 wc.style = CS_HREDRAW | CS_VREDRAW;
  19.                 RegisterClass(&wc);
  20.                 HWND hMainwind = CreateWindow(clsName,"二维码",WS_OVERLAPPEDWINDOW,
  21.                         400,300,600,500,NULL,NULL,hInstance,NULL);
  22.                 if(hMainwind == NULL) return 0;
  23.                 ShowWindow(hMainwind,SW_NORMAL);
  24.                 MSG msg;
  25.                 while(GetMessage(&msg,NULL,0,0))
  26.                 {
  27.                         TranslateMessage(&msg);
  28.                         DispatchMessage(&msg);
  29.                 }
  30.                
  31.                 QRcode_free(pQRC);
  32.                 return 0;
  33.         }
  34.         return 1;
  35. }

  36. LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  37. {
  38.         switch(msg)
  39.         {
  40.                 case WM_PAINT:
  41.                 {
  42.                         PAINTSTRUCT ps;
  43.                         BeginPaint(hwnd, &ps);

  44.                         RECT rect;
  45.                         GetClientRect(hwnd,&rect);

  46.                         BYTE *src_buff_ex = new BYTE[pQRC->rgbW*pQRC->rgbW*4];
  47.                         for(int i=0, j=0; j < pQRC->rgbW*pQRC->rgbW*4; i+=3, j+=4)
  48.                         {
  49.                                 *(src_buff_ex+j) = *(pQRC->rgbData+i);
  50.                                 *(src_buff_ex+j+1) = *(pQRC->rgbData+i+1);
  51.                                 *(src_buff_ex+j+2) = *(pQRC->rgbData+i+2);
  52.                                 *(src_buff_ex+j+3) = 0;
  53.                         }

  54.                         HDC hMemDC_ = CreateCompatibleDC(ps.hdc);
  55.                         HBITMAP hBitmapSrc_ = CreateCompatibleBitmap(ps.hdc, pQRC->rgbW, pQRC->rgbW);
  56.                         SelectObject(hMemDC_, hBitmapSrc_);
  57.                        
  58.                         long err = SetBitmapBits(hBitmapSrc_, pQRC->rgbW*pQRC->rgbW*4, src_buff_ex);
  59.                         if(err != 0)
  60.                         {
  61.                                 BitBlt(ps.hdc, (rect.right-pQRC->rgbW)/2, (rect.bottom-pQRC->rgbW)/2,
  62.                                         pQRC->rgbW, pQRC->rgbW, hMemDC_, 0, 0, SRCCOPY);
  63.                         }
  64.                        
  65.                         DeleteObject(hBitmapSrc_);
  66.                         DeleteDC(hMemDC_);

  67.                         free(src_buff_ex);

  68.                         EndPaint(hwnd, &ps);
  69.                 }
  70.                 break;
  71.                 case WM_DESTROY:
  72.                 {
  73.                         PostQuitMessage(0);
  74.                 }return 0;
  75.                 default:break;
  76.         }
  77.         return DefWindowProc(hwnd,msg,wParam,lParam);
  78. }
复制代码
楼层
跳转到指定楼层
最佳答案
0 
累计签到:1 天
连续签到:1 天
孤独一掷 发表于 2017-11-10 11:06:25 From FishC Mobile | 显示全部楼层
学习学习

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /2 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-12-16 09:24

快速回复 返回顶部 返回列表