dllbridge

Qr

Oct 23rd, 2025
645
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.12 KB | None | 0 0
  1. #include <windows.h>
  2. #include <wincodec.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. // Простая структура для хранения данных QR-кода
  8. typedef struct {
  9.     int version;
  10.     int size;
  11.     unsigned char* data;
  12. } QRCode;
  13.  
  14. // Функция для создания QR-кода (упрощенная реализация)
  15. QRCode* create_qr_code(const char* text) {
  16.     if (!text || strlen(text) == 0) {
  17.         return NULL;
  18.     }
  19.    
  20.     // В реальной реализации здесь должна быть библиотека генерации QR-кода
  21.     // Для примера создаем простой "заглушечный" QR-код
  22.     QRCode* qr = (QRCode*)malloc(sizeof(QRCode));
  23.     if (!qr) return NULL;
  24.    
  25.     qr->version = 1;
  26.     qr->size = 21; // Размер QR-кода версии 1
  27.    
  28.     // Выделяем память для данных (1 бит на модуль)
  29.     int data_size = (qr->size * qr->size + 7) / 8;
  30.     qr->data = (unsigned char*)malloc(data_size);
  31.     if (!qr->data) {
  32.         free(qr);
  33.         return NULL;
  34.     }
  35.    
  36.     memset(qr->data, 0, data_size);
  37.    
  38.     // Простой паттерн для демонстрации
  39.     for (int i = 0; i < qr->size; i++) {
  40.         for (int j = 0; j < qr->size; j++) {
  41.             if (i == 0 || i == qr->size - 1 || j == 0 || j == qr->size - 1 ||
  42.                 (i + j) % 3 == 0) {
  43.                 int bit_pos = i * qr->size + j;
  44.                 qr->data[bit_pos / 8] |= (1 << (bit_pos % 8));
  45.             }
  46.         }
  47.     }
  48.    
  49.     return qr;
  50. }
  51.  
  52. // Функция для отрисовки QR-кода в окне
  53. void draw_qr_code(HDC hdc, QRCode* qr, int x, int y, int scale) {
  54.     if (!qr || !qr->data) return;
  55.    
  56.     HBRUSH black_brush = CreateSolidBrush(RGB(0, 0, 0));
  57.     HBRUSH white_brush = CreateSolidBrush(RGB(255, 255, 255));
  58.    
  59.     // Рисуем QR-код
  60.     for (int i = 0; i < qr->size; i++) {
  61.         for (int j = 0; j < qr->size; j++) {
  62.             int bit_pos = i * qr->size + j;
  63.             int is_black = qr->data[bit_pos / 8] & (1 << (bit_pos % 8));
  64.            
  65.             HBRUSH brush = is_black ? black_brush : white_brush;
  66.             RECT rect = {
  67.                 x + j * scale,
  68.                 y + i * scale,
  69.                 x + (j + 1) * scale,
  70.                 y + (i + 1) * scale
  71.             };
  72.            
  73.             FillRect(hdc, &rect, brush);
  74.         }
  75.     }
  76.    
  77.     DeleteObject(black_brush);
  78.     DeleteObject(white_brush);
  79. }
  80.  
  81. // Функция для сохранения QR-кода в BMP файл
  82. BOOL save_qr_to_bmp(QRCode* qr, const char* filename, int scale) {
  83.     if (!qr || !filename) return FALSE;
  84.    
  85.     int width = qr->size * scale;
  86.     int height = qr->size * scale;
  87.    
  88.     // Создаем временный HDC для рисования
  89.     HDC hdc = GetDC(NULL);
  90.     HDC mem_dc = CreateCompatibleDC(hdc);
  91.    
  92.     BITMAPINFO bmi = {0};
  93.     bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  94.     bmi.bmiHeader.biWidth = width;
  95.     bmi.bmiHeader.biHeight = -height; // Отрицательная высота для top-down DIB
  96.     bmi.bmiHeader.biPlanes = 1;
  97.     bmi.bmiHeader.biBitCount = 24;
  98.     bmi.bmiHeader.biCompression = BI_RGB;
  99.    
  100.     void* bits;
  101.     HBITMAP hbitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &bits, NULL, 0);
  102.    
  103.     if (!hbitmap) {
  104.         DeleteDC(mem_dc);
  105.         ReleaseDC(NULL, hdc);
  106.         return FALSE;
  107.     }
  108.    
  109.     SelectObject(mem_dc, hbitmap);
  110.    
  111.     // Рисуем белый фон
  112.     RECT rect = {0, 0, width, height};
  113.     HBRUSH white_brush = CreateSolidBrush(RGB(255, 255, 255));
  114.     FillRect(mem_dc, &rect, white_brush);
  115.    
  116.     // Рисуем QR-код
  117.     draw_qr_code(mem_dc, qr, 0, 0, scale);
  118.    
  119.     // Сохраняем в файл
  120.     BITMAPFILEHEADER bmfh = {0};
  121.     bmfh.bfType = 0x4D42; // "BM"
  122.     bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + width * height * 3;
  123.     bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  124.    
  125.     FILE* file = fopen(filename, "wb");
  126.     if (!file) {
  127.         DeleteObject(hbitmap);
  128.         DeleteDC(mem_dc);
  129.         ReleaseDC(NULL, hdc);
  130.         DeleteObject(white_brush);
  131.         return FALSE;
  132.     }
  133.    
  134.     fwrite(&bmfh, sizeof(BITMAPFILEHEADER), 1, file);
  135.     fwrite(&bmi.bmiHeader, sizeof(BITMAPINFOHEADER), 1, file);
  136.     fwrite(bits, 1, width * height * 3, file);
  137.     fclose(file);
  138.    
  139.     // Очистка ресурсов
  140.     DeleteObject(hbitmap);
  141.     DeleteDC(mem_dc);
  142.     ReleaseDC(NULL, hdc);
  143.     DeleteObject(white_brush);
  144.    
  145.     return TRUE;
  146. }
  147.  
  148. // Оконная процедура
  149. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  150.     static QRCode* qr_code = NULL;
  151.     static char input_text[256] = "Hello, World!";
  152.    
  153.     switch (msg) {
  154.         case WM_CREATE: {
  155.             // Создаем элементы управления
  156.             CreateWindow("EDIT", input_text, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,
  157.                         10, 10, 200, 25, hwnd, (HMENU)1, NULL, NULL);
  158.            
  159.             CreateWindow("BUTTON", "Generate QR", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
  160.                         220, 10, 100, 25, hwnd, (HMENU)2, NULL, NULL);
  161.            
  162.             CreateWindow("BUTTON", "Save as BMP", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
  163.                         330, 10, 100, 25, hwnd, (HMENU)3, NULL, NULL);
  164.            
  165.             // Создаем начальный QR-код
  166.             if (qr_code) {
  167.                 free(qr_code->data);
  168.                 free(qr_code);
  169.             }
  170.             qr_code = create_qr_code(input_text);
  171.             break;
  172.         }
  173.        
  174.         case WM_COMMAND: {
  175.             if (LOWORD(wParam) == 2) { // Кнопка Generate
  176.                 GetDlgItemText(hwnd, 1, input_text, sizeof(input_text));
  177.                
  178.                 if (qr_code) {
  179.                     free(qr_code->data);
  180.                     free(qr_code);
  181.                 }
  182.                 qr_code = create_qr_code(input_text);
  183.                 InvalidateRect(hwnd, NULL, TRUE);
  184.             }
  185.             else if (LOWORD(wParam) == 3) { // Кнопка Save
  186.                 if (qr_code) {
  187.                     save_qr_to_bmp(qr_code, "qrcode.bmp", 10);
  188.                     MessageBox(hwnd, "QR-код сохранен как 'qrcode.bmp'", "Сохранение", MB_OK);
  189.                 }
  190.             }
  191.             break;
  192.         }
  193.        
  194.         case WM_PAINT: {
  195.             PAINTSTRUCT ps;
  196.             HDC hdc = BeginPaint(hwnd, &ps);
  197.            
  198.             // Рисуем QR-код
  199.             if (qr_code) {
  200.                 draw_qr_code(hdc, qr_code, 50, 50, 10);
  201.             }
  202.            
  203.             EndPaint(hwnd, &ps);
  204.             break;
  205.         }
  206.        
  207.         case WM_DESTROY: {
  208.             if (qr_code) {
  209.                 free(qr_code->data);
  210.                 free(qr_code);
  211.             }
  212.             PostQuitMessage(0);
  213.             break;
  214.         }
  215.        
  216.         default:
  217.             return DefWindowProc(hwnd, msg, wParam, lParam);
  218.     }
  219.     return 0;
  220. }
  221.  
  222. // Точка входа
  223. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  224.     const char CLASS_NAME[] = "QRCodeGenerator";
  225.    
  226.     WNDCLASS wc = {0};
  227.     wc.lpfnWndProc = WndProc;
  228.     wc.hInstance = hInstance;
  229.     wc.lpszClassName = CLASS_NAME;
  230.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  231.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  232.    
  233.     RegisterClass(&wc);
  234.    
  235.     HWND hwnd = CreateWindow(
  236.         CLASS_NAME,
  237.         "QR Code Generator - C++/WinAPI",
  238.         WS_OVERLAPPEDWINDOW,
  239.         CW_USEDEFAULT, CW_USEDEFAULT,
  240.         500, 400,
  241.         NULL, NULL, hInstance, NULL
  242.     );
  243.    
  244.     if (!hwnd) {
  245.         return 0;
  246.     }
  247.    
  248.     ShowWindow(hwnd, nCmdShow);
  249.     UpdateWindow(hwnd);
  250.    
  251.     MSG msg;
  252.     while (GetMessage(&msg, NULL, 0, 0)) {
  253.         TranslateMessage(&msg);
  254.         DispatchMessage(&msg);
  255.     }
  256.    
  257.     return msg.wParam;
  258. }
Advertisement
Add Comment
Please, Sign In to add comment