Все вы знакомы с замечательной программой для загрузки файлов Download Master. Помимо всего прочего, в ней мне понравились текстовые поля с необычным поведением. В обычном состоянии, пока их никто не трогает, они недоступны (свойство Enabled = False), у них отсутствует каретка, и они сливаются с цветом формы (системный цвет vbButtonFace). Как только они получают фокус, они становятся обыкновенными текстовыми полями, со светлым цветом окна (системный цвет vbWindowBackground), кареткой, возможностью клавиатурного ввода и копирования - вставки. Давайте сделаем такое поле на Visual Basic 6, причём постараемся обойтись без API-функций.
Как сделать поле недоступным - с этим всё ясно, нужно написать несколько строчек кода в событии Text1_LostFocus. Загвоздка состоит в том, что когда пользователь щёлкает мышью на недоступном поле, не происходит событий Text1_GotFocus и Text1_MouseDown. Но, оказывается, при этом происходит событие Form_MouseDown (мы берём MouseDown а не Click, потому что в процедуру обработки события MouseDown передаются параметры X и Y - координаты курсора в клиентской системе, которые нам понадобятся). Значит, при обработке событие Form_MouseDown, мы должны выяснить, находится ли курсор внутри прямоугольника, занимаемого полем. Это можно сделать так (поле у нас везде называется по умолчанию - Text1):
Private Function CursorInTextbox( _
ByVal X As Single, ByVal Y As Single) As Boolean
With Text1
CursorInTextbox = (X >= .Left) And (X <= .Left + .Width) _
And (Y >= .Top) And (Y <= .Top + .Height)
End With
End Function
Процедуры "оживления" и "заморозки" поля:
Private Sub EnableTextBox()
With Text1
.Enabled = True
.BackColor = vbWindowBackground
.SetFocus
End With
End Sub
Private Sub DisableTextBox()
With Text1
.Enabled = False
.BackColor = vbButtonFace
End With
End Sub
Добавьте на форму текстовое поле, и ещё любой другой элемент управления, способный принимать фокус, например, кнопку. Он будет "отбирать" фокус у нашего поля. Скопируйте в модуль формы три функции, приведённые выше. А теперь обработаем ещё три нужные события:
Private Sub Form_Load()
DisableTextBox
End Sub
Private Sub Form_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If CursorInTextbox(X, Y) Then EnableTextBox
End Sub
Private Sub Text1_LostFocus()
DisableTextBox
End Sub
Теперь у нас есть поле такое же, как в Download Master.
Автор - Цзяофань
|