02 июня 2014
Кравченко Виктор

TextBox: Как переопределить стандартное поведение при нажатии клавиш?

VB.NET TextBox
01

Иногда бывает необходимым переопределить стандартное поведение контрола (в нашем случае TextBox) при нажатии клавиш. Например, иногда нужно ограничить ввод таким образом, чтобы пользователь мог ввести только цифры, иногда — только заглавные буквы, а иногда, чтобы при нажатии кнопки <Tab> в текст вставлялось некоторое количество пробелов. Обратите внимание, что в этом случае значение свойства AcceptsTab должно быть True.

02 Задача:
Переопределить поведение TextBox таким образом, чтобы при нажатии клавиши <Tab> в указанное место вставлялось заданное количество пробелов.
03

И как бы это странно не выглядело, нам опять придется обратится к переопределению очень знакомого всем создателям UserControls — метода WndProc.

04 VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Public Class sTabkeyTextBox Inherits TextBox ' Задаем количество пробелов, которое будет вставляться при нажатии кнопки Tab Public Property countSpaces As Integer = 4 ' Virtual Keys
Public Enum VK VK_TAB = &H9 ' ... End Enum
' Windows Messages
Public Enum WM WM_CHAR = &H102 WM_KEYDOWN = &H100 End Enum
Protected Overrides Sub WndProc(ByRef m As Message) Select Case m.Msg ' Поскольку первым посылается сообщение WM_KEYDOWN, то и обработка нажатия происходит здесь. Case WM.WM_KEYDOWN ' Нажата клавиша Select Case m.WParam Case VK.VK_TAB ' Если нажата клавиша Tab, то производим необходимые действия. Dim firstPart As String = Me.Text.Substring(0, Me.SelectionStart) Dim secondPart As String = Me.Text.Substring(Me.SelectionStart + Me.SelectionLength) Me.Text = firstPart + Space(countSpaces) + secondPart Me.SelectionStart = firstPart.Length + countSpaces ' Возвращаем курсор на место Case Else : MyBase.WndProc(m) End Select Case WM.WM_CHAR ' Нажата клавиша Select Case m.WParam
' Если нажата клавиша Tab, то ничего не делаем, потому что все уже сделали при перехвате WM.WM_KEYDOWN. ' Такой порядок необходим, потому что в противном случае данные о Selection обнуляются.
Case VK_TAB : Return Case Else : MyBase.WndProc(m) End Select Case Else : MyBase.WndProc(m) End Select End Sub
End Class
05

В статье Сабклассинг, или берем все под свой контроль! можно почитать о том, как сделать модернизацию стандартных контролов менее болезненной и более гибкой.

06

Что почитать:

07

Похожие запросы:

  • Переопределение поведения TextBox при нажатии на клавиши
  • Отлов нажатия клавиши
  • Перехват нажатия клавиш
comments powered by HyperComments