Advertisement
ponchic

Untitled

Jan 11th, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <windows.h> // заголовочный файл, содержащий WINAPI
  2.  
  3.  
  4. // Прототип функции обработки сообщений с пользовательским названием:
  5. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  6. TCHAR mainMessage[] = L"Какой то-текст!"; // строка с сообщением
  7.  
  8. // Управляющая функция:
  9. int WINAPI WinMain(HINSTANCE hInst, // дескриптор экземпляра приложения
  10.     HINSTANCE hPrevInst, // не используем
  11.     LPSTR lpCmdLine, // не используем
  12.     int nCmdShow) // режим отображения окошка
  13. {
  14.     TCHAR szClassName[] = L"Мой класс"; // строка с именем класса
  15.     HWND hMainWnd; // создаём дескриптор будущего окошка
  16.     MSG msg; // создём экземпляр структуры MSG для обработки сообщений
  17.     WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
  18.     wc.cbSize        = sizeof(wc); // размер структуры (в байтах)
  19.     wc.style         = CS_HREDRAW | CS_VREDRAW; // стиль класса окошка
  20.     wc.lpfnWndProc   = WndProc; // указатель на пользовательскую функцию
  21.     wc.lpszMenuName  = NULL; // указатель на имя меню (у нас его нет)
  22.     wc.lpszClassName = szClassName; // указатель на имя класса
  23.     wc.cbWndExtra    = NULL; // число освобождаемых байтов в конце структуры
  24.     wc.cbClsExtra    = NULL; // число освобождаемых байтов при создании экземпляра приложения
  25.     wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO); // декриптор пиктограммы
  26.     wc.hIconSm       = LoadIcon(NULL, IDI_WINLOGO); // дескриптор маленькой пиктограммы (в трэе)
  27.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW); // дескриптор курсора
  28.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // дескриптор кисти для закраски фона окна
  29.     wc.hInstance     = hInst; // указатель на строку, содержащую имя меню, применяемого для класса
  30.     if(!RegisterClassEx(&wc)){
  31.         // в случае отсутствия регистрации класса:
  32.         MessageBox(NULL, L"Не получилось зарегистрировать класс!", L"Ошибка", MB_OK);
  33.         return NULL; // возвращаем, следовательно, выходим из WinMain
  34.     }
  35.     // Функция, создающая окошко:
  36.     hMainWnd = CreateWindow(
  37.         szClassName, // имя класса
  38.         L"Для сохранения снимка щёлкните по снимку (в окне)", // имя окошка (то что сверху)
  39.         WS_OVERLAPPEDWINDOW | WS_VSCROLL, // режимы отображения окошка
  40.         CW_USEDEFAULT, // позиция окошка по оси х
  41.         NULL, // позиция окошка по оси у (раз дефолт в х, то писать не нужно)
  42.         CW_USEDEFAULT, // ширина окошка
  43.         NULL, // высота окошка (раз дефолт в ширине, то писать не нужно)
  44.         (HWND)NULL, // дескриптор родительского окна
  45.         NULL, // дескриптор меню
  46.         HINSTANCE(hInst), // дескриптор экземпляра приложения
  47.         NULL); // ничего не передаём из WndProc
  48.     if(!hMainWnd){
  49.         // в случае некорректного создания окошка (неверные параметры и тп):
  50.         MessageBox(NULL, L"Не получилось создать окно!", L"Ошибка", MB_OK);
  51.         return NULL;
  52.     }
  53.     ShowWindow(hMainWnd, nCmdShow); // отображаем окошко
  54.     UpdateWindow(hMainWnd); // обновляем окошко
  55.     while(GetMessage(&msg, NULL, NULL, NULL)){ // извлекаем сообщения из очереди, посылаемые фу-циями, ОС
  56.         TranslateMessage(&msg); // интерпретируем сообщения
  57.         DispatchMessage(&msg); // передаём сообщения обратно ОС
  58.     }
  59.     return msg.wParam; // возвращаем код выхода из приложения
  60. }
  61.  
  62. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
  63.     HDC hDC, hDCMem; // создаём дескриптор ориентации текста на экране
  64.     PAINTSTRUCT ps; // структура, сод-щая информацию о клиентской области (размеры, цвет и тп)
  65.     RECT rect; // стр-ра, определяющая размер клиентской области
  66.     COLORREF colorText = RGB(255, 0, 0); // задаём цвет текста
  67.     HBITMAP hBmp, hMaska, hOldBitmap, bmpMem;
  68.     BITMAP bmInfo;
  69.     HINSTANCE hInstance;
  70.     BOOL sucess;
  71.      OPENFILENAME ofn;
  72.      static BOOL SetWindowPosRes = FALSE;
  73.  
  74.     switch(uMsg){
  75.  
  76.     case WM_CREATE:
  77.         hDC = BeginPaint(hWnd, &ps);
  78.         //HBITMAP hBmp;
  79.  
  80.  
  81.  
  82. break;
  83.            
  84.            
  85.     case WM_PAINT: {// если нужно нарисовать, то:
  86.          GetClientRect(hWnd, &rect);
  87.            
  88.             hDC = BeginPaint(hWnd, &ps); // инициализируем контекст устройства
  89.             if ( OpenClipboard(hWnd) )
  90. hBmp = (HBITMAP)GetClipboardData(CF_BITMAP);
  91.             if (hBmp == NULL)
  92.             {
  93.                 MessageBox(NULL, L"Error", L" ", MB_OK);
  94.                 CloseClipboard();
  95.                
  96.                 PostQuitMessage(NULL);
  97.  
  98.             }
  99.  
  100.             hDCMem = CreateCompatibleDC(hDC);
  101.            
  102.  
  103.             hOldBitmap = (HBITMAP) SelectObject(hDCMem, hBmp);
  104. GetObject(hBmp, sizeof(bmInfo), &bmInfo);
  105. bmpMem = CreateCompatibleBitmap (hDC, bmInfo.bmWidth-16, bmInfo.bmHeight-38);
  106.              BitBlt(hDC, 0, 0, bmInfo.bmWidth-16, bmInfo.bmHeight-38, hDCMem, 8, 30, SRCCOPY); //Оставлю этот идеальный код потомкам
  107.              
  108.              if (SetWindowPosRes == FALSE)
  109.              {
  110.                  SetWindowPos(hWnd, (HWND)NULL, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, SWP_NOMOVE);
  111.             SetWindowPosRes = TRUE;
  112.              }
  113.            
  114.              
  115.  
  116.  
  117. CloseClipboard();
  118.            
  119.              DeleteDC(hDCMem);
  120.            
  121.  
  122. EndPaint(hWnd, &ps); // заканчиваем рисовать
  123.  
  124. break;
  125.     }
  126.     case WM_LBUTTONDOWN: {
  127.  char szFileName[MAX_PATH] = "";
  128.  
  129.              ZeroMemory(&ofn, sizeof(ofn));
  130.  
  131.              ofn.lStructSize = sizeof(ofn);
  132.              ofn.hwndOwner = NULL;
  133.              ofn.lpstrFilter = (LPCWSTR)L"Text Files (*.bmp)\0*.bmp\0All Files (*.*)\0*.*\0";
  134.              ofn.lpstrFile = (LPWSTR)szFileName;
  135.              ofn.nMaxFile = MAX_PATH;
  136.              ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  137.              ofn.lpstrDefExt = (LPCWSTR)L"bmp";
  138.  
  139.              GetSaveFileName(&ofn);
  140.  
  141.              BITMAPFILEHEADER bfh; //структура с заголовком файла
  142.              BITMAPINFOHEADER bih;  //структура с описанием формата картинки
  143.              BITMAPINFO bi; //описание формата для функции GetDIBits ()
  144.              void *pdwBits = NULL; //указатель на буфер с будущим рисунком
  145.              DWORD dwWB = 0; //переменная для хранения записанных байт в файл
  146.              HANDLE hFile = NULL; //хэндл открытого файла
  147.  
  148.              //Создаем пустой буфер, в который потом скопируется картинка
  149.              pdwBits = (void *)GlobalAlloc (GMEM_FIXED, 800 * 600 * 4);
  150.  
  151.              //Обнуляем структуры
  152.              memset (&bfh, 0, sizeof (BITMAPFILEHEADER));
  153.              memset (&bih, 0, sizeof (BITMAPINFOHEADER));
  154.              memset (&bi, 0, sizeof (BITMAPINFO));
  155.  
  156.              //Заполняем заголовочную структуру
  157.              bfh.bfType = 0x4D42;                           // Обозначим, что это bmp 'BM'
  158.              bfh.bfOffBits = sizeof(bfh) + sizeof(bih);    
  159.              bfh.bfSize = bfh.bfOffBits + 800 * 600 * 4;   // Посчитаем размер конечного файла
  160.  
  161.              //Заполняем описание картинки
  162.              bih.biSize = sizeof(bih);                      // Так положено
  163.              bih.biBitCount = 32;                           // 16 бит на пиксель
  164.              bih.biCompression = BI_RGB;                    // Без сжатия
  165.              bih.biHeight = 600;
  166.              bih.biWidth = 800;
  167.              bih.biPlanes = 1;    
  168.  
  169.              //Копируем в структуру BITMAPINFO
  170.              CopyMemory (&bi, &bih, sizeof (BITMAPINFOHEADER));  
  171.  
  172.              //Получаем с помощью функции саму картинку из контекста в памяти
  173.              GetDIBits (hDCMem, bmpMem, 0, 600, pdwBits, (LPBITMAPINFO)&bi, DIB_RGB_COLORS);
  174.  
  175.              //Создаем файл для записи
  176.              hFile = CreateFile ((LPCWSTR)szFileName,
  177.                  GENERIC_WRITE,
  178.                  0,
  179.                  NULL,
  180.                  CREATE_ALWAYS,
  181.                  FILE_ATTRIBUTE_NORMAL,
  182.                  (HANDLE)NULL);
  183.              if (hFile == INVALID_HANDLE_VALUE) {
  184.                  if (pdwBits) GlobalFree (pdwBits);
  185.                  SetWindowText (hWnd, (LPCWSTR)"Ошибка при открытии файла");
  186.                  PostQuitMessage(NULL);
  187.              }
  188.  
  189.              //Записываем структуру с заголовком файла
  190.              if (!WriteFile (hFile, (void *)&bfh, sizeof (BITMAPFILEHEADER), &dwWB, NULL)) {
  191.                  SetWindowText (hWnd, (LPCWSTR)"Ошибка при записи BITMAPFILEHEADER");
  192.                  if (pdwBits) GlobalFree (pdwBits);
  193.                 PostQuitMessage(NULL);
  194.              }
  195.  
  196.              //Записываем структуру с описанием формата картинки
  197.              if (!WriteFile (hFile, (void *)&bih, sizeof (BITMAPINFOHEADER), &dwWB, NULL)) {
  198.                  SetWindowText (hWnd, (LPCWSTR)"Ошибка при записи BITMAPINFOHEADER");
  199.                  if (pdwBits) GlobalFree (pdwBits);
  200.                  PostQuitMessage(NULL);
  201.              } 
  202.  
  203.              //Записываем собсна саму картинку после двух предыдущих структур
  204.              if (!WriteFile (hFile, (void *)pdwBits, 800 * 600 * 4, &dwWB, NULL)) {
  205.                  SetWindowText (hWnd, (LPCWSTR)"Ошибка при записи DIBits");
  206.                  if (pdwBits) GlobalFree (pdwBits);
  207.                  PostQuitMessage(NULL);
  208.              } 
  209.  
  210.              //Закрываем хэндл файла и очищаем буфер
  211.              CloseHandle (hFile);
  212.              if (pdwBits) GlobalFree (pdwBits);
  213.         break;
  214.     }
  215.     case WM_DESTROY: // если окошко закрылось, то:
  216.         PostQuitMessage(NULL); // отправляем WinMain() сообщение WM_QUIT
  217.         break;
  218.     default:
  219.         return DefWindowProc(hWnd, uMsg, wParam, lParam); // если закрыли окошко
  220.     }
  221.     return NULL; // возвращаем значение
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement