Advertisement
ponchic

Untitled

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