четверг, 3 января 2013 г.

C++: WinApi Регистрация и создание окна

Регистрация класса окна

Во-первых, сразу стоит сказать, что класс окна это не класс C++, а скорее структура данных используемая внутри ОС Windows. В Windows-приложении, каждое создаваемое окно должно быть связано с классом окна, даже если программа создает всего один экземпляр окна. Окна регистрируются во время выполнения программы. Для этого нужно создать и заполнить структуру WNDCLASS.
// Register the window class.
const wchar_t CLASS_NAME[]  = L"Sample Window Class";
    
WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;
wc.hInstance     = hInstance;
wc.lpszClassName = CLASS_NAME;
Необходимо установить значения следующим членам структуры:
  • lpfnWndProc - указатель на определенную приложением функцию, называемой процедурой окна или оконной процедурой.
  • hInstance - дескриптор экземпляра приложения, полученный из функции WinMain
  • lpszClassName - строка, которая определяет имя класса окна.

Далее необходимо передать созданную структуру WNDCLASS функции RegisterClass. Она зарегистрирует окно в ОС.

RegisterClass(&wc);

Создание окна

Для создания окна используется функция CreateWindowEx.

 HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
        );

    if (hwnd == NULL)
    {
        return 0;
    }

Как мы видим она принимает много параметров. Рассмотрим их.

  • Необязательные дополнительные параметры (например, прозрачность), установка 0 означает параметр по умолчанию.
  • CLASS_NAME имя класса окна, зарегистрированного выше
  • Текст заголовка окна.
  • Стиль окна, определяемый набором флагов. Флаг WS_OVERLAPPENDWINDOW это наиболее распространенное окно с заголовком, границей, поддержкой системы меню и кнопки свертывания и развертывания.
  • Далее идут 4 параметра определяющие размер и позиция окна. Для позиционирования по умолчанию ставим везде CW_USEDEFAULT.
  • Родитель окна, если это окно верхнего уровня устанавливаем NULL
  • Меню окна. В данном случае меню не используется ставим NULL
  • Дескриптор обработчика переданным функции WinMain
  • Указатель на произвольные типы данных, установим в NULL

CreateWindowEx возвращает дескриптор нового окна или NULL, если окно создать не удалось.

Для отображения окна, вызываем функцию ShowWindow.

ShowWindow(hwnd, nCmdShow);

Параметр hwnd это дескриптор окна возвращенный функцией CreateWindowEx. Параметр nCmdShow может быть использован для минимизации или максимизации окна. ОС передает этот параметр в функцию WinMain

Комментариев нет:

Отправить комментарий