
12/ Фокус елементів управління
Що таке фокус? Створимо проект. Помістимо на форму спочатку два текстових поля, а потім дві кнопки. Не навпаки. Запустимо проект. Клацнемо по одній кнопці, по іншій, по одному полю, по іншому. Нічого, звичайно, не відбувається, але зверніть увагу ось на що. Якщо останній раз ви клацнули по кнопці, то вона має дещо інший, ніж у інших кнопок, «натиснутий» вигляд. Це від того, що рамочка навколо неї стала товстішою. А якщо останній раз ви клацнули в текстовому полі, то саме в ньому блимає курсор, а в інших текстових полях не блимає. VB як би показує вам, яким з елементів керування ви користувалися останнім. Можна сказати, що з безлічі різнорідних об'єктів на формі тільки один виділяється, тобто перебуває у фокусі. Кажуть, що в цьому випадку об'єкт має фокус.
На нашій формі 4 об'єкти. У фокусі завжди тільки один з них.
Події отримання і втрати фокусу
У об'єктів, здатних мати фокус, є дві події: Enter, яка виникає в момент отримання об'єктом фокуса, і Leave, яка виникає в момент втрати фокусу. Наведемо приклади процедур для нашого проекту, для цього у вікні коду запишемо такі процедури :
Private Sub Button1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Enter
MsgBox("Кнопка 1 отримала фокус")
End Sub
Private Sub Button2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Enter
MsgBox ("Кнопка 2 отримала фокус")
End Sub
Private Sub TextBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Enter
MsgBox("Текстове поле 1 отримало фокус")
End Sub
Private Sub Button1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Leave
MsgBox ("Кнопка 1 втратила фокус")
End Sub
Private Sub Button2_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Leave
MsgBox ("Кнопка 2 втратила фокус")
End Sub
Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave
MsgBox ("Текстове поле 1 втратило фокус")
End Sub
Запустимо проект. Звернемо увагу, що перше текстове поле вже в фокусі, про що у вікні повідомлення ви вже маєте повідомлення від вашої програми: Текстове поле 1 отримало фокус
Клацнемо по другому текстовому полі. У вікні повідомлення з'являється: Текстове поле 1 втратило фокус
Клацнемо по другій кнопці. У вікні повідомлення з'являється: Кнопка 2 отримала фокус
Клацнемо на першому текстовому полі. У першому вікні повідомлення з'являється: Кнопка 2 втратила фокус, а в другому: Текстове поле 1 отримало фокус
Саме в такому порядку, а не навпаки.
Надаємо фокус у коді.
Фокус можна переводити на об'єкт і програмним шляхом. Доповнимо наш проект процедурою:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Focus()
Button2.Focus()
End Sub
Запустимо проект. Клацнемо по першій кнопці. Фокус, всупереч очікуванням, переміститься не на неї, а на другу кнопку. А у вікні повідомлення з'являється:
Текстове поле 1 втратило фокус,
Кнопка 1 отримала фокус,
Кнопка 1 втратила фокус,
Текстове поле 1 отримало фокус,
Текстове поле 1 втратило фокус,
Кнопка 2 отримала фокус.
Сталося це завдяки методу Focus. Справа його проста - переводити фокус на свого господаря. Як бачите, одне клацання по кнопці може приводити відразу до декількох подій, наступним один за одним у строго визначеному порядку.
Не всі об'єкти, що отримали фокус, проявляють це зримо. Наприклад, мітка. Якщо фокус на ній, ми цього ніяк не помітимо.
Якщо зламалася мишка
Фокус потрібен хоча б для того, щоб комп'ютер в кожен момент часу знав, який з елементів управління повинен реагувати на клавіатуру. Якщо ви набираєте на клавіатурі текст, то вводитися він буде тільки в те текстове поле, яке у фокусі. Якщо фокус знаходиться на кнопці, то ви можете натискати на неї не тільки мишкою, але і клавішею Enter.
Перекладати фокус з одного об'єкта на інший ви можете вручну клавішею Tab. При цьому фокус зупиняється тільки на тих об'єктах, для яких це має сенс. Так, мітка згаданим способом фокусу не отримає. Порядок пробігання визначається числовим значенням властивості TabIndex кожного елемента управління. Його ви можете бачити у вікні властивостей. Значення 0 отримує елемент управління,що першим з'явився на формі при проектуванні, 1 - другий і т.д. Фокус переходить від об'єкта до об'єкта в порядку зростання цього значення. Так, у попередньому прикладі, створюючи проект, ми на порожній формі першими розмістили текстове поле 1, потім - текстове поле 2. Тому при запуску проекту в фокусі відразу ж виявилося текстове поле 1, а після натискання Tab - текстове поле 2.
Ви можете змінити цей порядок, змінивши для деяких об'єктів значення властивості TabIndex.
Ви можете заборонити фокусу зупинятися на об'єкті при натисканні Tab, встановивши False його властивість TabStop.
Між кнопками фокус можна переміщати і клавішами переміщення курсору.