Advertisement
ponchic

Untitled

Jan 6th, 2016
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.    
  2. #include <windows.h> // заголовочный файл, содержащий WINAPI
  3.  
  4.  
  5. // Прототип функции обработки сообщений с пользовательским названием:
  6. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  7. TCHAR mainMessage[] = L"Какой то-текст!"; // строка с сообщением
  8.  
  9. // Управляющая функция:
  10. int WINAPI WinMain(HINSTANCE hInst, // дескриптор экземпляра приложения
  11.     HINSTANCE hPrevInst, // не используем
  12.     LPSTR lpCmdLine, // не используем
  13.     int nCmdShow) // режим отображения окошка
  14. {
  15.     TCHAR szClassName[] = L"Мой класс"; // строка с именем класса
  16.     HWND hMainWnd; // создаём дескриптор будущего окошка
  17.     MSG msg; // создём экземпляр структуры MSG для обработки сообщений
  18.     WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
  19.     wc.cbSize        = sizeof(wc); // размер структуры (в байтах)
  20.     wc.style         = CS_HREDRAW | CS_VREDRAW; // стиль класса окошка
  21.     wc.lpfnWndProc   = WndProc; // указатель на пользовательскую функцию
  22.     wc.lpszMenuName  = NULL; // указатель на имя меню (у нас его нет)
  23.     wc.lpszClassName = szClassName; // указатель на имя класса
  24.     wc.cbWndExtra    = NULL; // число освобождаемых байтов в конце структуры
  25.     wc.cbClsExtra    = NULL; // число освобождаемых байтов при создании экземпляра приложения
  26.     wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO); // декриптор пиктограммы
  27.     wc.hIconSm       = LoadIcon(NULL, IDI_WINLOGO); // дескриптор маленькой пиктограммы (в трэе)
  28.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW); // дескриптор курсора
  29.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // дескриптор кисти для закраски фона окна
  30.     wc.hInstance     = hInst; // указатель на строку, содержащую имя меню, применяемого для класса
  31.     if(!RegisterClassEx(&wc)){
  32.         // в случае отсутствия регистрации класса:
  33.         MessageBox(NULL, L"Не получилось зарегистрировать класс!", L"Ошибка", MB_OK);
  34.         return NULL; // возвращаем, следовательно, выходим из WinMain
  35.     }
  36.     // Функция, создающая окошко:
  37.     hMainWnd = CreateWindow(
  38.         szClassName, // имя класса
  39.         L"Сохранение снимка", // имя окошка (то что сверху)
  40.         WS_OVERLAPPEDWINDOW | WS_VSCROLL, // режимы отображения окошка
  41.         CW_USEDEFAULT, // позиция окошка по оси х
  42.         NULL, // позиция окошка по оси у (раз дефолт в х, то писать не нужно)
  43.         CW_USEDEFAULT, // ширина окошка
  44.         NULL, // высота окошка (раз дефолт в ширине, то писать не нужно)
  45.         (HWND)NULL, // дескриптор родительского окна
  46.         NULL, // дескриптор меню
  47.         HINSTANCE(hInst), // дескриптор экземпляра приложения
  48.         NULL); // ничего не передаём из WndProc
  49.     if(!hMainWnd){
  50.         // в случае некорректного создания окошка (неверные параметры и тп):
  51.         MessageBox(NULL, L"Не получилось создать окно!", L"Ошибка", MB_OK);
  52.         return NULL;
  53.     }
  54.     ShowWindow(hMainWnd, nCmdShow); // отображаем окошко
  55.     UpdateWindow(hMainWnd); // обновляем окошко
  56.     while(GetMessage(&msg, NULL, NULL, NULL)){ // извлекаем сообщения из очереди, посылаемые фу-циями, ОС
  57.         TranslateMessage(&msg); // интерпретируем сообщения
  58.         DispatchMessage(&msg); // передаём сообщения обратно ОС
  59.     }
  60.     return msg.wParam; // возвращаем код выхода из приложения
  61. }
  62.  
  63. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
  64.     HDC hDC, hDCMem; // создаём дескриптор ориентации текста на экране
  65.     PAINTSTRUCT ps; // структура, сод-щая информацию о клиентской области (размеры, цвет и тп)
  66.     RECT rect; // стр-ра, определяющая размер клиентской области
  67.     COLORREF colorText = RGB(255, 0, 0); // задаём цвет текста
  68.     HBITMAP hBmp, hMaska, hOldBitmap;
  69.     BITMAP bmInfo;
  70.     HINSTANCE hInstance;
  71.     BOOL sucess;
  72.     switch(uMsg){
  73.  
  74.     case WM_CREATE: {
  75.         hDC = BeginPaint(hWnd, &ps);
  76.         HBITMAP hBmp;
  77. if ( OpenClipboard(hWnd) )
  78. hBmp = (HBITMAP)GetClipboardData(CF_BITMAP);
  79.  
  80.  
  81. CloseClipboard();
  82. break;
  83.             }
  84.            
  85.     case WM_PAINT: {// если нужно нарисовать, то:
  86.          GetClientRect(hWnd, &rect);
  87.             HBITMAP hMemBmp;
  88.             hDC = BeginPaint(hWnd, &ps); // инициализируем контекст устройства
  89.             hMemBmp = CreateCompatibleBitmap(hDC, rect.right - rect.left,  rect.bottom - rect.top);
  90.  
  91.             if (hBmp != NULL)
  92.             hMemBmp = hBmp;
  93.  
  94.  
  95.        
  96.         GetClientRect(hWnd, &rect); // получаем ширину и высоту области для рисования
  97.         SetTextColor(hDC, colorText); // устанавливаем цвет контекстного устройства
  98.         DrawText(hDC, mainMessage, -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); // рисуем текст
  99.  
  100.        
  101.             hDCMem = CreateCompatibleDC(hDC);
  102.              //
  103. SelectObject(hDCMem, hMemBmp);
  104.          
  105. hOldBitmap = (HBITMAP) SelectObject(hDCMem, hBmp);
  106. GetObject(hBmp, sizeof(bmInfo), &bmInfo);
  107.  
  108.              sucess = BitBlt(hDC, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, hDCMem, 8, 22, SRCCOPY);
  109.              DeleteObject(hMemBmp);
  110.              DeleteDC(hDCMem);
  111.              
  112.              
  113.        
  114.  
  115.  
  116.    
  117.            
  118.        
  119.  
  120. EndPaint(hWnd, &ps); // заканчиваем рисовать
  121.  
  122.  
  123. break;
  124.     }
  125.     case WM_DESTROY: // если окошко закрылось, то:
  126.         PostQuitMessage(NULL); // отправляем WinMain() сообщение WM_QUIT
  127.         break;
  128.     default:
  129.         return DefWindowProc(hWnd, uMsg, wParam, lParam); // если закрыли окошко
  130.     }
  131.     return NULL; // возвращаем значение
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement