Advertisement
andrej22116

Create Parent Window (WINAPI)

Nov 7th, 2016
3,082
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     Тут описан процесс создания простого оконного приложения Windows
  3.     В рамках данного кода будет описываться создание окна без дополнительного функционала.
  4.    
  5.     15-IT-1
  6.     PSU.by
  7. */
  8.  
  9. #include <windows.h>
  10.  
  11. #define START_SIZE_X 800
  12. #define START_SIZE_Y 600
  13.  
  14. const char WINDOW_CLASS_NAME[] = "Win";
  15.  
  16. // Обработчик событий окна.
  17. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  18. ATOM registerClasses(HINSTANCE); // Процедура, в которой будут происходить регистрации окон.
  19.  
  20. /* Функция входа. На вход принимает универсальный идентификатор, присвоенный приложению,
  21.     идентификатор предыдущего за ним приложения (Устарело и не используется (Только для совместимости)),
  22.     данные командной строки, способ отображения.
  23.    
  24.     ВАЖНО!: WinMain используется в проекте Win32. Если вы создали проект консольного приложения,
  25.     То укажите в качестве главной процедуре main.
  26.     Что бы получить HINSTANCE в процедуре main, добавьте в начало процедуры следующий код:
  27.  
  28.     HINSTANCE hInstance = GetModuleHandle(NULL);
  29.  
  30. */
  31. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  32. {
  33.     HWND hWnd;  // Хендел будущего окна.
  34.     MSG msg;    // Структура сообщиния.
  35.  
  36.     if ( !registerClasses(hInstance)) {
  37.         /*
  38.             В случае проблемы при регистрации ваших окон создаём маленькое информационное окошко.
  39.             Первый параметр - хендел окна. При указание вызывающего окна (передаче его хендла)
  40.             окно будет заблокировано, пока весит сообщение.
  41.  
  42.             MB_OK - добавит одну кнопку "ОК".
  43.             MB_ICONERROR - добавит иконку с крестиком. :)
  44.         */
  45.         MessageBox(0, "Ошибка регистрации классов окон!", "Ошибка!", MB_OK | MB_ICONERROR);
  46.         return -1;
  47.     }
  48.  
  49.     // Создаём окно.
  50.     hWnd = CreateWindow(WINDOW_CLASS_NAME,      // Класс окна (Указываем наш класс, но это может быть и любой другой класс).
  51.                         "Parent Window",        // Имя окна (Будет отображаться в заголовке окна, если такой имеется).
  52.                         WS_OVERLAPPEDWINDOW,    // Стиль окна. Данный стиль сообщает, что у нас будет шапка с кнопками.
  53.                         CW_USEDEFAULT,          // Расположение окна на экране по оси OX - стандартное.
  54.                         CW_USEDEFAULT,          // Расположение окна на экране по оси OY - стандартное.
  55.                         START_SIZE_X,           // Ширина окна.
  56.                         START_SIZE_Y,           // Высота окна.
  57.                         NULL,                   // Хендл окна родителя. В данном случае родителя нет.
  58.                         NULL,                   // ID окна. Используется для обработки сообщений от окна в обработчике родителя.
  59.                         hInstance,              // Идентификатор приложения.
  60.                         NULL);                  // Зарезервированный параметр (Он может использоваться, но не сейчас).
  61.     if (!hWnd) {
  62.         MessageBox(0, "Не удалось создать окно!", "Ошибка!", MB_OK | MB_ICONERROR);
  63.         return -2;
  64.     }
  65.  
  66.     // Отображаем окно ( iCmdShow имеет параметр отображения из строки консоли. По умолчанию это SW_SHOW - отобразить).
  67.     ShowWindow(hWnd, iCmdShow);
  68.     // Обновляем окно.
  69.     UpdateWindow(hWnd);
  70.  
  71.     // GetMessage принимает сообщение из очереди сообщений. Можно настроить принимаемые сообщения (Их порядок).
  72.     while (GetMessage(&msg, NULL, 0, 0)) {
  73.         // Тут идёт подготовка и отправка сообщения в обработчик окна.
  74.         // Вы так же можете обработать сообщение в самом цикле, если это необходимо (открыть структуру MSG).
  75.         TranslateMessage(&msg);
  76.         DispatchMessage(&msg);
  77.     }
  78.     return msg.wParam;
  79. }
  80.  
  81. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  82. {
  83.     switch (msg) {
  84.         case WM_CREATE: {} break;
  85.         case WM_PAINT: {} break;
  86.         case WM_DESTROY: {
  87.             // отправить сообщение о завершении. GetMessage вернёт ноль, получи это сообщение.
  88.             PostQuitMessage(0);
  89.         } break;
  90.  
  91.         // Вызов обработчика по умолчанию.
  92.         default: return DefWindowProc(hWnd, msg, wParam, lParam);
  93.     }
  94.     // Если сообщение обработали вы, то обязательно верните ноль, что бы сообщить это Windows.
  95.     return 0;
  96. }
  97.  
  98. ATOM registerClasses(HINSTANCE hInstance)
  99. {
  100.     WNDCLASSEX wndclass;
  101.  
  102.     wndclass.cbSize         = sizeof(wndclass);                 // Размер структуры.
  103.     wndclass.style          = CS_HREDRAW | CS_VREDRAW;          // Автоматическая перерисовка при изменении размеров окна.
  104.     wndclass.lpfnWndProc    = WndProc;                          // Адрес функции, которая будет обрабатывать сообщения.
  105.     wndclass.cbClsExtra     = 0;                                // Резервирование памяти.
  106.     wndclass.cbWndExtra     = 0;                                // Резервирование памяти.
  107.     wndclass.hInstance      = hInstance;                        // HANDLE вашего приложения.
  108.     wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);  // Иконка приложения (По умолчанию).
  109.     wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);      // Рисунок курсора (По умолчанию).
  110.     wndclass.hbrBackground  = (HBRUSH)GetStockObject(0);        // Цвет заднего фона (Белый в данном случае).
  111.     wndclass.lpszMenuName   = NULL;                             // Указатель на существующие меню (Описывается в ресурсах или в коде).
  112.     wndclass.lpszClassName  = WINDOW_CLASS_NAME;                // Имя класса окна.
  113.     wndclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);  // Маленькая иконка для верхнего угла и прочего (По умолчанию).
  114.    
  115.     return RegisterClassEx(&wndclass);
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement