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

Из этой статьи вы узнаете, как создать и отобразить окно.

Классы Окон

Класс window определяет набор поведений, которые могут быть общими для нескольких окон. Например, в группе кнопок каждая кнопка имеет аналогичное поведение, когда пользователь нажимает кнопку. Конечно, кнопки не полностью идентичны. Каждая кнопка отображает собственную текстовую строку и собственные экранные координаты. Данные, уникальные для каждого окна, называются данными экземпляра.

Каждое окно должно быть связано с классом window, даже если программа когда-либо создает только один экземпляр этого класса. Оконный класс не является классом в смысле C++. Скорее, это структура данных, используемая внутренне операционной системой. Классы окон регистрируются в системе во время выполнения. Чтобы зарегистрировать новый класс окна, заполните структуру 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 — это указатель на определяемую приложением функцию, называемую процедурой окна или оконным процессом. Процедура окна определяет большую часть поведения окна. На данный момент это значение представляет собой прямое объявление функции. Дополнительные сведения см. в статье Написание процедуры Window.
  • hInstance — это дескриптор экземпляра приложения. Получите это значение из параметра hInstance объекта wWinMain.
  • lpszClassName — это строка, идентифицирующая класс окна.

Имена классов являются локальными для текущего процесса, поэтому имя должно быть уникальным только в рамках процесса. Однако стандартные элементы управления Windows также имеют классы. Если вы используете любой из этих элементов управления, необходимо выбрать имена классов, которые не конфликтуют с именами классов элементов управления. Например, класс window для элемента управления button называется Button.

Структура WNDCLASS содержит другие члены, которые здесь не показаны. Вы можете задать для них нулевое значение, как показано в этом примере, или заполнить их. Дополнительные сведения см. в разделе WNDCLASS.

Затем передайте адрес структуры WNDCLASS в функцию RegisterClass . Эта функция регистрирует класс window в операционной системе.

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;
}

Подробные описания параметров см. в разделе CreateWindowEx. Вот краткая сводка:

  • Первый параметр позволяет указать некоторые необязательные варианты поведения для окна, например прозрачные окна. Задайте для этого параметра нулевое значение для поведения по умолчанию.
  • CLASS_NAME — это имя класса окна. Это имя определяет тип создаваемого окна.
  • Текст окна используется различными способами различными типами окон. Если в окне есть строка заголовка, текст отображается в строке заголовка.
  • Стиль окна — это набор флагов, определяющих внешний вид окна. Константная WS_OVERLAPPEDWINDOW на самом деле представляет собой несколько флагов в сочетании с побитовой OR. Вместе эти флаги предоставляют окна заголовок окна, границу, системное меню и кнопки Свернуть и Развернуть . Этот набор флагов является наиболее распространенным стилем для окна приложения верхнего уровня.
  • Для положения и размера константная CW_USEDEFAULT означает использование значений по умолчанию.
  • Следующий параметр задает родительское окно или окно владельца для нового окна. Задайте родительский параметр if для создания дочернего окна. Для окна верхнего уровня задайте для этого значения значение NULL.
  • Для окна приложения следующий параметр определяет меню для окна. В этом примере меню не используется, поэтому значение равно NULL.
  • hInstance — это дескриптор экземпляра, описанный выше. См . раздел WinMain: точка входа приложения.
  • Последний параметр является указателем на произвольные данные типа void*. Это значение можно использовать для передачи структуры данных в процедуру окна. Один из возможных способов использования этого параметра см. в разделе Управление состоянием приложения.

CreateWindowEx возвращает дескриптор новому окну или ноль в случае сбоя функции. Чтобы отобразить окно, то есть сделать окно видимым, передайте дескриптор окна в функцию ShowWindow :

ShowWindow(hwnd, nCmdShow);

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

Ниже приведен полный код для создания окна. Помните, что WindowProc по-прежнему представляет собой только прямое объявление функции.

// 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;

RegisterClass(&wc);

// Create the window.

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;
}

ShowWindow(hwnd, nCmdShow);

Поздравляем, вы создали окно!

Сейчас окно не содержит никакого содержимого и не взаимодействует с пользователем. В реальном графическом приложении окно будет реагировать на события пользователя и операционной системы. В следующем разделе описывается, как сообщения окна обеспечивают такого рода интерактивность.

См. также раздел

Перейдите к оконным сообщениям , чтобы продолжить этот модуль.