- •0915 “Компьютерная инженерия”специальностей:
- •7.091501 "Компьютерные системы и сети"
- •7.091502 "Системное программирование
- •Оглавление
- •Общие положения
- •1. Получение и вывод информации о вычислительной системе
- •1.1. Цель работы
- •1.2. Указания по подготовке к выполнению лабораторной работы
- •1. 3. Обзор темы работы
- •1. Получение и вывод информации о вычислительной системе
- •Функции и структуры для получения информации о вычислительной системе
- •1.4. Задание на лабораторную работу
- •Контрольные вопросы и задания
- •2. Графический интерфейс пользователя (graphical user interface, gui)
- •2.1. Цель работы
- •2. 2. Указания по подготовке к выполнению лабораторной работы
- •2.3. Обзор темы работы
- •2 .4. Задание на лабораторную работу
- •2.5. Контрольные вопросы и задания
- •3. Программирование интерфейса пользователя и эвм
- •3.1. Цель работы
- •3. 2. Указания по подготовке к выполнению лабораторной работы
- •3. 3. Обзор темы работы
- •Поток необработанного ввода
- •Фрагмент примера для организации работы с клавиатурой
- •3.4. Задание на лабораторную работу
- •3.5. Контрольные вопросы и задания
- •4. Многозадачность и многопоточность
- •4. 1. Цель работы
- •4.2. Указания по подготовке к выполнению лабораторной работы
- •4.3. Обзор темы работы
- •4.4. Задание на лабораторную работу
- •5.5. Контрольные вопросы и задания
- •Список литературы
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:
….
