Advertisement
ponchic

Untitled

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