- •Введение
- •1. Общие принципы создания интерфейса
- •1.1. Эргономические характеристики интерфейса
- •1.2. Составные части интерфейса
- •1.3. Виды диалога
- •1.4. Процессы ввода – вывода
- •1.5. Методы разработки подпрограмм нижнего уровня
- •Int int86(int num, union regs *inregs, union regs *outregs);
- •Void pokeb(unsigned seg, unsigned off, char value);
- •Int getch();
- •2. Исчезающее меню
- •2.1. Алгоритм создания исчезающего меню
- •2.2. Сохранение и восстановление экрана
- •2.3. Вывод меню и рамки
- •2.4. Определение выбора пользователя
- •2.5. Подпрограмма исчезающего меню
- •3. Иерархическое меню
- •3.1. Фреймы меню
- •3.2. Подпрограмма активизации меню
- •3.3. Организация иерархического меню
- •3.4. Всплывающие окна
- •Void window(int num);
- •Void deactivate(int num);
- •4. Графический интерфейс
- •4.1. Организация меню в графическом режиме
- •Void outtextxy ( int X, int y, char *s);
- •4.2. Организация графического диалога
- •4.3. Особенности графического режима
- •Void putpixel (int color, int X, int y)
- •4.4. Форматы хранения графических файлов
- •5. Прикладной интерфейс для windows
- •5.1. Приложения Windows
- •5.2. Каркас приложения
- •5.3. Обработка сообщений в системе Windows
- •Int ReleaseDc(hwnd hwnd, hdc hdc);
- •Int MessageBox(hwnd hwnd, lpcstr lpText, lpcstr lpCaption, uint wMbType);
- •Int response;
- •5.4. Меню в системе Windows
- •5.5. Диалоги в системе Windows
- •Int DialogBox(hinstance hThisInst,
- •5.6. Пример программы, использующей список и окно ввода
- •6. Лабораторная 1
- •Варианты заданий
- •Пример выполнения задания
- •7 Лабораторная 2
- •Варианты заданий
- •Пример выполнения задания
5.3. Обработка сообщений в системе Windows
Сообщения обрабатываются оконной функцией. Типы сообщений представляются 32-разрядными словами. Для идентификации этих чисел применяются макроимена. Наиболее часто используются следующие макроимена сообщений:
WM_CHAR - нажата клавиша;
WM_PAINT - запрос на перерисовку окна;
WM_LBUTTONDOWN - нажата левая кнопка мыши;
WM_RBUTTONDOWN - нажата правая кнопка мыши;
WM_COMMAND - выбрана команда меню;
WM_TIMER - истечение заданного интервала времени.
Каждое сообщение имеет два 32-разрядных параметра типов WPARAM и LPARAM. Обработку сообщений выполняет оконная функция, имеющая четыре параметра: дескриптор окна, сообщение и два указанных выше параметра.
Для доступа к младшему и страшему словам 32-битного двойного слова применяются функции LOWORD и HIWORD. Например, операции
x = LOWORD(lParam);
y = HIWORD(lParam);
записывают в (x, y) координаты курсора мыши в случаях обработки сообщения о нажатии левой или правой кнопки мыши.
Обработка нажатия клавиши. Для сообщения WM_CHAR параметр wParam содержит ASCII – код нажатой клавиши, LOWORD(lParam) – количество повторов, генерируемых при удержании клавиши в нажатом состоянии, HIWORD(lParam) содержит следующую информацию, определенную значениями битов:
15: 1 – клавиша отпущена, 0 – нажата;
14: устанавливается, если клавиша уже была нажата перед посылкой сообщения;
13: дополнительно нажата клавиша ALT;
12-9: используется системой;
8: нажата дополнительная или функциональная часть клавиатуры;
7-0: scan – код клавиши.
Для того чтобы добавить в написанный выше каркас приложения обработку события WM_CHAR, определим массив символов для ввода и подключим библиотеки обработки строки и вывода на экран:
#include <string.h>
#include <stdio.h>
char str[80] = “”; // буфер для строки ввода
Добавив обработку события WM_CHAR, получаем следующую оконную функцию:
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
switch(message)
{
case WM_CHAR:
hdc = GetDC(hwnd); // получить контекст устройства
TextOut(hdc, 1, 1, “ “, 2); // стереть старый символ
sprintf(str, “%c”, (char)wParam); // записать в буфер новый символ
TextOut(hdc, 1, 1, str, strlen(str)); // вывести на экран
ReleaseDC(hwnd, hdc); // освободить контекст устройства
break;
case WM_DESTROY:
PostQuitMessage(0); // сообщение о завершении
break;
default: // обработка остальных сообщений
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
Контекст устройства. Функция GetDC() устанавливает связь программы с экраном. Значение, возвращаемое этой функцией, называется контекстом устройства. Ниже дадим более точное определение.
Контекст устройства – это структура данных, связывающая приложение с драйвером устройства и полностью определяющая состояние драйвера и способ вывода информации.
Программа может вывести информацию на экран, только получив контекст устройства. По окончании процесса вывода она должна этот контекст освободить, вызвав ReleaseDC().
Эти функции имеют следующие прототипы:
HDC GetDC(HWND hwnd);