- •Минобрнауки россии
- •Е.В. Грачева Системное программное обеспечение персональных эвм
- •1 Программирование в операционной среде
- •1.1 Программирование в среде однозадачной операционной системы
- •1.2 Программирование в среде ос Windows
- •1.2.1 Основные понятия
- •1.2.2 Программный интерфейс
- •1.2.2.1 Сообщения, очередь сообщений
- •1.2.2.2 Процедура окна
- •1.2.3 Использование динамических библиотек
- •1.2.3.1.Описание api-функции LoadLibrary
- •1.2.3.2 Описание функции GetProcAddress
- •1.2.3.3 Описание функции FreeLibrary
- •1.2.4 Описание некоторых api-функций
- •1.2.4.1.Функции для создания пользовательского интерфейса
- •1.2.4.1.1 Ввод данных с клавиатуры
- •1.2.4.1.2 Ввод данных с помощью "мыши"
- •1.2.4.1.3 Диалоговые окна
- •1.2.4.2 Функции для получения информации о системе
- •1.2.4.2.1 Информация об аппаратной конфигурации
- •1.2.4.2.3 Конфигурация ос
- •1.2.4.2.4 Системные параметры
- •1.2.4.2.5 Внешний вид системных элементов
- •1.2.4.3 Функции управления памятью
- •1.2.4.3.1 Основные функции управления памятью
- •1.2.4.4.Функции управления файлами
- •1.2.4.4 Функции управления некоторыми устройствами
- •Контрольные вопросы
- •35. Охарактеризовать функцию для определения конфигурации ос
- •36. Охарактеризовать функции об установке системных параметров.
- •2.Ассемблеры
- •2.1 Архитектура процессоров ia-32
- •2.1.1.Основная исполнительная среда микропроцессора с архитектурой ia32
- •2.1.2 Режимы работы и используемая модель памяти процессоров с архитектурой ia32
- •2.1.3 Архитектура ia-32 системного уровня
- •2.2.Программирование на языке ассемблера
- •2.2.1 Метки
- •2.2.2 Директивы
- •2.2.3 Формат команды
- •2.2.4 Система команд микропроцессоров с архитектурой ia32
- •2.2.4.1 Команды пересылки данных
- •Ins строка, dx
- •2.2.4.2 Арифметические операции
- •2.2.4.3 Операции сдвига
- •2.2.4.4 Битовые операции
- •2.2.4.5 Команды для организации циклов
- •1.3.1.1 Команды сравнения
- •2.2.4.6 Команды передачи управления
- •2.2.4.7 Системные команды
- •2.2.4.8 Команды математического сопроцессора
- •2.2.5 Технология программирования
- •2.3 Макроязыки
- •3.Трансляторы
- •3.1 Структура компиляторов и интерпретаторов, лексический, синтаксический и семантический анализаторы, генератор кода
- •3.1.1.Распределение памяти, виды переменных
- •3.1.2.Статическое и динамическое связывание
- •3.2 Загрузчики
- •3.2.1 Функции загрузчика
- •3.2.1 Настраивающий и динамический загрузчики
- •3.3 Подключение библиотек
- •4. Формальные языки и грамматики
- •4.1 Типы грамматик
- •4.1.1 Вывод цепочек
- •4.1.2 Конечный и магазинный автоматы, распознаватели и преобразователи, построение автомата по заданной грамматике
- •Приложения Приложение а
- •Оглавление
- •4. Формальные языки и грамматики
1.2.4.1.2 Ввод данных с помощью "мыши"
Хотя "мышь" и является важным, она все же является необязательным устройством ввода для приложений. Хорошо написанное приложение должно использовать интерфейс "мыши", но оно не должно зависеть исключительно от "мыши" для получения пользовательского ввода. Приложение также должно обеспечивать полноценную поддержку использования клавиатуры для ввода.
Приложение получает данные от "мыши" в форме сообщений, посылаемых окну.
Когда пользователь двигает "мышью", ОС перемещает растровую картинку на экране, называемую курсором "мыши". Курсор "мыши" содержит точку размером в 1 пиксель, называемую hot-spot (дословно, "горячая точка") - именно по координатам этой точки ОС определяет координату курсора. Когда происходит событие с манипулятором типа "мышь" (мышь двигается, нажимается клавиша мыши и т.п.) окну, которое содержит курсор мыши (точнее, горячую точку курсора мыши) посылается сообщение. Для получения сообщения от "мыши" окну не обязательно быть активным или иметь фокус ввода. Система обычно посылает сообщение от "мыши" тому окну, которое содержало горячую точку курсора во время свершения события. Приложение может изменить такой порядок вещей с помощью функции SetCapture. То есть функция SetCapture осуществляет захват ввода с помощью "мыши". В качестве входного параметра функция SetCapture получает дескриптор окна, созданного текущим потоком, которому будут пересылаться все сообщения от "мыши". В качестве выходного параметра функции SetCapture выступает дескриптор того окна, который захватывал ввод "мыши" непосредственно до настоящего момента.
Окно получает все сообщения мыши до тех пор, пока приложение не вызовет функцию ReleaseCapture (вызывается без входных параметров, в качестве выходного параметра выдает ненулевое значение в случае, если функция выполнилась успешно и 0 - в противном случае) или не определит для захвата другое окно. Необходимо отметить, что захват ввода "мыши" может осуществить лишь окно (или часть окна), находящееся на переднем плане.
Захват ввода "мыши" может быть полезен, если окно должно получить все сообщения от мыши, даже когда курсор перемещается за пределы окна. Например, приложения обычно отслеживают позицию курсора после того, как нажимается клавиша мыши и следят за курсором до тех пор, пока пользователь не отпустит клавишу "мыши". Если приложение не захватывает ввод "мыши" и пользователь отпускает клавишу "мыши" за пределами окна, окно не получит сообщения об отпускании клавиши "мыши".
Поток может использовать функцию GetCapture для определения того, какое из его окон захватило "мышь". Функция GetCapture вызывается без входных параметров, а в качестве выходного параметра выдает дескриптор окна, захватившего ввод "мыши" (если в результате выполнения функции формируется нулевое значение - значит, окна текущего потока не осуществляли захват ввода "мыши").
Хотя "мышь" является важным устройством ввода, а для некоторых пользователей - основным устройством ввода, не все пользователи обязательно имеют "мышь". Приложение может определить наличие "мыши" в системе с помощью значения параметра SM_MOUSEPRESENT функции GetSystemMetrics. Функция GetSystemMetrics позволяет определить установки конфигурации системы. Сообщения и поименованные константы [4,5] имеют в своем составе буквы L, M и К для связи с соответствующими клавишами "мыши". Символ L свидетельствует о связи с левой клавишей мыши, R - правой, M - средней клавишей "мыши". Хотя Windows поддерживает и "мыши" с большим числом клавиш, большинство приложений используют в основном левую клавишу "мыши", а остальные - в меньшей степени (если вообще используют).
Колесо прокрутки мыши может выполнять как роль средней клавиши, так и роль собственно колеса прокрутки. в последнем случае приложению посылается сообщение колеса прокрутки.
Приложение может определить количество кнопок на "мышке" с помощью значения параметра SM_CMOUSEBUTTONS функции GetSystemMetrics. Переназначать клавиши "мыши" можно с помощью функций SwapMouseButton в качестве входного параметра задается логическое значение: TRUE - левая и правая клавиши мыши меняются местами, FALSE - восстанавливается нормальное функционирование "мыши") или SystemParametersInfo (с помощь значения параметра SPI_SETMOUSEBUTTONSWAP - тип параметра логический, значения - аналогично что и у SwapMouseButton). Необходимо отметить, что поскольку "мышь" является разделяемым ресурсом - все изменения назначения клавиш "мыши" будут влиять на все приложения.
Мышь генерирует события всякий раз, когда пользователь двигает ею или нажимает и отпускает клавиши. ОС преобразует, эти события в сообщения и посылает их в очередь сообщений соответствующего потока. Если поток не успевает обрабатывать поступающие сообщения от "мыши", ОС сама уничтожает их оставляя лишь самое последнее сообщение "мыши".
Сообщения "мыши" делятся на 2 группы: сообщения от клиентской области и сообщения от неклиентской области. Обычно, приложение обрабатывает сообщения клиентской области и игнорирует сообщения неклиентской области.
Окно получает сообщения клиентской области когда события "мыши" происходят внутри клиентской области окна (или рабочая область окна - все пространство окна, за исключением границ окна, полос прокрутки, меню, панелей инструментов и т.п.). ОС посылает сообщение WM_MOUSEMOVE окну всякий раз, когда пользователь двигает мышь внутри клиентской области. ОС посылает одно из сообщение (таблица 10) всякий раз, когда пользователь нажимает или отпускает клавиши "мыши" внутри клиентской области.
Таблица 10 - Сообщения "мыши"
Сообщение |
Значение |
Код сообщения (16 с/с) |
WM_LBUTTONDBLCLK |
Левая клавиша дважды нажата |
0х0203 |
WM_LBUTTONDOWN |
Нажата левая клавиша |
0х0201 |
WM_LBUTTONUP |
Левая клавиша отпущена |
0х0202 |
WM_MBUTTONDBLCLK |
Средняя клавиша дважды нажата |
0х0209 |
WM_MBUTTONDOWN |
Средняя клавиша нажата |
0х0207 |
WM_MBUTTONUP |
Средняя клавиша отпущена |
0х0208 |
WM_RBUTTONDBLCLK |
Правая клавиша дважды нажата |
0х0206 |
WM_RBUTTONDOWN |
Правая клавиша нажата |
0х0204 |
WM_RBUTTONUP |
Правая клавиша отпущена |
0х0205 |
Каждое из перечисленных сообщений имеет 2 параметра. Параметр lParam сообщения клиентской области определяет координаты курсора "мыши": младшее слово определяет кординату по X (горизонтальную координату), старше слово - координату по Y (вертикальную координату). Эти координат отсчитываются относительно клиентской области - левый верхний угол имеет координату (0,0). Параметр wParam содержит признаки, которые определяют статус других клавиш мыши и клавиш CTRL и SHIFT во время свершения события "мыши". В таблице приведены значения параметра wParam.
Таблица 11 - Значения параметра wParam сообщения "мыши"
Имя параметра |
Значение |
Код параметра |
MK_CONTROL |
Клавиша CTRL нажата |
0х0008 |
MK_LBUTTON |
Левая клавиша "мыши" нажата |
0х0001 |
MK_MBUTTON |
Средняя клавиша "мыши" нажата |
0х0010 |
MK_RBUTTON |
Правая клавиша "мыши" нажата |
0х0002 |
MK_SHIFT |
Клавиша SHIFT нажата |
0х0004 |
Неклиентская часть окна состоит из границы окна, строки меню, строки заголовка, полос прокрутки, меню окна, кнопок свертывания и развертывания окна.
ОС формирует сообщения неклиентской области, в основном для своих собственных нужд. Например, ОС использует сообщение неклиенсткой области, когда курсор указывает на границу окна для изменения его внешнего вида (обычно курсор в этот момент представляется двунаправленной стрелкой). Для того чтобы использовать сообщения "мыши" неклиентской области окна, оконная процедура должна обработать эти сообщения в процедуре DefWindowProc.
Для каждого сообщения "мыши" клиентской области есть и соответствующее сообщения для неклиентской области. Имена этих сообщений такие же, за исключением того, что для сообщений неклиентской области в имена вводятся символы NC (например, WM_NCLBUTTONDBLCLK - двойное нажатие левой клавиши мыши). Параметр lParam сообщений неклиентской области содержит координаты курсора относительно левого-верхнего угла экрана (а не клиентской части окна, как у сообщений клиентской области). Параметр wParam содержит значение, которое показывает, в какой части неклиентской области произошло событие.
Таблица 12 - Некоторые значение параметра wParam сообщения "мыши" неклиентской области
Имя параметра |
Расположение курсора |
Код параметра |
HTSYSMENU |
На системном меню |
3 |
HTBOTTOM |
На нижней горизонтальной границе окна |
15 |
HTBOTTOMLEFT |
В нижнем левом углу окна |
16 |
HTBOTTOMRIGHT |
В нижнем правом углу окна |
17 |
HTCAPTION |
В строке заголовка |
2 |
HTCLIENT |
В клиентской области |
1 |
HTCLOSE |
In a Close button.На кнопке закрытия окна |
20 |
