БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра «Программное обеспечение вычислительной техники и
автоматизированных систем»
Лабораторная работа №1
По дисциплине «Системное программное обеспечение»
«Программирование ввода с клавиатуры, мыши, таймера»
Выполнил
ст. гр.
107241
Лю Пэн
Принял:
доцент Разоренов
Н.А.
Минск 2004
- 2 -
Цель работы:Изучить основы разработки и архитектуру Windows-приложений
на базе WIN 32 API.
Программирование аппаратных устройств : клавиатура,
мышь, таймер.
Изучаемые вопросы:
На базе архитектуры WIN 32 Aplication рассмотреть вопросы:
1. Структура оконного класса, поля, их назначение,
инициализация.
2. Классы окон, регистрация оконного класса.
3. Создать экземпляр оконного класса.
4. Отображение окна на экране.
5. Управление положением и размерами окна.
6. Обновление оконной области на экране.
7. Установки фона.
8. Курсор приложения. Типы курсоров
, их прикрепление к
приложению.
9. Цикл обработки сообщений(GetMessage).
10. Оконная функция, назначение, параметры, обработка сообщений.
1. Клавиатура
11. 1. Механизм сообщений от клавиатуры .
12. 2. Коды OEM, ANSI, ASCII, виртуальные коды.
13. 3. Виртуальные клавиши.
14. 4. Символьные сообщения.
15. 5. Системные сообщения.
16. 6. Преобразование кодов.
17. 7. Как отличить нажатия совпадающих клавиш.
18. 8. Как узнать
ввод строчных и прописных букв.
19. 9. Фокус ввода.
2. Мышь
20. 1. Захват и освобождение окном мыши.
21. 2. Обработка сообщений от мыши.
22. 3. Координаты x,y.
23. 4. Курсор мыши. Управление курсором.
24. 5. Макроопределения сообщений мыши.
25. 6. Сообщения мыши в клиентской и не клиентской области окна.
3. Таймер
26. 1. Установка
таймера.
27. 2. Функция таймера.
28. Снятие таймера
- 3 -
Результаты:
1. Клавиатура
1. Механизм сообщений от клавиатуры
Когда пользователь нажимает или отпускает клавишу, Windows посылает
в программу сообщение ввода с клавиатуры. Ниже. приводится перечень
сообщений ввода с клавиатуры и события, их вызывающие:
Сообщение Событие
WM_KEYDOWN Пользователь нажал клавишу;
WM_KEYUP Пользователь отпустил клавишу;
WM_SYSKEYDOWN
Пользователь нажал системную
клавишу;
WM_SYSKEYUP
Пользователь отпустил системную
клавишу.
2. Коды OEM, ANSI, ASCII, виртуальные коды
OEM код храниться в lParam c 16 по 23 бит
Code(HIWORD(0xff0000&lParam),str);//OEM COD
NumOEM=atoi(str);
itoa(NumOEM,Char10,10);
TextOut(hdc,420,row,Char10,lstrlen(Char10));
Виртуальный код клавиши — это независимое от устройства значение
клавиши. Windows использует виртуальные коды клавиш для того, чтобы не
зависить от используемой персональной ЭВМ. Виртуальный код передаются в
параметре wParam.
Code(wParam,vk);
NumVK=atoi(vk);
itoa(NumVK,Char10,10);
TextOut(hdc,380,row,Char10,lstrlen(Char10));
3. Виртуальные клавиши
Когда пользователь нажимает или отпускает клавишу, Windows посылает
в программу сообщение ввода с клавиатуры
общение Событие
WM_KEYDOWN Пользователь нажал клавишу;
WM_KEYUP Пользователь отпустил клавишу;
WM_SYSKEYDOWN
Пользователь нажал системную
клавишу;
WM_SYSKEYUP
Пользователь отпустил системную
клавишу.
Параметр wParam определяет виртуальный код данной клавиши.
Виртуальный код клавиши — это независимое от устройства значение
клавиши. Windows использует виртуальные коды клавиш для того, чтобы не
завесить от используемой персональной ЭВМ.
4. Символьные сообщения
- 4 -
Прикладная программа, которая читает символы, вводимые с
клавиатуры, должна использовать функцию TranslateMessage в своем цикле
обработки сообщений. Эта функция преобразует сообщение ввода с
клавиатуры в соответствующее сообщение ввода символа в коде ANSI —
WM_CHAR или WM_SYSCHAR. Эти сообщения содержат ANSI — коды символа для
данной клавиши в параметре wParam. Параметр lParam аналогичен таковому
в сообщении ввода с клавиатуры.
Code(wParam,vk);//
NumOEM=atoi(vk);
itoa(NumOEM,Char10,10);
TextOut(hdc,470,row,Char10,lstrlen(Char10));//output ASCII COD
if((NumOEM<97)||(NumOEM>122))//big key
{ GetKeyNameText(lParam,szName,30);
TextOut(hdc,270,row,szName,lstrlen(szName));//char
}
else
{ if((NumOEM>=97)&&(NumOEM<=122))
{SmallB[1]='\0';
SmallB[0]=char(wParam);
TextOut(hdc,270,row,SmallB,lstrlen(SmallB));
}
}
5. Системные сообщения
Для системных клавиш Windows генерирует соответствующие сообщения
WM_SYSKEYUP и WM_SYSKEYDOWN. Это специальные клавиши такие, например,
как Alt и F10, которые принадлежат интерфейсу пользователя и не могут
использоваться прикладной программой другим способом.
6. Преобразование кодов
Преобразование ANSI <—> OEM
Чтобы корректно отображались тексты в кодировке DOS, вам вероятно
потребуется преобразовывать строки из
кодировки Windows (ANSI) в
кодировку DOS (OEM) и обратно.
Функция CharToOem преобразовывает строку из кодировки ANSI в
кодировку OEM, а функция OemToChar выполняет обратное преобразование:
7. Как отличить нажатия совпадающих клавиш
На клавиатуре дублируются некоторые клавиши. Например, левый и
правый Shift,CTRL и т.д. Чтобы их отличить проверяют состояние 24 бита
в lParam
///////////////////get extend flag////////
MyWord=HIWORD(lParam);
MyByte=HIBYTE(MyWord);
Code((MyByte & 0x01),Pacsh);
NumPacsh=atoi(Pacsh);
if(NumPacsh==1)
TextOut(hdc,580,row,"Yes",3);
else TextOut(hdc,580,row,"Not",3);
- 5 -
8. Как узнать ввод строчных и прописных букв
Можно определить двумя способами проверить был ли до этого нажата
клавиша SHIFT или при помощи события WM_CHAR.
9. Фокус ввода
Клавиатура должна разделяться между всеми приложениями, работающими
под Windows. Некоторые приложения могут иметь больше одного окна, и
клавиатура должна разделяться между этими окнами в рамках одного
и того
же приложения. Когда на клавиатуре нажата клавиша, только одна оконная
процедура может получить сообщение об этом. Окно, которое получает это
сообщение клавиатуры, является окном, имеющем "фокус ввода" (input
focus).
Концепция фокуса ввода тесно связана с концепцией "активного окна".
Окно, имеющее фокус ввода — это либо активное окно, либо дочернее окно
активного
окна. Определить активное окно обычно достаточно просто. Если
у активного окна имеется панель заголовка, то Windows выделяет ее. Если
у активного окна вместо панели заголовка имеется рамка диалога (это
наиболее часто встречается в окнах диалога), то Windows выделяет ее.
Если активное окно минимизировано, то Windows выделяет текст заголовка в
панели задач.
Если активное
окно минимизировано, то окна с фокусом ввода нет.
Windows продолжает слать программе сообщения клавиатуры, но эти
сообщения выглядят иначе, чем сообщения, направленные активным и еще не
минимизированным окнам.
Обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS, оконная процедура
может определить, когда окно имеет фокус ввода. WM_SETFOCUS показывает,
что окно получило фокус ввода, а WM_KILLFOCUS, что окно потеряло его.
case WM_KILLFOCUS:
CanMove=0;
putxy=1;
break;
case WM_SETFOCUS:
CanMove=1;
break;
2. Мышь
1. Захват и освобождение окном мыши
Параметр wParam каждой кнопки включает маску бит, определяющую
текущее состояние клавиатуры и кнопок мыши такое,например, как нажаты
ли кнопки мыши, клавиша Shift и клавиша Ctrl. Параметр lParam содержит
координаты x и y курсора мыши.
Windows посылает окну сообщение мыши только в том случае, если
курсор мыши находится в окне, или
ввод от мыши захвачен с помощью
функции SetCapture. Эта функция предписывает Windows послать все
сообщения ввода мыши (вне зависимости от того, где находится курсор
мыши) в указанное окно. Прикладная программа обычно использует эту
функцию для того, чтобы взять на себя управление при выполнении
некоторых критических операций, таких как выборка с помощью мыши
некоторого
объекта в области пользователя. Захват ввода от мыши
предотвращает получение управления другой прикладной программой до
завершения операции.