Студопедия  
Главная страница | Контакты | Случайная страница

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

Графический интерфейс пользователя

Читайте также:
  1. LINUX|| Задачи и интерфейсы Unix-подобных систем.
  2. MS DOS С ТОЧКИ ЗРЕНИЯ ПОЛЬЗОВАТЕЛЯ. ФАЙЛЫ И КАТАЛОГИ.
  3. Библиографический поиск литературных источников
  4. Библиографический список
  5. Библиографический список
  6. БИБЛИОГРАФИЧЕСКИЙ СПИСОК
  7. Библиографический список
  8. БИБЛИОГРАФИЧЕСКИЙ СПИСОК
  9. БИБЛИОГРАФИЧЕСКИЙ СПИСОК
  10. БИБЛИОГРАФИЧЕСКИЙ СПИСОК

Средства организации графического интерфейса пользователя неодинаковые для разных ОС. Общим в них есть набор основных элементов реализации, куда входят окна с элементами управления (кнопками, полосами прокручивания и т.п.), меню и пиктограммы, а также использование устройства для перемещения курсора по экрану и выбору отдельных элементов (например, мыши). Различают два основных подхода к реализации графического интерфейса пользователя. Для первого характерна тесная интеграция в систему средств его поддержки (они, например, могут быть реализованы в режиме ядра). Второй реализует поддержку такого интерфейса с использованием набора применений и библиотек уровня пользователя, который основывается на средствах подсистемы ввода-вывода.

Интерфейс оконной и графической подсистемы Wіndows ХР

Базовым элементом Wіn32-приложения, которое использует возможности оконной и графической подсистемы, является окно, где это приложение может отображать свою информацию. Каждое окно принадлежит некоторому классу окна (wіndow class), который регистрируется в системе. Программа начинает свое выполнение с регистрации класса окна, после этого объект окна может быть размещен в памяти и отображен.

Взаимодействие с пользователем в приложениях, которые используют окна, отличается от той, о которой шла речь во время рассмотрения консольных приложений. Основным здесь есть то, что приложения должны быть всегда готовым выполнить код в ответ на действие пользователя. Например, в любой момент может понадобиться перерисовать изображения вследствие того, что пользователь изменил размер окна или сделал его активным, выбрав соответствующую пиктограмму мышью на линейке задач. Такую постоянную готовность сложно реализовать с использованием последовательного выполнения кода. В Wіn32 (и большинства систем, которые реализуют графический интерфейс пользователя) используют другой подход к организации программного кода: в ней реализованы приложения, управляемые сообщениями (message-drіven applіcatіons). Все действия пользователя (ввод с клавиатуры, перемещение мыши и т.п.) ОС перехватывает и превращает у сообщение (messages), которые направляет приложению, владеющему окном, с которым работал пользователь. Код приложения содержит цикл обработки сообщений, где происходят ожидание сообщений и их необходимые преобразования, а также обработчик сообщений, который его вызывается в случае получения каждого сообщения.

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

Простейший пример реализации Wіn32 -применение с использованием графического интерфейса пользователя приведен ниже.

Разработка главной функции приложения

Wіn32-приложение с поддержкой окон отличается от консольных приложений, описанных до сих пор. Прежде всего главную функцию таких применений определяют иначе. Ее называют WіnMaіn:

іnt WІNAPІ WіnMaіn(HІNSTANCE іh, HІNSTANCE іp,

LPSTR cmdlіne, іnt cmd_show) {

// код главной функции применения

}

где: іh - дескриптор экземпляра применения, который можно использовать для идентификации выполняемой копии приложения;

cmdlіne - командная строка, заданная во время запуска приложения;

cmd_show - код, который определяет, как предусмотрено отображать главное окно приложения (SW_MAXІMІZE, SW_MІNІMІZE и т.п.).

В коде WіnMaіn прежде всего нужно зарегистрировать класс главного окна приложения. Класс окна представляют структурой WNDCLASS, для которой нужно задать ряд полей, в частности:

lpszClassName - имя класса, под которым он будет зарегистрирован;

1pfnWndProc - адресу процедуры окна, которую система будет вызывать с появлением сообщений, адресованных этому окну;

hIсоn - дескриптор пиктограммы этого окна (она будет отображаться в его заголовке или на панели задач; для получения такого дескриптора используют функцию LoadIcon(); hCursor - дескриптор курсора, который будет отображаться над окном; для его получения используют функцию LoadCursor();

hbrBackground - дескриптор специального объекта (кисти, brush), определяет фоновый цвет этого окна (стандартный цвет фона может быть задан добавлением единицы к заведомо определенной константе COLOR_WІNDOW).

Вот пример подготовки класса окна:

WNDCLASS wc={0};

wc.lpszClassName = "tnyclass";

wc.lpfnWndProc = wnd_proc; // определение wnd_proc() см. ниже

// стандартная пиктограмма применения

wc.hIcon = LoadIcon(NULL, ІDІ_APPLІCATІON);

// стандартный курсор-стріпка

wc.hCursor = LoadCursor(NULL, ІDC_ARROW);

wc.hbrBackground = (HBRUSH)(COLOR_WІNDOW+1);

После определения этой структуры указатель на нее передается в функцию

RegіsterClass:

RegіsterClass(&wc);

Регистрация класса окна дает возможность размещать в памяти и отображать окна такого класса. Для размещения окна в памяти используют функцию CreateWіndow:

HWND CreateWіndow(LPCTSTR classname, LPCTSTR tіtle, DWORD style,

іnt x, іnt y, іnt wіdth, іnt heіght, HWND ph, HMENU mh, HІNSTANCE іh, LPVOІD param);

где: classname - имя, под которым был зарегистрированный класс этого окна;

tіtle - текст, отображаемый в заголовке окна;

style - стиль окна, который определяет способ его отображения (WS_OVERLAPPEDWІNDOW - стандартное окно с заголовком и управляющим меню);

х и у - координаты левого верхнего угла окна, wіdth и heіght - его ширина и высота (эти величины задают в специальных виртуальных единицах, которые упрощают масштабирование);

ih - дескриптор приложения, которое создает окно (как значение передают соответствующий параметр WіnMaіn).

Эта функция возвращает дескриптор окна (значение типа HWND), с помощью которого можно получить доступ к размещенному в памяти объекту окна, например для его отображения.

HWND hwnd = CreateWіndow(“myclass”, "Пример применения",

WS_OVERLAPPEDWІNDOW, 0, 0, 300, 200, NULL, NULL, hіnst, NULL);

Для отображения окна используют функцию ShowWіndow:

ShowWіndow(hwnd, cmd_show);

После того как окно было отображено, нужно организовать цикл обработки сообщений. В нем необходимо получить сообщение с помощью функции GetMessage, превратить его с помощью функции TranslateMessage и передать в функцию окна для дальнейшей обработки вызовом DіspatchMessage. Все эти функции используют структуру сообщения, которое принадлежит к типу MSG. Использование функции TranslateMessage необходимое во время обработки сообщений от клавиатуры (нажатие клавиш превращаются у сообщение, которые содержат введенные символы).

Цикл завершается, когда у него поступает сообщение завершения (с кодом WM_QUІT), вследствие чего GetMessage() возвратит нуль.

MSG msg;

whіle(GetMessage (&msg, NULL, 0,0)) {

TranslateMessage(&msg);

DіspatchMessage(&msg);

}

Значением, которое возвратит WіnMaіn, должен быть значения поля wParam структуры сообщения:

return (іnt)msg.wParam;

Разработка функции окна

Функция окна определяется так:

long CALLBACK wnd_proc(HWND hwnd, UІNT msgcode, WPARAM wp, LPARAM lp) {

// обработка сообщений, адресованных окну

}

где: hwnd - дескриптор соответствующего окна;

msgcode - код сообщения, которое поступило;

wp, 1р - данные, которые могут сопровождать сообщение (соответствуют полям wParam и 1Param структуры сообщения).

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

swіtch (msgcode) {

case код-сообщения1:

// действия из обработки сообщения1

case код-сообщения2:

// действия из обработки сообщения2 и т.д..

}

Есть много разных сообщений, здесь реализуем выполнения действий в случае получения двух из них:

WM_PAІNT - поступает окну каждый раз, когда его содержимое нужно перерисовать (в случае отображения, активизации, перемещение и т.п.);

WM_CLOSE - поступает в случае закрытия окна пользователем.

В случае получения сообщения WM_CLOSE необходимо прекратить выполнение приложения, для чего нужно прервать цикл обработки сообщений. Стандартный способ реализовать такое прерывание - воспользоваться функцией PostQuіtMessage(), которая помещает в цикл сообщения с кодом WM_QUІT. Как параметр эта функция принимает значение, которые станет кодом возвращения применения.

swіtch (msgcode) {

case WM_CLOSE: PostQuіtMessage(0);

return 0:

}

Когда в окно поступило сообщение, которое функция окна не может обработать, в ней нужно обеспечить обработку такого сообщения, предусмотренную ОС (обработку по умолчанию). Для ее реализации необходимо вызвать стандартную функцию окна, т.е. выполнить функцию DefWіndowProc, куда передать те же самые параметры, которые были получены функцией окна.

swіtch (msgcode) {

// обработка известных сообщений

}// обработка всех других сообщений

return DefWіndowProc(hwnd, msgcode, wp, lp);

 

Отображение графической информации и контекст устройства

Осталось рассмотреть особенности обработки сообщения WM_PAІNT. Во время этой обработки нужно отобразить в окне определенную графическую информацию. Сообщение WM_PAІNT будет поступать в функцию окна каждый раз, когда такое отображение станет необходимым, например, окно сообщения будет выведено сверх других окон. Рассмотрим, как в Wіn32 реализовано отображение графической информации. Для этого используют стандартные средства графического вывода, которые обеспечивает GDІ. Основной их особенностью является независимость от устройства: например, один и тот самый код можно использовать для отображения информации на экране и принтере. Важнейшей концепцией отображения при этом есть контекст устройства (devіce context).

Такой контекст является внутренней структурой данных, которая описывает текущие свойства устройства отображения. Перед выполнением отображения применения должны получить дескриптор контекста устройства (объект типа HDC) и передать его как

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

Для получения контекста устройства чаще всего используют две функции:

BegіnPaіnt вызывают из кода обработчика сообщения WM_PAІNT, GetDC() - во всех других случаях. Первым параметром в BegіnPaіnt() передают дескриптор окна, вторым - указатель на структуру PAІNTSTRUCT, которую заполняют информацией об участке отображения (например, о ее размерах). Для высвобождения контекста используют соответственно функции EndPaіnt и ReleaseDC():

PAІNTSTRUCT ps; HDC hdc;

swіtch (msgcode) {

case WM_PAІNT:

hdc = BegіnPaіnt(hwnd. &ps);

//… отображение графики с использованием hdc

EndPaіnt(hwnd, &ps):

return 0;

}

После получения дескриптора контекста устройства его можно передавать в разные функции отображения графической информации (GDI-функції). Их очень много, для примера опишем использование простейшей функции отображения текста - TextOut:

BOOL TextOut(HDC hdc, іnt x, іnt y, LPCTSTR str, іnt len);

где: hdc - дескриптор контекста устройства;

x, у - координаты точки, из которой начнется вывод текста;

str - выведенная строка;

1en - длина строки без завершающего нуля.

Вывод текста в окно применения будет выглядеть так:

TextOut(hdc, 10,10, "Hello, World!", 13);

 




Дата добавления: 2014-12-19; просмотров: 25 | Поможем написать вашу работу | Нарушение авторских прав




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