Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Из этой статьи вы узнаете, как создать и показать окно.
Классы окон
Класс окна определяет набор поведения, который может иметь несколько окон. Например, в группе кнопок каждая кнопка имеет аналогичное поведение, когда пользователь выбирает кнопку. Конечно, кнопки не совсем идентичны. Каждая кнопка отображает собственную текстовую строку и имеет собственные координаты экрана. Данные, уникальные для каждого окна, называются данными экземпляра.
Каждое окно должно быть связано с классом окна, даже если программа только когда-либо создает один экземпляр этого класса. Класс окна не является классом в смысле 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 proc. Процедура окна определяет большую часть поведения окна. На данный момент это значение является предварительным объявлением функции. Дополнительные сведения см. в написании процедуры окна.
-
hInstance — это дескриптор экземпляра приложения. Получите это значение из параметра hInstance
wWinMain. - lpszClassName — это строка, определяющая класс окна.
Имена классов являются локальными для текущего процесса, поэтому имя должно быть уникальным только в процессе. Однако стандартные элементы управления Windows также имеют классы. Если вы используете любой из этих элементов управления, необходимо выбрать имена классов, которые не конфликтуют с именами классов элементов управления. Например, класс окна для элемента управления кнопкой называется Button.
Структура WNDCLASS содержит другие элементы, которые не отображаются здесь. Их можно задать равным нулю, как показано в этом примере, или заполнить их. Дополнительные сведения см. в WNDCLASS.
Затем передайте адрес структуры 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;
}
Подробные описания параметров см. в разделе CreateWindowEx. Ниже приведена краткая сводка:
- Первый параметр позволяет указать некоторые необязательные действия для окна, например прозрачные окна. Задайте для этого параметра нулевое значение для поведения по умолчанию.
-
CLASS_NAME— это имя класса окна. Это имя определяет тип создаваемого окна. - Текст окна используется различными способами различными типами окон. Если в окне есть строка заголовка, текст отображается в строке заголовка.
- Стиль окна — это набор флагов, определяющих некоторый вид и ощущение окна. Константа WS_OVERLAPPEDWINDOW фактически представляет собой несколько флагов, объединенных побитовой операцией
OR. Вместе эти флаги дают окну заголовок, границу, системное меню и кнопки Минимизировать и Максимизировать. Этот набор флагов является наиболее распространенным стилем окна приложения верхнего уровня. - Для позиции и размера константы CW_USEDEFAULT означает использование значений по умолчанию.
- Следующий параметр задает родительское окно или окно владельца для нового окна. Задайте родительский объект, если нужно создать дочернее окно. Для окна верхнего уровня задайте для этого значения значение
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);
Поздравляем, вы создали окно!
Сейчас окно не содержит содержимого или не взаимодействует с пользователем. В реальном приложении ГРАФИЧЕСКОго интерфейса окно будет реагировать на события от пользователя и операционной системы. В следующем разделе описывается, как сообщения о окне предоставляют этот вид интерактивности.