Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Тут описан процесс создания простого оконного приложения Windows
- В рамках данного кода будет описываться создание окна без дополнительного функционала.
- 15-IT-1
- PSU.by
- */
- #include <windows.h>
- #define START_SIZE_X 800
- #define START_SIZE_Y 600
- const char WINDOW_CLASS_NAME[] = "Win";
- // Обработчик событий окна.
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- ATOM registerClasses(HINSTANCE); // Процедура, в которой будут происходить регистрации окон.
- /* Функция входа. На вход принимает универсальный идентификатор, присвоенный приложению,
- идентификатор предыдущего за ним приложения (Устарело и не используется (Только для совместимости)),
- данные командной строки, способ отображения.
- ВАЖНО!: WinMain используется в проекте Win32. Если вы создали проект консольного приложения,
- То укажите в качестве главной процедуре main.
- Что бы получить HINSTANCE в процедуре main, добавьте в начало процедуры следующий код:
- HINSTANCE hInstance = GetModuleHandle(NULL);
- */
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
- {
- HWND hWnd; // Хендел будущего окна.
- MSG msg; // Структура сообщиния.
- if ( !registerClasses(hInstance)) {
- /*
- В случае проблемы при регистрации ваших окон создаём маленькое информационное окошко.
- Первый параметр - хендел окна. При указание вызывающего окна (передаче его хендла)
- окно будет заблокировано, пока весит сообщение.
- MB_OK - добавит одну кнопку "ОК".
- MB_ICONERROR - добавит иконку с крестиком. :)
- */
- MessageBox(0, "Ошибка регистрации классов окон!", "Ошибка!", MB_OK | MB_ICONERROR);
- return -1;
- }
- // Создаём окно.
- hWnd = CreateWindow(WINDOW_CLASS_NAME, // Класс окна (Указываем наш класс, но это может быть и любой другой класс).
- "Parent Window", // Имя окна (Будет отображаться в заголовке окна, если такой имеется).
- WS_OVERLAPPEDWINDOW, // Стиль окна. Данный стиль сообщает, что у нас будет шапка с кнопками.
- CW_USEDEFAULT, // Расположение окна на экране по оси OX - стандартное.
- CW_USEDEFAULT, // Расположение окна на экране по оси OY - стандартное.
- START_SIZE_X, // Ширина окна.
- START_SIZE_Y, // Высота окна.
- NULL, // Хендл окна родителя. В данном случае родителя нет.
- NULL, // ID окна. Используется для обработки сообщений от окна в обработчике родителя.
- hInstance, // Идентификатор приложения.
- NULL); // Зарезервированный параметр (Он может использоваться, но не сейчас).
- if (!hWnd) {
- MessageBox(0, "Не удалось создать окно!", "Ошибка!", MB_OK | MB_ICONERROR);
- return -2;
- }
- // Отображаем окно ( iCmdShow имеет параметр отображения из строки консоли. По умолчанию это SW_SHOW - отобразить).
- ShowWindow(hWnd, iCmdShow);
- // Обновляем окно.
- UpdateWindow(hWnd);
- // GetMessage принимает сообщение из очереди сообщений. Можно настроить принимаемые сообщения (Их порядок).
- while (GetMessage(&msg, NULL, 0, 0)) {
- // Тут идёт подготовка и отправка сообщения в обработчик окна.
- // Вы так же можете обработать сообщение в самом цикле, если это необходимо (открыть структуру MSG).
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
- LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch (msg) {
- case WM_CREATE: {} break;
- case WM_PAINT: {} break;
- case WM_DESTROY: {
- // отправить сообщение о завершении. GetMessage вернёт ноль, получи это сообщение.
- PostQuitMessage(0);
- } break;
- // Вызов обработчика по умолчанию.
- default: return DefWindowProc(hWnd, msg, wParam, lParam);
- }
- // Если сообщение обработали вы, то обязательно верните ноль, что бы сообщить это Windows.
- return 0;
- }
- ATOM registerClasses(HINSTANCE hInstance)
- {
- WNDCLASSEX wndclass;
- wndclass.cbSize = sizeof(wndclass); // Размер структуры.
- wndclass.style = CS_HREDRAW | CS_VREDRAW; // Автоматическая перерисовка при изменении размеров окна.
- wndclass.lpfnWndProc = WndProc; // Адрес функции, которая будет обрабатывать сообщения.
- wndclass.cbClsExtra = 0; // Резервирование памяти.
- wndclass.cbWndExtra = 0; // Резервирование памяти.
- wndclass.hInstance = hInstance; // HANDLE вашего приложения.
- wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Иконка приложения (По умолчанию).
- wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // Рисунок курсора (По умолчанию).
- wndclass.hbrBackground = (HBRUSH)GetStockObject(0); // Цвет заднего фона (Белый в данном случае).
- wndclass.lpszMenuName = NULL; // Указатель на существующие меню (Описывается в ресурсах или в коде).
- wndclass.lpszClassName = WINDOW_CLASS_NAME; // Имя класса окна.
- wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Маленькая иконка для верхнего угла и прочего (По умолчанию).
- return RegisterClassEx(&wndclass);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement