| Все вы знакомы с замечательной программой для загрузки файлов 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. Автор - Цзяофань |