Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h> // заголовочный файл, содержащий WINAPI
- BOOL StoreBitmapFile(LPCTSTR lpszFileName, HBITMAP HBM)
- {
- BITMAP BM;
- BITMAPFILEHEADER BFH;
- LPBITMAPINFO BIP;
- HDC DC;
- LPBYTE Buf;
- DWORD ColorSize,DataSize;
- WORD BitCount;
- HANDLE FP;
- DWORD dwTemp;
- GetObject(HBM, sizeof(BITMAP), (LPSTR)&BM);
- BitCount = (WORD)BM.bmPlanes * BM.bmBitsPixel;
- switch (BitCount)
- {
- case 1:
- case 4:
- case 8:
- case 32:
- ColorSize = sizeof(RGBQUAD) * (1 << BitCount);
- case 24:
- ColorSize = 0;
- }
- DataSize = ((BM.bmWidth*BitCount+31) & ~31)/8*BM.bmHeight;
- BIP=(LPBITMAPINFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BITMAPINFO)+ColorSize);
- BIP->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- BIP->bmiHeader.biWidth = BM.bmWidth;
- BIP->bmiHeader.biHeight = BM.bmHeight;
- BIP->bmiHeader.biPlanes = 1;
- BIP->bmiHeader.biBitCount = BitCount;
- BIP->bmiHeader.biCompression = 0;
- BIP->bmiHeader.biSizeImage = DataSize;
- BIP->bmiHeader.biXPelsPerMeter = 0;
- BIP->bmiHeader.biYPelsPerMeter = 0;
- if (BitCount < 24)
- BIP->bmiHeader.biClrUsed = (1<<BitCount);
- BIP->bmiHeader.biClrImportant = 0;
- BFH.bfType = 0x4d42;
- BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD);
- BFH.bfReserved1 = 0;
- BFH.bfReserved2 = 0;
- BFH.bfSize = BFH.bfOffBits + DataSize;
- Buf = (LPBYTE)GlobalAlloc(GMEM_FIXED, DataSize);
- DC = GetDC(0);
- GetDIBits(DC, HBM, 0,(WORD)BM.bmHeight, Buf, BIP, DIB_RGB_COLORS);
- ReleaseDC(0, DC);
- FP=CreateFile(lpszFileName,GENERIC_READ | GENERIC_WRITE, 0, NULL,
- CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
- WriteFile(FP,&BFH,sizeof(BITMAPFILEHEADER),&dwTemp,NULL);
- WriteFile(FP,BIP,sizeof(BITMAPINFOHEADER) + BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD),&dwTemp,NULL);
- WriteFile(FP,Buf,DataSize,&dwTemp,NULL);
- CloseHandle(FP);
- GlobalFree((HGLOBAL)Buf);
- HeapFree(GetProcessHeap(),0,(LPVOID)BIP);
- return(true);
- }
- // Прототип функции обработки сообщений с пользовательским названием:
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- TCHAR mainMessage[] = L"Какой то-текст!"; // строка с сообщением
- // Управляющая функция:
- int WINAPI WinMain(HINSTANCE hInst, // дескриптор экземпляра приложения
- HINSTANCE hPrevInst, // не используем
- LPSTR lpCmdLine, // не используем
- int nCmdShow) // режим отображения окошка
- {
- TCHAR szClassName[] = L"Мой класс"; // строка с именем класса
- HWND hMainWnd; // создаём дескриптор будущего окошка
- MSG msg; // создём экземпляр структуры MSG для обработки сообщений
- WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
- wc.cbSize = sizeof(wc); // размер структуры (в байтах)
- wc.style = CS_HREDRAW | CS_VREDRAW; // стиль класса окошка
- wc.lpfnWndProc = WndProc; // указатель на пользовательскую функцию
- wc.lpszMenuName = NULL; // указатель на имя меню (у нас его нет)
- wc.lpszClassName = szClassName; // указатель на имя класса
- wc.cbWndExtra = NULL; // число освобождаемых байтов в конце структуры
- wc.cbClsExtra = NULL; // число освобождаемых байтов при создании экземпляра приложения
- wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // декриптор пиктограммы
- wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // дескриптор маленькой пиктограммы (в трэе)
- wc.hCursor = LoadCursor(NULL, IDC_ARROW); // дескриптор курсора
- wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // дескриптор кисти для закраски фона окна
- wc.hInstance = hInst; // указатель на строку, содержащую имя меню, применяемого для класса
- if(!RegisterClassEx(&wc)){
- // в случае отсутствия регистрации класса:
- MessageBox(NULL, L"Не получилось зарегистрировать класс!", L"Ошибка", MB_OK);
- return NULL; // возвращаем, следовательно, выходим из WinMain
- }
- // Функция, создающая окошко:
- hMainWnd = CreateWindow(
- szClassName, // имя класса
- L"Для сохранения снимка щёлкните по снимку (в окне)", // имя окошка (то что сверху)
- WS_OVERLAPPEDWINDOW | WS_VSCROLL, // режимы отображения окошка
- CW_USEDEFAULT, // позиция окошка по оси х
- NULL, // позиция окошка по оси у (раз дефолт в х, то писать не нужно)
- CW_USEDEFAULT, // ширина окошка
- NULL, // высота окошка (раз дефолт в ширине, то писать не нужно)
- (HWND)NULL, // дескриптор родительского окна
- NULL, // дескриптор меню
- HINSTANCE(hInst), // дескриптор экземпляра приложения
- NULL); // ничего не передаём из WndProc
- if(!hMainWnd){
- // в случае некорректного создания окошка (неверные параметры и тп):
- MessageBox(NULL, L"Не получилось создать окно!", L"Ошибка", MB_OK);
- return NULL;
- }
- ShowWindow(hMainWnd, nCmdShow); // отображаем окошко
- UpdateWindow(hMainWnd); // обновляем окошко
- while(GetMessage(&msg, NULL, NULL, NULL)){ // извлекаем сообщения из очереди, посылаемые фу-циями, ОС
- TranslateMessage(&msg); // интерпретируем сообщения
- DispatchMessage(&msg); // передаём сообщения обратно ОС
- }
- return msg.wParam; // возвращаем код выхода из приложения
- }
- LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
- HDC hDC, hDCMem; // создаём дескриптор ориентации текста на экране
- PAINTSTRUCT ps; // структура, сод-щая информацию о клиентской области (размеры, цвет и тп)
- RECT rect; // стр-ра, определяющая размер клиентской области
- COLORREF colorText = RGB(255, 0, 0); // задаём цвет текста
- HBITMAP hBmp, hMaska, hOldBitmap, bmpMem;
- BITMAP bmInfo;
- HINSTANCE hInstance;
- BOOL sucess;
- OPENFILENAME ofn;
- static BOOL SetWindowPosRes = FALSE;
- switch(uMsg){
- case WM_CREATE:
- hDC = BeginPaint(hWnd, &ps);
- //HBITMAP hBmp;
- break;
- case WM_PAINT: {// если нужно нарисовать, то:
- GetClientRect(hWnd, &rect);
- hDC = BeginPaint(hWnd, &ps); // инициализируем контекст устройства
- if ( OpenClipboard(hWnd) )
- hBmp = (HBITMAP)GetClipboardData(CF_BITMAP);
- if (hBmp == NULL)
- {
- MessageBox(NULL, L"Error", L" ", MB_OK);
- CloseClipboard();
- PostQuitMessage(NULL);
- }
- hDCMem = CreateCompatibleDC(hDC);
- hOldBitmap = (HBITMAP) SelectObject(hDCMem, hBmp);
- GetObject(hBmp, sizeof(bmInfo), &bmInfo);
- bmpMem = CreateCompatibleBitmap (hDC, bmInfo.bmWidth-16, bmInfo.bmHeight-38);
- BitBlt(hDC, 0, 0, bmInfo.bmWidth-16, bmInfo.bmHeight-38, hDCMem, 8, 30, SRCCOPY); //Оставлю этот идеальный код потомкам
- if (SetWindowPosRes == FALSE)
- {
- SetWindowPos(hWnd, (HWND)NULL, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, SWP_NOMOVE);
- SetWindowPosRes = TRUE;
- }
- CloseClipboard();
- DeleteDC(hDCMem);
- EndPaint(hWnd, &ps); // заканчиваем рисовать
- break;
- }
- case WM_LBUTTONDOWN: {
- char szFileName[MAX_PATH] = "";
- ZeroMemory(&ofn, sizeof(ofn));
- ofn.lStructSize = sizeof(ofn);
- ofn.hwndOwner = NULL;
- ofn.lpstrFilter = (LPCWSTR)L"Text Files (*.bmp)\0*.bmp\0All Files (*.*)\0*.*\0";
- ofn.lpstrFile = (LPWSTR)szFileName;
- ofn.nMaxFile = MAX_PATH;
- ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
- ofn.lpstrDefExt = (LPCWSTR)L"bmp";
- GetSaveFileName(&ofn);
- StoreBitmapFile((LPCTSTR)szFileName, hBmp);
- break;
- }
- case WM_DESTROY: // если окошко закрылось, то:
- PostQuitMessage(NULL); // отправляем WinMain() сообщение WM_QUIT
- break;
- default:
- return DefWindowProc(hWnd, uMsg, wParam, lParam); // если закрыли окошко
- }
- return NULL; // возвращаем значение
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement