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

2. Розпізнавання джерела події, натиснутих кнопок і клавіш, координат курсору

У всі обробники подій, пов'язаних з маніпуляціями миші (як і у всі інші обробники) передається параметр Sender типу покажчик на TObject. Цей параметр містить покажчик на компонент, в якому відбулася подія. Він не потрібний, якщо пишеться обробник події для одного конкретного компоненту. Проте часто один обробник застосовується для декількох компонентів. При цьому якісь операції можуть бути загальними для будь-яких джерел події, а якісь вимагати специфічних дій. Тоді Sender можна використовувати для розпізнавання джерела події. Правда, оскільки тип TObject не має ніяких корисних для користувача властивостей і методів, то об'єкт Sender слід розглядати як об'єкт одного з похідних від TObject типів.

Крім параметра Sender в обробники подій OnMouseDown і OnMouseUp передаються параметри, що дозволяють розпізнати натиснуту кнопку, натиснуті при цьому допоміжні клавіші, а також визначити координати курсору миші. Заголовок обробника події OnMouseDown або OnMouseUp може мати, наприклад, наступний вигляд:

void __fastcall TForm1::Edit1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

Крім вже розглянутого нами параметра Sender в обробник передаються параметри Button, Shift, X і Y.

Параметр Button типу TMouseButton визначає натиснуту у цей момент кнопку миші. Тип TMouseButton — тип, що перераховує, визначуваний таким чином:

enum TMouseButton (mbLeft, mbRight, mbMiddle);

Значення mbLeft відповідає натисненню лівої кнопки миші, значення mbRight — правої, а значення mbMiddle — середньої. Наприклад, якщо ви хочете, щоб обробник реагував на натиснення тільки лівої кнопки, ви можете його першим оператором написати:

if (Button != mbLeft) return;

Тоді, якщо значення Button не рівне mbLeft, тобто натиснута не ліва кнопка, виконання обробника урветься.

Параметр Shift типу TShiftState визначає, які допоміжні клавіші на клавіатурі натиснуті у момент натиснення кнопки миші. Оскільки Shift є множиною, перевіряти наявність в ньому тих або інших елементів треба методом Contains. Наприклад, якщо ви хочете прореагувати на подію, що полягає в натисненні лівої кнопки миші при натиснутій клавіші Alt, можна використовувати оператора:

if ((Button == mbLeft)&&(Shift.Contains(ssAlt)))

У всі події, пов'язані з мишею, передаються також координати курсору X і Y. Ці параметри визначають координати курсору в клієнтській області компоненту. Завдяки цьому можна забезпечити різну реакцію залежно від того, в якій частині клієнтської області розташований курсор. Наприклад:

void __fastcall TForm1::FormMouseMove(TObject *Sender,

TShiftState Shift, int X, int Y)

{

StatusBar1->Panels->Items[0]->Text="x="+IntToStr(X);

StatusBar1->Panels->Items[1]->Text="y="+IntToStr(Y);

}

void __fastcall TForm1::Button1MouseMove(TObject *Sender,

TShiftState Shift, int X, int Y)

{

if (Button1->Cursor==crCross)

Button1->Visible=False;

Button1->Visible=True;

}

Розглянемо тепер події OnMouseWheel, OnMouseWheelUp і OnMouseWheelDown. Ці події пов'язані з обертанням коліщатка, яке є в сучасних варіантах миші. Заголовок обробника події OnMouseWheel має вигляд:

void __fastcall TForml::FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta, TPoint & MousePos, bool &Handled)

Параметри Sender і Shift не відрізняються від розглянутих раніше. Параметр WheelDelta показує, скільки разів обернулося коліщатко. Це позитивне число при обертанні вгору і негативне — при обертанні вниз. Параметр MousePos типу TPoint визначає позицію курсорe миші. А параметр, що передається по посиланню Handled указує, чи завершена обробка події.

Якщо обробник події OnMouseWheel відсутній або якщо в ньому задано

Handled =false, то, залежно від напряму обертання коліщатка, наступає подія OnMouseWheelUp або OnMouseWheelDown.

Багато віконних компонентів — багаторядкові вікна редагування, списки і т.п. мають обробники обертань коліщатка за умовчанням. Це відноситься до Memo, RichEdit, ListBox, TrackBar і багатьох інших. Правда, ці обробники за умовчанням спрацьовуватимуть тільки в тому випадку, якщо в компонентах задані смуги прокрутки (власне, це обробники не самих елементів, а смуг прокрутки).

Обробники за умовчанням забезпечують при обертанні коліщатка зрушення вмісту у відповідному напрямі. Отже писати обробники подій, пов'язаних з коліщатком, має сенс тільки у випадках, коли треба забезпечити нестандартну реакцію компонентів.

Наприклад, якщо ви задасте для форми обробники:

void __fastcall TForm1::FormMouseWheelUp (TObject *Sender,

TShiftState Shift, TPoint &MousePos, bool &Handled)

{

( ScaleBy(101,100);

}

void __fastcall TForm1::FormMouseWheelDown(TObject *Sender,

TShiftState Shift, TPoint &MousePos, bool &Handled)

{

(ScaleBy(100,101);

}

то при обертанні коліщатка розміри всіх компонентів форми плавно зменшуватимуться або збільшуватимуться.

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