Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_OSiSP.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
647.78 Кб
Скачать

5. Основные элементы программ с оконным пользовательским интерфейсом. Минимальная программа для ос Windows с окном на экране. Создание и отображение окна.

Каждое приложение представлено на экране дисплея своим окном, которое выглядит как прямоугольная рабочая область с набором стандартных элементов управления. Окно идентифицируется своим заголовком, имеет кнопки минимизации и максимизации размеров, а также кнопку завершения приложения. Под заголовком обычно находится строка меню для выбора различных команд или режимов работы. Большинство программ для Windows поддерживают работу и с клавиатурой, и с мышью. Стандартизация графического интерфейса имеет очень большое значение для пользователя, потому что одинаковый интерфейс экономит его время и упрощает изучение новых приложений. С точки зрения программиста, стандартный вид интерфейса обеспечивается использованием подпрограмм, встроенных непосредственно в Windows, что также приводит к существенной экономии времени при написании новых программ.

Минимальная программа:

#include <windows.h>

LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

HWND hwnd;

MSG msg;

WNDCLASS w;

memset(&w, 0, sizeof(WNDCLASS));

w.style = CS_HREDRAW | CS_VREDRAW;

w.lpfnWndProc = WndProc;

w.hInstance = hInstance;

w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

w.lpszClassName = "My Class";

RegisterClass(&w);

hwnd = CreateWindow("My Class", "My title", WS_OVERLAPPEDWINDOW,

300, 200, 200, 180, NULL, NULL, hInstance, NULL);

ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)

{

switch (Message)

{

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd, Message, wparam, lparam);

}

return 0;

}

WinMain - это главная функция в Windows-приложениях. Именно с нее и начинается выполнение программы. Аналогичной функцией в консольных приложениях является функция main. Разумеется, функция WinMain должна быть ровно одна - не больше и не меньше.

В WinMain передается 4 параметра. Первые два из них имеют тип HINSTANCE. Этот тип - это Windows-тип который означает экземпляр приложения. Первый параметр при этом содержит указатель (в смысле handle) на текущий экземпляр приложения, второй - всегда равен NULL. Третий параметр представляет из себя указатель на строку, заканчивающуюся нуль-символом (стандартное представление строк в C/C++). Эта строка - это параметры командной строки, передаваемой в приложение. Параметры командной строки включают и имя программы. И, наконец, четвертый параметр определяет способ показа главного окна нашего приложения - т. е. показывать ли его развернутым на целый экран, или в нормальном виде, или в сложенном и др.

Сначала мы создаем класс окна, потом регистрируем его в Windows, после чего создаем на основе этого класса окно и показываем его. На последнем этапе мы запускаем цикл обработки сообщений (так называемый message pump).

Создание класса окна начинается с объявления переменной типа WNDCLASS: WNDCLASS w;

Далее мы заполняем поля этой переменной. Она имеет структурный тип, так что мы должны заполнить все поля. Так как большинство из них можно поставить в ноль, то сначала мы обнуляем их всех:

memset(&w, 0, sizeof(WNDCLASS));

а потом задаем для остальных подходящие значения:

w.style = CS_HREDRAW | CS_VREDRAW;

w.lpfnWndProc = WndProc;

w.hInstance = hInstance;

w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

w.lpszClassName = "My Class";

Тут мы последовательно задавали стиль окна, установили, что переменная hInstance нашей структуры должна содержать handle на текущий экземпляр приложения (это первый параметр функции WinMain), установили цвет фона и задали имя класса окна.

Далее мы регистрируем наш класс в системе Windows: RegisterClass(&w);

После этого мы, наконец-то, создаем окно с помощью функции CreateWindow:

hwnd = CreateWindow("My Class", "My title", WS_OVERLAPPEDWINDOW,

300, 200, 200, 180, NULL, NULL, hInstance, NULL);

Параметры этой функции задают внешний вид нашего окна. Она возвращает в качестве значения handle на созданное окно. Это у нас переменная hwnd типа HWND. Далее все операции с окном мы делаем через этот handle. В частности, мы показываем окно и обновляем его:

ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

После того, как окно создано и показано, мы запускаем цикл обработки сообщений:

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

Окнонная процедура у нас названа WndProc. Это название произвольное - в принципе мы могли назвать ее как угодно. Основное предназначение оконной процедуры - это обработка сообщений Windows. Для этого мы пишем большой (как правило) switch, внутри которого пишем несколько case'ов. Если мы хотим, например, чтобы наша программа обращала внимание на изменение размера окна, то мы должны написат

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]