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

3. Программирование интерфейса пользователя и эвм

3.1. Цель работы

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

3. 2. Указания по подготовке к выполнению лабораторной работы

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

3. 3. Обзор темы работы

Большинство программ, работающих под Windows активно используют средства интерактивного взаимодействия с пользователем – мышь, клавиатуру, а также программные средства – окна диалога.

При работе с клавиатурой следует уделить особое внимание изучению следующих вопросов: фокус ввода, аппаратные и символьные сообщения, виртуальные коды клавиш, работа с кареткой.

Мышь – это графическое устройство ввода информации с одной или более кнопками. Windows поддерживает однокнопочную, двухкнопочную или трехкнопочную мышь.

Работа приложений с клавиатурой и мышью основана на системе сообщений. Любое действие (нажатие клавиш, перемещение мыши и т.п.) приводит к тому, что Windows посылает сообщение активному приложению. Данное сообщение обрабатывается оконной процедурой приложения. Существует более 20 видов сообщений, получаемых программой от мыши и клавиатуры.

Следует отметить, что окна приложений обычно имеют в себе дочерние окна, к которым относятся кнопки (buttons), флажки (check boxes), переключатели (radio buttons), текст (text strings), полосы прокрутки (scroll bars), окна редактирования (edit boxes), списки (list boxes). Дочернее окно обрабатывает сообщения мыши и клавиатуры и извещает родительское окно о том, что состояние дочернего окна изменилось. В этом случае дочернее окно становиться для родительского устройством ввода. Оно инкапсулирует особые действия, связанные с графическим представлением окна на экране, реакцией на пользовательский ввод, и извещения другого окна при вводе важной информации. Имеется возможность создавать свои собственные дочерние окна управления.

Модель аппаратного ввода и локальное состояние ввода

Создавая модель ввода, Microsoft стремилась, главным образом, к тому, чтобы ни один поток не мог нарушить работу других потоков. Отказоустойчивые операционные системы вроде Windows 2000 и Windows 98 не дают зависшему потоку блокировать другим потокам прием аппаратного ввода

Поток необработанного ввода

При запуске система создает себе особый поток необработанного ввода (raw input thread, RIT) и системную очередь аппаратного ввода (system hardware input queue, SHIQ). RIT и SHIQ — это фундамент, на котором построена вся модель аппаратного ввода.

Обычно RIT бездействует, ожидая появления какого-нибудь элемента в SHIQ Когда пользователь нажимает и отпускает клавишу на клавиатуре или кнопку мыши, либо перемещает мышь, соответствующий драйвер устройства добавляет аппаратное событие в SHIQ. RIT извлекает этот элемент из SHIQ, преобразует его в сообщение (WM_KEY*, WM_?BUTTON* или WM_MOUSEMOVE) и ставит в конец очереди виртуального ввода (virtualized input queue, VIQ) нужного потока. Далее RIT возвращается в начало цикла и ждет появления следующего элемента в SHIQ.

Как же RIT узнает, в чью очередь надо пересылать сообщения аппаратного ввода?

RIT просто выясняет, в каком окне находится ее курсор, и, вызвав GetWindowThreadProcessId, определяет поток, создавший это окно. Поток с данным идентификатором и получит сообщение от мыши.

В случае сообщений от клавиатуры все происходит несколько иначе. В любой момент с RIT "связан" лишь какой-то один поток, называемый активным (foreground thrcad). Именно ему принадлежит окно, с которым работает пользователь в данное время.

RIT отвечает за обработку особых комбинаций клавиш- Alt+Tab, AIr+Esc и Ctrl+Alt+Del. Поскольку эти комбинации клавиш RIT обрабатывает самостоятельно, пользователи могут в любой момент активизировать соответствующие окна с клавиатуры; ни одно приложение не в состоянии перехватить упомянутые комбинации клавиш. Как только пользователь нажимает одну из таких комбинаций клавиш, RIT активизирует выбранное окно, и в результате его поток подключается к RIT. В Windows есть функции, позволяющие программно активизировать окно.

Для клавиатуры поддерживаются следующие.сведения

  • какое окно находится в фокусе клавиатуры;

  • какое окно активно в данный момент;

  • какие клавиши нажаты;

  • состояние курсора ввода ;

Для мыши учитывается такая информация

  • каким окном захвачена мышь;

  • какова форма курсора мыши;

  • видим ли этот курсор;

Фрагмент примера для организации работы с мышью

….

HWND hWnd;

POINT t={0,0};

….

//сообщение приходит, когда окно получает фокус ввода

case WM_SETFOCUS:

//Вызывая SetCapture, поток заставляет RIT помещать все сообщения от мыши //в свою очередь виртуального ввода.

SetCapture(hWnd);

//получить координаты мышки

t.x=LOWORD(lParam);

t.y=HIWORD(lParam);

//создать каретку

CreateCaret(hWnd, LoadBitmap(

hInst,MAKEINTRESOURCE(4)),2,10);

//Преобразовать координаты экрана в координаты созданого окна

ClientToScreen(hWnd,&t); //адрес t (t.x,t.y - координаты курсора)

// установить курсор мыши в заданную позицию

SetCursorPos(t.x,t.y);

//показать каретку

ShowCaret(hWnd);break;

// Сообщение приходит, когда нажата левая кнопка мыши

case WM_LBUTTONDOWN:

….

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