限制文本框(TextBox)只能输入数字(VB6代码)
作者:admin 日期:2009-10-07
在一些要求只允许输入数值的场合,就用得上了.
基本思路是,先在文本框的keyPress事件里过滤键盘输入,再使用子类化将粘贴剪切等剪贴板操作吃掉.
窗体frmMain.frm内代码(窗体包含一个文本框Text1):
标准模块ModSubClass.bas中的代码:
整个工程打包下载:
点击下载此文件
基本思路是,先在文本框的keyPress事件里过滤键盘输入,再使用子类化将粘贴剪切等剪贴板操作吃掉.
窗体frmMain.frm内代码(窗体包含一个文本框Text1):
复制内容到剪贴板
程序代码

Option Explicit
'只允许文本框输入数值示例
'
'处理思路:
' 先在文本框的KeyPress事件里处理键盘上的输入,再使用子类化禁止复制粘贴与剪切消息.
'
'BY 嗷嗷叫的老马
'紫水晶工作室
'http://www.m5home.com/
'2009-10-03
Private Sub Form_Load()
'复制粘贴剪切使用子类化处理
PrevWndProc = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf SubWndProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Text1.hwnd, GWL_WNDPROC, PrevWndProc
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
'只允许数字键,退格键,小数点进行输入的处理
Debug.Print KeyAscii
Select Case KeyAscii
Case vbKey0 To vbKey9, vbKeyBack '0 - 9,BACKSPACE处理
Case vbKeyDelete, vbKeyDecimal '小数点处理
If InStr(1, Text1.Text, ".") <> 0 Then KeyAscii = 0
Case Else
KeyAscii = 0
End Select
End Sub
'只允许文本框输入数值示例
'
'处理思路:
' 先在文本框的KeyPress事件里处理键盘上的输入,再使用子类化禁止复制粘贴与剪切消息.
'
'BY 嗷嗷叫的老马
'紫水晶工作室
'http://www.m5home.com/
'2009-10-03
Private Sub Form_Load()
'复制粘贴剪切使用子类化处理
PrevWndProc = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf SubWndProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Text1.hwnd, GWL_WNDPROC, PrevWndProc
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
'只允许数字键,退格键,小数点进行输入的处理
Debug.Print KeyAscii
Select Case KeyAscii
Case vbKey0 To vbKey9, vbKeyBack '0 - 9,BACKSPACE处理
Case vbKeyDelete, vbKeyDecimal '小数点处理
If InStr(1, Text1.Text, ".") <> 0 Then KeyAscii = 0
Case Else
KeyAscii = 0
End Select
End Sub
标准模块ModSubClass.bas中的代码:
复制内容到剪贴板
程序代码

Option Explicit
'子类化模块
'
'BY 嗷嗷叫的老马
'紫水晶工作室
'http://www.m5home.com/
'2009-10-03
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongW" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcW" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Public Const GWL_STYLE As Long = (-16)
Public Const ES_NUMBER As Long = &H2000&
Public Const GWL_WNDPROC As Long = (-4)
Public Const WM_GETTEXT As Long = &HD
Public Const WM_COPY As Long = &H301
Public Const WM_PASTE As Long = &H302
Public Const WM_CUT As Long = &H300
Public PrevWndProc As Long
Public Function SubWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case msg '在这里进行过滤.如果知道其他的消息,也可以在这里过滤.
Case WM_COPY, WM_PASTE, WM_CUT '复制,粘贴,剪切处理
SubWndProc = 1 '吃掉不处理.
Exit Function
End Select
SubWndProc = CallWindowProc(PrevWndProc, hwnd, msg, wParam, lParam) '其它消息不管
End Function
'子类化模块
'
'BY 嗷嗷叫的老马
'紫水晶工作室
'http://www.m5home.com/
'2009-10-03
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongW" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcW" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Public Const GWL_STYLE As Long = (-16)
Public Const ES_NUMBER As Long = &H2000&
Public Const GWL_WNDPROC As Long = (-4)
Public Const WM_GETTEXT As Long = &HD
Public Const WM_COPY As Long = &H301
Public Const WM_PASTE As Long = &H302
Public Const WM_CUT As Long = &H300
Public PrevWndProc As Long
Public Function SubWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case msg '在这里进行过滤.如果知道其他的消息,也可以在这里过滤.
Case WM_COPY, WM_PASTE, WM_CUT '复制,粘贴,剪切处理
SubWndProc = 1 '吃掉不处理.
Exit Function
End Select
SubWndProc = CallWindowProc(PrevWndProc, hwnd, msg, wParam, lParam) '其它消息不管
End Function
整个工程打包下载:

评论: 4 | 引用: 0 | 查看次数: 2251


我需要张贴功能!!



好像还有一个更简单的方法,不记得了
是不是直接用API设置数值输入模式的那种?
代码量是少,但有小数点问题......


好像还有一个更简单的方法,不记得了
.......子类化里处理一下就行....