Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 1.doc
Скачиваний:
18
Добавлен:
16.02.2016
Размер:
139.78 Кб
Скачать

Лабораторная работа № 1. Работа с манипулятором «мышь» и клавиатурой.

Цель работы: Ознакомление с основными принципами программирования работы с манипулятором «мышь» и клавиатурой в C++ Builder 6.

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

Работу с манипулятором «мышь» поддерживают все визуальные компоненты, которые видимы на экране во время выполнения приложения. Работу с клавиатурой поддерживают только те визуальные компоненты, которые имеют идентификатор окна Windows (свойство Hande, которое доступно только для чтения). В общем случае, чтобы определить доступные обработчики события для компонента нужно открыть вкладку Events.

Обработчики событий для манипулятора «мышь».

Событие OnMouseDown (TObject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y) возникает при нажатии и удержании кнопки мыши.

где: Sender – указатель на визуальный компонент, для которого происходит данное событие.

Button – переменная типа перечисление, определяет, какая конкретно кнопка мыши была нажата. Содержит один из следующих флагов: mbLeft – нажата левая кнопка мыши, mbRight – нажата правая кнопка мыши, mbMiddle – нажата средняя кнопка мыши.

Shift – это переменная типа множество, определяющая состояние функциональных клавиш Alt, Ctrl и Shift, а также кнопок мыши в момент нажатия кнопки мыши. Может содержать различные комбинации следующих флагов: ssShift – нажата клавиша Shift, ssAlt – нажата клавиша Alt, ssCtrl – нажата клавиша Ctrl, ssLeft – нажата левая кнопка мыши, ssRight – нажата правая кнопка мыши, ssMiddle – нажата средняя кнопка мыши, ssDouble – произведено двойное нажатие кнопки мыши. Например, код для условия, что при событии OnMouseDown была зажата на клавиатуре клавиша Ctrl будет следующим: if(Shift.Contains(ssCtrl))

X и y определяют координаты курсора мыши в клиентской области объекта Sender.

Событие OnMouseUp (TObject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y) возникает при отпускании кнопки мыши. Параметры аналогичны событию OnMouseDown.

Событие OnClick (TObject* Sender) возникает когда пользователь выполняет действие “click” (щелчок) над объектом Sender. Обычно это происходит при нажатии и отпускании левой кнопки мыши над компонентом. Это событие происходит также, если:

  • Пользователь выбрал элемент в таблице, дереве, списке, выпадающем списке, нажав клавишу со стрелкой.

  • Пользователь нажал клавишу пробела, когда кнопка или индикатор были в фокусе.

  • Пользователь нажал клавишу Enter, а активная форма имеет кнопку по умолчанию, указанную свойством Default.

  • Пользователь нажал клавишу Esc, а активная форма имеет кнопку прерывания, указанную свойством Cancel.

  • Пользователь нажал клавиши быстрого доступа к кнопке или индикатору. Например, если свойство Caption индикатора записано как "&Полужирный" и символ П. подчеркнут, то нажатие пользователем комбинации клавиш Alt-П вызовет событие OnClick в этом индикаторе.

  • Приложение установило в true свойство Checked радиокнопки RadioButton.

  • Приложение изменило свойство Checked индикатора CheckBox.

  • Вызван метод Click элемента меню.

Sender содержит объект, в котором произошло событие.

Событие OnDblClick (TObject* Sender) возникает при двойном нажатии левой кнопки мыши над объектом Sender. Данное событие доступно только для компонентов с установленным флагом csDoubleClicks в свойстве ControlStyle. В противном случае двойное нажатие будет интерпретироваться как два одинарных нажатия кнопки мыши.

Sender содержит объект, в котором произошло событие.

Событие OnMouseMove (TObject* Sender, TShiftState Shift, int X, int Y) возникает при перемещении курсора мыши над компонентом.

где: Sender – указатель на визуальный компонент, для которого происходит данное событие.

Shift – это переменная типа множество, определяющая состояние функциональных клавиш Alt, Ctrl и Shift, а также кнопок мыши в момент нажатия кнопки мыши. Может содержать различные комбинации следующих флагов: ssShift – нажата клавиша Shift, ssAlt – нажата клавиша Alt, ssCtrl – нажата клавиша Ctrl, ssLeft – нажата левая кнопка мыши, ssRight – нажата правая кнопка мыши, ssMiddle – нажата средняя кнопка мыши, ssDouble – произведено двойное нажатие кнопки мыши. Например, код для условия, что при событии OnMouseDown была зажата на клавиатуре клавиша Ctrl будет следующим: if(Shift.Contains(ssCtrl))

X и y определяют координаты курсора мыши в клиентской области объекта Sender.

Обработчики событий для клавиатуры.

Событие OnKeyDown (TObject* Sender, Word &Key, TShiftState Shift) наступает, если компонент находится в фокусе, при нажатии пользователем любой клавиши, включая функциональные и вспомогательные, такие, как Shift, Alt и Ctrl.

где: Sender – указатель на визуальный компонент, для которого происходит данное событие.

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

Key – содержит код нажатой клавиши. Для алфавитно-цифровых клавиш код совпадает с ASCII кодом соответствующего клавише символа, приведенного к верхнему регистру. Например, ‘S’ , ‘7’ и т.д. Для остальных клавиш используется виртуальный код клавиши, задаваемый константами VK_*. Например, VK_F1, VK_TAB, VK_RETURN и т.д.

Событие OnKeyUp (TObject* Sender, Word &Key, TShiftState Shift)) возникает при отпускании ранее нажатой клавиши на клавиатуре. Параметры аналогичны OnKeyDown.

Событие OnKeyPress (TObject* Sender, char &Key)) наступает, если компонент находится в фокусе, при нажатии пользователем клавиши символа.

где: Key содержит ASCII символ, сгенерированный в результате нажатия клавиши. При этом различаются символы в верхнем и нижнем регистрах и символы кириллицы и латинские. Клавиши, не отражаемые в кодах ASCII (функциональные клавиши и такие, как Shift, Alt, Ctrl), не вызывают этого события.

Sender – указатель на визуальный компонент, для которого происходит данное событие.

Событие OnEnter (TObject *Sender) наступает в момент получения элементом фокуса ввода.

где: Sender – указатель на визуальный компонент, для которого происходит данное событие.

Событие OnExit (TObject *Sender) наступает в момент потери элементом фокуса, в момент его переключения на другой элемент.

где: Sender – указатель на визуальный компонент, для которого происходит данное событие.

Обратите внимание, что события от клавиатуры генерируются именно для того компонента, который имеет фокус ввода. Таким образом, клавиатурные события для формы будут сгенерированы только в том случае, если ни один компонент на ней не имеет фокуса ввода. Однако существует специальное свойство KeyPreview компонента TForm. Если оно содержит значение true, то все клавиатурные события будут сначала сгенерированы для формы, владеющей компонентом с фокусом ввода, а потом повторно сгенерированы для этого компонента.

Это основные события, используемые при работе с клавиатурой и манипулятором «мышь»

Кроме данных событий в лабораторной работе будут задействованы следующие события для формы.

Событие OnCreate (TObject *Sender) возникает в момент создания формы и может использоваться для выполнения каких-то процедур настройки ее самой или содержащихся на ней компонентов.

где: Sender – указатель на форму.

Событие OnResize (TObject *Sender) заключительное событие при изменении размеров формы.

где: Sender – указатель на форму.

Событие OnShortCut (TWMKey &Msg, bool &Handled) возникает при нажатии пользователем клавиши, до того, как возникло стандартное событие OnKeyDown. Обработчик позволяет предусмотреть нестандартную реакцию на нажатие какой-то клавиши.

где: Msg – параметр сообщения Windows, поле CharCode которого (Msg.CharCode) содержит виртуальный код нажатой клавиши.

Handled – если задать ему значение true, то стандартные события OnKevDown. OnKevPress. OnKevUD не наступят.

Далее приступим непосредственно к выполнению лабораторной работы.

Запустите Borland C++ Builder 6.

Сохраните проект в новой отдельной папке.

Присвойте основной форме заголовок, в качестве имени которого используйте название дисциплины, номер работы и варианта и свою фамилию. Для задания заголовка в инспекторе объекта для формы выберете свойство Caption (по умолчанию текст будет Form1).

Установите для формы ограничения изменения размеров максимум 800х600, минимум 600х400. Для этого используйте свойства MaxHeight, MaxWidth и MinHeight, MinWidth. Свойства находятся в свойстве Constraints, для доступа к ним нажмите на знак плюса напротив свойства Constraints.

Установите позицию показа формы по центру экрана (свойство Position из выпадающего списка выберите значение poDesktopCenter).

После каждой модернизации программы сохраняйте проект и проверяйте его работоспособность. Для запуска приложения нажмите клавишу F9 или выберите пункт меню Run | Run или нажмите на панели инструментов на пиктограмму

Поместите на форму кнопку Button. Для кнопки поменяйте заголовок (свойство Caption поменяйте в Инспекторе Объекта) на «Проверка». Добавьте обработчик события нажатия кнопки мыши OnMouseDown. Для этого найдите в Инспекторе Объекта на вкладке Events нужный обработчик и кликнете напротив него по пустому месту (подробнее смотрите рисунок 1.3).

В обработчике задайте следующие условие, если нажата левая кнопка мыши, то вывести сообщение функцией ShowMessage(): «Нажата левая кнопка мыши». Аналогичные сообщения должны появиться и для нажатия правой и средней кнопок: «Нажата правая кнопка мыши», «Нажата средняя кнопка мыши». Для проверки условия проверяйте значение переменной Button типа TMouseButton.

Добавьте в обработчик код, нужно писать между скобками { }. Для написания требуемого кода пользуйте контекстной справкой, которая появляется после написания разделителя -> В конце каждой строчки необходимо ставить знак ;. В результате вы получите код:

Где: ShowMessage(string) – функция вызова диалогового окна сообщения с текстом, записанным в переменной string.

Сохраните приложение и проверьте его на работоспособность. При нажатии на кнопке «Проверка» выводится диалоговое окно с соответствующей записью.

Поместите на форму кнопку Button. Задайте для неё заголовок «Перемещение» (свойство Caption). Кнопку можно перетаскивать по форме в процессе выполнения программы. Для этого добавить обработчик перемещения курсора мыши для Button OnMouseMove. В обработчике задать изменения координат кнопки от перемещения (свойства Left и Top). При этом перемещение кнопки должно быть разрешено только при зажатой левой кнопки мыши. Для этого в обработчике OnMouseMove сделать проверку переменной Shift, которая должна содержать флаг ssLeft. В итоге будет следующий код:

где:

Left – левая координата кнопки относительно формы;

Top – верхняя координата кнопки относительно формы.

Сохраните приложение и проверьте его на работоспособность. При удержании левой кнопки мыши над кнопкой должно происходить её перемещение по форме.

Поместите на форму кнопку Button, заголовок которой установите в «Таймер» (свойство Caption). Для кнопки должно выводиться сообщение о времени, в течение которого была зажата кнопка мыши над компонентом. Для этого поместите на форму Timer со вкладки System. визуальных компонентов. Установить свойство Enabled в false. Свойство Interval оставьте по умолчанию 1000 миллисекунд. Для таймера добавьте обработчик срабатывания таймера OnTimer, в котором должно происходить увеличение глобальной переменной на единицы. Для этого создайте после описания формы глобальную переменную целого типа и обнулите её: int t=0;(рисунок 1). В обработчик добавьте одну строку: t++;.

Рисунок 1 – Объявление глобальной переменной.

Далее требуется для кнопки Button добавить два обработчика нажатия кнопки мыши OnMouseDown, обработчик отпускания кнопки мыши OnMouseUp. В обработчике OnMouseDown выполните следующую последовательность действий:

обнуление переменной t;

включение таймера – свойство Enabled поменять на true.

В обработчике OnMouseUp выполните следующую последовательность действий:

выключение таймера – свойство Enabled поменять на false;

вывод значения t с помощью функции ShowMessage(IntToStr(t)),

где IntToStr – функция преобразования типа данных целое число в тип данных строка.

Сохраните приложение и проверьте его на работоспособность. После нажатия и отпускания кнопки мыши над кнопкой «Таймер» должно выводиться сообщение с количеством времени удержания нажатой кнопки в секундах.

Поместите на форму компонент Memo из вкладки Standart визуальных компонентов. Установите для Memo вертикальную полосу прокрутки (свойство ScrollBars), установите свойство Align в состояние в соответствии с вариантом. В редакторе компонента Memo очистите содержимое строк (свойство Lines). Для этого щёлкните кнопкой мышью по кнопке с многоточием напротив свойства Lines. В открывшемся редакторе очистите содержимое строк. Создайте обработчик для текстового поля Memo OnKeyDown, в котором нужно определять нажатие функциональных клавиш, используя виртуальные коды VK_F1VK_10. Для выбора нужной клавиши используйте конструкцию switch case. Название нажатой функциональной клавиши выводите в специальную помещённую на форму метку Label из вкладки Standard, в свойство Caption. Например: "Нажата клавиша: F1". Для кнопки F1 код будет следующим:

где: switch case конструкция множественного выбора.

switch – показывает какая переменная проверяется, в данном случае код символа в переменной Key;

case – определяет конкретное значение проверяемой переменной;

break – завершает работу конструкции множественного выбора.

Сохраните приложение и проверьте его на работоспособность. В специальной метке должен выводиться текст с информацией о нажатой функциональной клавише.

Для Memo добавьте обработчик печати символа OnKeyPress, в котором требуется определить в каком регистре: верхнем или нижнем напечатан символ. Результат должен выводиться специальную помещённую на форму метку Label из вкладки Standard, в свойство Caption: «Символ напечатан в верхнем регистре» или «Символ напечатан в нижнем регистре». Для определения, в каком регистре напечатан символ используйте функции islower и isupper для латинских букв. Код будет следующий:

где: islower(Key) – функция вернёт значение true, если переменная Key напечатана в нижнем регистре (латинские буквы);