1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| void QRCodeDialog::OnPaint() { CPaintDC dc(this); COLORREF white = RGB(255,255,255); COLORREF black = RGB(0,0,0);
QRcode *qr=QRcode_encodeString(m_qrcode.c_str(), 1, QR_ECLEVEL_L, QR_MODE_8, 1); const int qr_width = qr->width > 0 ? qr->width:1; CDC MemDC; MemDC.CreateCompatibleDC(NULL); CBitmap MemBitmap; MemBitmap.CreateCompatibleBitmap(&dc,qr_width,qr_width); MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,qr_width,qr_width,RGB(255,255,255));
double scale = m_width/qr_width; for(int y=0;y<qr_width;y++) { for(int x = 0;x<qr_width;x++) { unsigned char b = qr->data[y*qr_width+x]; if(b&0x01) { MemDC.SetPixel(x,y,black); }else { MemDC.SetPixel(x,y,white); } } } dc.SetStretchBltMode(BLACKONWHITE); int border_width = GetSystemMetrics(SM_CXDLGFRAME); dc.StretchBlt(border_width*5/2,border_width*5/2,m_width,m_height,&MemDC,0,0,qr_width,qr_width,SRCCOPY);
MemBitmap.DeleteObject(); MemDC.DeleteDC();
MemBitmap.DeleteObject(); MemDC.DeleteDC();
QRcode_free(qr); }
|