Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Основные элементы программ с оконным пользовательским интерфейсом. Минимальная программа для ОС 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'ов. Если мы хотим, например, чтобы наша программа обращала внимание на изменение размера окна, то мы должны написать

switch (Message)

{

...

case WM_SIZE:

//Обработчик сообщенияWM_SIZE.

...

Если же мы такого не напишем, то наша программа никак реагировать на изменение размеров окна не будет. При этом соответствующее сообщение Windows программа все равно получит.

Мы писали минимальную программу, так что у нас обработчик только одного сообщения Windows - WM_DESTROY. Это сообщение окно получает при своем уничтожении. В этом обработчике мы только делаем некоторые действия, связанные с уничтожением нашего окна.

Обратите внимание на ветку default:

...

default:

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

...

Тут мы вызываем API-функцию DefWindowProc. Основное предназначение этой API-функции - это обработка сообщений Windows, которые не обрабатываются в нашей программе (т. е. тех, для которых нет своего case). При этом ничего особенно это функция не делает, но очередь из сообщений при этом двигается. И это самое важное - если у нас не было обработчика по умолчанию, то сообщения, не обрабатываемые нашей программой, забили бы очередь, и она бы встала - и даже те сообщения, для которых есть обработчики, никогда бы не были обработаны. Таким образом, основное предназначение функции DefWindowProc - это обработка ("проглатываение") тех сообщений, которые не обрабатываются в каком-нибудь case'е.

В оконную процедуру передаются 4 параметра:

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

{

...

Первый из этих параметров - это окно, в которое мы передаем сообщение Windows. Второй - это само сообщение. Третий и четвертый параметры - это дополнительные параметры для конкретного сообщения. Эти параметры будет разными для разных сообщений (и для некоторых сообщений Windows могут вообще не использоваться). Например, для сообщения WM_LBUTTONDOWN в дополнительных параметрах передаются x и y той точки, в которой мы щелкнули, информация и том, были ли при этом нажаты кнопки shift, atl и ctrl и другое; для сообщения WM_SIZE - новые размеры окна и т. д.. Еще обратите внимание, что эти же параметры у нас передаются в функцию DefWindowProc.

 


Поделиться:

Дата добавления: 2015-01-29; просмотров: 102; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты