Фокус у элементов управления

Что такое фокус? Создайте проект. Поместите на форму сначала два текстовых поля, а затем две кнопки. Не наоборот. Запустите проект. Щелкните по одной кнопке, по другой, по одному полю, по другому. Ничего, конечно, не происходит, но обратите внимание вот на что. Если последний раз вы щелкнули по кнопке, то она имеет несколько другой, чем у других кнопок, «бывший нажатый» вид. Это от того, что рамочка вокруг нее стала чуть потолще. А если последний раз вы щелкнули по текстовому полю, то именно в нем мигает курсор, а в других текстовых полях не мигает. VB как бы показывает вам, каким из элементов управления вы пользовались последним. Можно сказать, что из множества разнородных объектов на форме один какой-то выделяется, то есть находится в фокусе. Говорят, что в этом случае объект обладает фокусом.

На вашей форме 4 объекта. В фокусе всегда только один из них.

События приобретения и потери фокуса. У объектов, способных иметь фокус, имеются два события: Enter, которое возникает в момент приобретения объектом фокуса, и Leave, которое возникает в момент потери фокуса.

Запишите в окно кода такие процедуры (если вы забыли, как получать заготовки процедур, перечитайте 3.11):

Private Sub Button1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Enter

Debug.WriteLine("Кнопка 1 получила фокус")

End Sub

Private Sub Button2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Enter

Debug.WriteLine("Кнопка 2 получила фокус")

End Sub

Private Sub TextBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Enter

Debug.WriteLine("Текстовое поле 1 получило фокус")

End Sub

Private Sub Button1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Leave

Debug.WriteLine("Кнопка 1 утратила фокус")

End Sub

Private Sub Button2_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Leave

Debug.WriteLine("Кнопка 2 утратила фокус")

End Sub

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave

Debug.WriteLine("Текстовое поле 1 утратило фокус")

End Sub

Я не стал писать процедуры для второго текстового поля.

Запустите проект. Обратите внимание, что первое текстовое поле уже в фокусе, о чем в окне Output вы уже имеете сообщение от вашей программы:

Текстовое поле 1 получило фокус

Щелкните по второму текстовому полю. В окне Output появляется:

Текстовое поле 1 утратило фокус

Щелкните по второй кнопке. В окне Output появляется:

Кнопка 2 получила фокус

Щелкните по первому текстовому полю. В окне Output появляется:

Кнопка 2 утратила фокус

Текстовое поле 1 получило фокус

Именно в таком порядке, а не наоборот. Пощелкайте по объектам. Понаблюдайте, что появляется при этом в окне Output и в какой последовательности.

Придаем фокус в коде. Фокус можно переводить на объект и программным путем. Дополним наш проект процедурой:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

TextBox1.Focus()

Button2.Focus()

End Sub

Запустите проект. Щелкните по первой кнопке. Фокус, вопреки ожиданиям, переместился не на нее, а на вторую кнопку. А в окне Output появляется:

Текстовое поле 1 утратило фокус

Кнопка 1 получила фокус

Кнопка 1 утратила фокус

Текстовое поле 1 получило фокус

Текстовое поле 1 утратило фокус

Кнопка 2 получила фокус

Произошло это благодаря методу Focus. Дело его простое – переводить фокус на своего хозяина. Как видите, один щелчок по кнопке может приводить сразу к нескольким событиям, следующим друг за другом в строго определенном порядке.

Не все объекты, получившие фокус, проявляют это зримо. Например, метка. Если фокус на ней, мы этого никак не заметим.

Если сломалась мышь. Фокус нужен хотя бы для того, чтобы компьютер в каждый момент времени знал, какой из элементов управления должен реагировать на клавиатуру. Если вы набираете на клавиатуре текст, то вводиться он будет только в то текстовое поле, которое обладает фокусом. Если фокус находится на кнопке, то вы можете нажимать на нее не только мышкой, но и клавишей Enter.

Переводить фокус с одного объекта на другой вы можете вручную клавишей Tab. При этом фокус останавливается только на тех объектах, для которых это имеет смысл. Так, метка упомянутым способом фокуса не получит. Порядок пробегания определяется численным значением свойства TabIndexкаждого элемента управления. Его вы можете видеть в окне свойств. Значение 0 получает элемент управления, первым появившийся на форме при проектировании, 1 – второй и т.д. Фокус переходит от объекта к объекту в порядке возрастания этого значения. Так, в предыдущем примере, создавая проект, я на пустой форме первым разместил текстовое поле 1, затем – текстовое поле 2. Поэтому при запуске проекта в фокусе сразу же оказалось текстовое поле 1, а после нажатия Tab – текстовое поле 2.

Вы можете изменить этот порядок, изменив некоторым объектам значения свойства TabIndex. С несколько большим комфортом вы сможете изменить их, зайдя во View ® Tab Orderи пощелкав мышкой по элементам управления. Только не забудьте потом выйти тем же путем: View ® Tab Order.

Вы можете запретить фокусу останавливаться на объекте при нажатии Tab, установив в False его свойство TabStop.

Между кнопками фокус можно перемещать и клавишами перемещения курсора.

Работа с мышью

В 3.11 мы познакомились с некоторыми событиями, возникающими при работе с мышью. Пришла пора расширить и углубить наше знакомство.

Наши рекомендации