|
Wenn Sie beim Bearbeiten von Einträgen in einem ListView-Steuerelement oder von Knoten in einem TreeView-Steuerelement die Eingabe auf Ziffern beschränken möchten, können Sie die Fenster-Stile der in diese Steuerelemente "eingebauten" TextBoxen vor ihrem Erscheinen entsprechend modifizieren.
Beide Steuerelemente liefern Ihnen das Handle der TextBox unmittelbar vor dem Beginn des Eingabe-Modus, der Ihnen durch das Eintreffen des BeforeLabelEdit-Ereignisses signalisiert wird. Dort können Sie das Handle über die API-Funktion SendMessage und die Nachrichten LVM_GETEDITCONTROL bzw. TVM_GETEDITCONTROL ermitteln und den Fensterstil der TextBox modifizieren. Zu letzterem holen Sie per GetWindowLong und der Index-Angabe GWL_STYLE den aktuellen Fensterstil der TextBox, ergänzen ihn per Oder-Verknüpfung um den Stil ES_NUMBERS, und schreiben den geänderten Stil per SetWindowLong zurück.
Beide Operationen können Sie in handlichen Hilfsprozeduren zusammenfassen:
Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) _
As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const ES_NUMBER = &H2000&
Private Const GWL_STYLE = (-16)
Public Sub LvwOnlyNumbers(ListView As ListView)
Dim nWnd As Long
Dim nStyle As Long
Const LVM_FIRST = &H1000&
Const LVM_GETEDITCONTROL = (LVM_FIRST + 24)
nWnd = SendMessage(ListView.hwnd, LVM_GETEDITCONTROL, 0, 0)
If nWnd <> 0 Then
nStyle = GetWindowLong(nWnd, GWL_STYLE)
nStyle = nStyle Or ES_NUMBER
SetWindowLong nWnd, GWL_STYLE, nStyle
End If
End Sub
Public Sub TvwOnlyNumbers(TreeView As TreeView)
Dim nWnd As Long
Dim nStyle As Long
Const TV_FIRST = &H1100&
Const TVM_GETEDITCONTROL = (TV_FIRST + 15)
nWnd = SendMessage(TreeView.hwnd, TVM_GETEDITCONTROL, 0, 0)
If nWnd <> 0 Then
nStyle = GetWindowLong(nWnd, GWL_STYLE)
nStyle = nStyle Or ES_NUMBER
SetWindowLong nWnd, GWL_STYLE, nStyle
End If
End Sub
Die Aufrufe im BeforeLabelEdit-Ereignis eines ListViews oder eines TreeViews:
Private Sub ListView1_BeforeLabelEdit(Cancel As Integer)
LvwOnlyNumbers ListView1
End Sub
Private Sub TreeView1_BeforeLabelEdit(Cancel As Integer)
TvwOnlyNumbers TreeView1
End Sub
|