Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii < &H30 Or KeyAscii > &H39 Then MsgBox "不是数字" KeyAscii = 0 End IfEnd Sub
If KeyAscii = 13 Then'回车 KeyAscii = 0 SendKeys "{Tab}" End If If KeyAscii = 46 Then Exit Sub'小数点 If KeyAscii = 8 Then Exit Sub '退格 If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 End If
'气泡提示类CTips,记得是坛子里谁的代码来着。Option ExplicitPrivate Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As LongPrivate Const WM_USER = &H400 Private Const CW_USEDEFAULT = &H80000000Private Type RECT left As Long top As Long right As Long bottom As Long End TypePrivate Type POINTAPI X As Long Y As Long End TypePrivate Const TTS_NOPREFIX = &H2 Private Const TTF_TRANSPARENT = &H100 Private Const TTF_CENTERTIP = &H2 Private Const TTM_ADDTOOLA = (WM_USER + 4) Private Const TTM_ACTIVATE = WM_USER + 1 Private Const TTM_UPDATETIPTEXTA = (WM_USER + 12) Private Const TTM_SETMAXTIPWIDTH = (WM_USER + 24) Private Const TTM_SETTIPBKCOLOR = (WM_USER + 19) Private Const TTM_SETTIPTEXTCOLOR = (WM_USER + 20) Private Const TTM_SETTITLE = (WM_USER + 32) Private Const TTS_BALLOON = &H40 Private Const TTS_ALWAYSTIP = &H1 Private Const TTF_SUBCLASS = &H10 Private Const TTF_TRACK = &H20 Private Const TTF_IDISHWND = &H1 Private Const TTM_SETDELAYTIME = (WM_USER + 3) Private Const TTDT_AUTOPOP = 2 Private Const TTDT_INITIAL = 3 Private Const TTM_TRACKACTIVATE = WM_USER + 17 Private Const TTM_TRACKPOSITION = WM_USER + 18 Private Const WS_POPUP = &H80000000Private Const TOOLTIPS_CLASSA = "tooltips_class32"Private Type TOOLINFO lSize As Long lFlags As Long hwnd As Long lId As Long lpRect As RECT hInstance As Long lpStr As String lParam As Long End TypePublic Enum ttIconType TTNoIcon = 0 TTIconInfo = 1 TTIconWarning = 2 TTIconError = 3 End EnumPublic Enum ttStyleEnum TTStandard TTBalloon End EnumPrivate mvarBackColor As Long Private mvarTitle As String Private mvarForeColor As Long Private mvarIcon As ttIconType Private mvarCentered As Boolean Private mvarStyle As ttStyleEnum Private mvarTipText As String Private mvarVisibleTime As Long Private mvarDelayTime As Long Private mvarPopupOnDemand As BooleanPrivate m_lTTHwnd As Long Private m_lParentHwnd As Long Private ti As TOOLINFOPrivate Sub Class_Initialize() mvarDelayTime = 500 mvarVisibleTime = 5000 mvarPopupOnDemand = False End Sub Private Sub Class_Terminate() Destroy End Sub Public Property Get VisibleTime() As Long VisibleTime = mvarVisibleTime End Property Public Property Let VisibleTime(ByVal lData As Long) mvarVisibleTime = lData End Property Public Property Get DelayTime() As Long DelayTime = mvarDelayTime End Property Public Property Let DelayTime(ByVal lData As Long) mvarDelayTime = lData End Property Public Property Let Icon(ByVal vData As ttIconType) mvarIcon = vData If m_lTTHwnd <> 0 And mvarTitle <> Empty And mvarIcon <> TTNoIcon Then SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle End If End Property Public Property Get Icon() As ttIconType Icon = mvarIcon End Property Public Property Let ForeColor(ByVal vData As Long) mvarForeColor = vData If m_lTTHwnd <> 0 Then SendMessage m_lTTHwnd, TTM_SETTIPTEXTCOLOR, mvarForeColor, 0& End If End Property Public Property Get ForeColor() As Long ForeColor = mvarForeColor End Property Public Property Let Title(ByVal vData As String) mvarTitle = vData If m_lTTHwnd <> 0 And mvarTitle <> Empty And mvarIcon <> TTNoIcon Then SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle End If End Property Public Property Get Title() As String Title = ti.lpStr End Property Public Property Let PopupOnDemand(ByVal vData As Boolean) mvarPopupOnDemand = vData End Property Public Property Get PopupOnDemand() As Boolean PopupOnDemand = mvarPopupOnDemand End Property Public Property Let BackColor(ByVal vData As Long) mvarBackColor = vData If m_lTTHwnd <> 0 Then SendMessage m_lTTHwnd, TTM_SETTIPBKCOLOR, mvarBackColor, 0& End If End Property Public Property Get BackColor() As Long BackColor = mvarBackColor End Property Public Property Let TipText(ByVal vData As String) mvarTipText = vData ti.lpStr = vData If m_lTTHwnd <> 0 Then SendMessage m_lTTHwnd, TTM_UPDATETIPTEXTA, 0&, ti End If End Property Public Property Get TipText() As String TipText = mvarTipText End Property Public Property Let Style(ByVal vData As ttStyleEnum) mvarStyle = vData End Property Public Property Get Style() As ttStyleEnum Style = mvarStyle End Property Public Property Let Centered(ByVal vData As Boolean) mvarCentered = vData End Property Public Property Get Centered() As Boolean Centered = mvarCentered End Property Public Sub Show(Optional X As Long = 0, Optional Y As Long = 0) Dim pt As POINTAPI Dim ptTip As Long Dim ret As Long With pt .X = X .Y = Y End With ret = ClientToScreen(Form1.Text1.hwnd, pt) ptTip = pt.Y * &H10000 ptTip = ptTip + pt.X ret = SendMessage(m_lTTHwnd, TTM_TRACKPOSITION, 0, ByVal ptTip) ret = SendMessage(m_lTTHwnd, TTM_TRACKACTIVATE, True, ti) End Sub Public Function CreateToolTip(ByVal ParentHwnd As Long) As Boolean Dim lWinStyle As Long If m_lTTHwnd <> 0 Then DestroyWindow m_lTTHwnd End If m_lParentHwnd = ParentHwnd ''create baloon style if desired If mvarStyle = TTBalloon Then lWinStyle = lWinStyle Or TTS_BALLOON m_lTTHwnd = CreateWindowEx(0&, TOOLTIPS_CLASSA, vbNullString, lWinStyle, 0&, 0&, 0&, 0&, m_lParentHwnd, 0&, 0&, 0&) With ti If mvarCentered Then If mvarPopupOnDemand = False Then .lFlags = TTF_SUBCLASS Or TTF_CENTERTIP Or TTF_IDISHWND Else .lFlags = TTF_IDISHWND Or TTF_TRACK Or TTF_CENTERTIP End If Else If mvarPopupOnDemand = False Then .lFlags = TTF_SUBCLASS Or TTF_IDISHWND Else .lFlags = TTF_IDISHWND Or TTF_TRACK Or TTF_TRANSPARENT End If End If 'set the hwnd prop to our parent control's hwnd .hwnd = m_lParentHwnd .lId = m_lParentHwnd '0 .hInstance = App.hInstance .lSize = Len(ti) End With 'add the tooltip structure SendMessage m_lTTHwnd, TTM_ADDTOOLA, 0&, ti 'if we want a title or we want an icon If mvarTitle <> vbNullString Or mvarIcon <> TTNoIcon Then SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle End If If mvarForeColor <> Empty Then SendMessage m_lTTHwnd, TTM_SETTIPTEXTCOLOR, mvarForeColor, 0& End If If mvarBackColor <> Empty Then SendMessage m_lTTHwnd, TTM_SETTIPBKCOLOR, mvarBackColor, 0& End If SendMessageLong m_lTTHwnd, TTM_SETDELAYTIME, TTDT_AUTOPOP, mvarVisibleTime SendMessageLong m_lTTHwnd, TTM_SETDELAYTIME, TTDT_INITIAL, mvarDelayTime End FunctionPublic Sub Destroy() If m_lTTHwnd <> 0 Then DestroyWindow m_lTTHwnd End If End Sub'使用窗体代码,以输入数字为例Option Explicit Dim tip As New CTipsPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) tip.Destroy End SubPrivate Sub Form_Terminate() Set tip = Nothing End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer) If (KeyAscii > 57 Or KeyAscii < 48) And KeyAscii <> 8 Then Call ShowMyTip KeyAscii = 0 Else tip.Destroy End If End SubPrivate Sub ShowMyTip() tip.Style = TTBalloon tip.Icon = TTIconError tip.Title = "请输入数字!" tip.TipText = " " tip.PopupOnDemand = True tip.CreateToolTip Text1.hwnd tip.Show Text1.Width / Screen.TwipsPerPixelX, Text1.Height / Screen.TwipsPerPixelX / 2 - 1 '//In Pixel only End Sub
Private Sub Form_Load() Text1 = "" End SubPrivate Sub Text1_Change() If Text1 = "" Then Exit Sub If Not IsNumeric(Text1) Then MsgBox "请输入数字!" Text1 = Left(Text1, Len(Text1.Text) - 1) Text1.SelStart = Len(Text1.Text) End If End Sub
各位XD,以下代碼是否可行: If Left(Text1.Text, 1) = 0 Then Text2.Text = "你輸入的是數字" ElseIf Left(Text1.Text, 1) = 1 Then Text2.Text = "你輸入的是數字" ElseIf Left(Text1.Text, 1) = 3 Then Text2.Text = "你輸入的是數字" ElseIf Left(Text1.Text, 1) = 4 Then Text2.Text = "你輸入的是數字" ElseIf Left(Text1.Text, 1) = 5 Then Text2.Text = "你輸入的是數字" ElseIf Left(Text1.Text, 1) = 6 Then Text2.Text = "你輸入的是數字" ElseIf Left(Text1.Text, 1) = 7 Then Text2.Text = "你輸入的是數字" ElseIf Left(Text1.Text, 1) = 8 Then Text2.Text = "你輸入的是數字" ElseIf Left(Text1.Text, 1) = 9 Then Text2.Text = "你輸入的是數字" Else Text2.Text = "你輸入的是非數字!" End If
如果这不是特别要求的话,其实不需要做 “你输入的是...”。 多一些代码是可以实现你的需求,但我们给一个msgbox的最终目的是告诉用户这个text需要什么,客户刚刚敲入的东西其实不必要重复出来。 如果非要的话,你需要把字符,空格等等用一个字典一样的东西从asc码 你的msgbox就这样Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii < &H30 Or KeyAscii > &H39 Then if KeyAscii=&H32 then MsgBox "The character you just input is ENTER,please input number" else MsgBox "The character you just input is '" & chr(KeyAscii) & "',please input number" end ifKeyAscii = 0 End IfEnd Sub大概就是那样了,你自己再改改
以前做过,参考:http://topic.csdn.net/u/20070815/17/f1c68367-7fe3-42ef-ab8f-00f07525908e.htmlhttp://topic.csdn.net/u/20070723/17/fcb3dcf0-eb5c-4144-b6e9-bf33fc86097f.html主要原理很简单,先利用KEYPRESS过滤录入的内容,再利用子类化吃掉剪贴板消息,即可完美解决此问题.我这里有一个示例代码:'本代码在窗体中,窗体中有一个Text1. Option Explicit '只允许文本框输入数值示例 ' '处理思路: ' 先在文本框的KeyPress事件里处理键盘上的输入,再使用子类化禁止复制粘贴与剪切消息. ' 'BY 嗷嗷叫的老马 '紫水晶工作室 'http://www.m5home.com/ '2009-10-03Private Sub Form_Load() '复制粘贴剪切使用子类化处理 PrevWndProc = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf SubWndProc) End SubPrivate Sub Form_Unload(Cancel As Integer) SetWindowLong Text1.hwnd, GWL_WNDPROC, PrevWndProc End SubPrivate 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'以下代码在模块中. Option Explicit '子类化模块 ' 'BY 嗷嗷叫的老马 '紫水晶工作室 'http://www.m5home.com/ '2009-10-03Public 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 = &H300Public PrevWndProc As LongPublic 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
If KeyAscii < &H30 Or KeyAscii > &H39 Then
MsgBox "不是数字"
KeyAscii = 0
End IfEnd Sub
KeyAscii = 0
SendKeys "{Tab}"
End If
If KeyAscii = 46 Then Exit Sub'小数点
If KeyAscii = 8 Then Exit Sub '退格
If KeyAscii < 48 Or KeyAscii > 57 Then
KeyAscii = 0
End If
'气泡提示类CTips,记得是坛子里谁的代码来着。Option ExplicitPrivate Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As LongPrivate Const WM_USER = &H400
Private Const CW_USEDEFAULT = &H80000000Private Type RECT
left As Long
top As Long
right As Long
bottom As Long
End TypePrivate Type POINTAPI
X As Long
Y As Long
End TypePrivate Const TTS_NOPREFIX = &H2
Private Const TTF_TRANSPARENT = &H100
Private Const TTF_CENTERTIP = &H2
Private Const TTM_ADDTOOLA = (WM_USER + 4)
Private Const TTM_ACTIVATE = WM_USER + 1
Private Const TTM_UPDATETIPTEXTA = (WM_USER + 12)
Private Const TTM_SETMAXTIPWIDTH = (WM_USER + 24)
Private Const TTM_SETTIPBKCOLOR = (WM_USER + 19)
Private Const TTM_SETTIPTEXTCOLOR = (WM_USER + 20)
Private Const TTM_SETTITLE = (WM_USER + 32)
Private Const TTS_BALLOON = &H40
Private Const TTS_ALWAYSTIP = &H1
Private Const TTF_SUBCLASS = &H10
Private Const TTF_TRACK = &H20
Private Const TTF_IDISHWND = &H1
Private Const TTM_SETDELAYTIME = (WM_USER + 3)
Private Const TTDT_AUTOPOP = 2
Private Const TTDT_INITIAL = 3
Private Const TTM_TRACKACTIVATE = WM_USER + 17
Private Const TTM_TRACKPOSITION = WM_USER + 18
Private Const WS_POPUP = &H80000000Private Const TOOLTIPS_CLASSA = "tooltips_class32"Private Type TOOLINFO
lSize As Long
lFlags As Long
hwnd As Long
lId As Long
lpRect As RECT
hInstance As Long
lpStr As String
lParam As Long
End TypePublic Enum ttIconType
TTNoIcon = 0
TTIconInfo = 1
TTIconWarning = 2
TTIconError = 3
End EnumPublic Enum ttStyleEnum
TTStandard
TTBalloon
End EnumPrivate mvarBackColor As Long
Private mvarTitle As String
Private mvarForeColor As Long
Private mvarIcon As ttIconType
Private mvarCentered As Boolean
Private mvarStyle As ttStyleEnum
Private mvarTipText As String
Private mvarVisibleTime As Long
Private mvarDelayTime As Long
Private mvarPopupOnDemand As BooleanPrivate m_lTTHwnd As Long
Private m_lParentHwnd As Long
Private ti As TOOLINFOPrivate Sub Class_Initialize()
mvarDelayTime = 500
mvarVisibleTime = 5000
mvarPopupOnDemand = False
End Sub
Private Sub Class_Terminate()
Destroy
End Sub
Public Property Get VisibleTime() As Long
VisibleTime = mvarVisibleTime
End Property
Public Property Let VisibleTime(ByVal lData As Long)
mvarVisibleTime = lData
End Property
Public Property Get DelayTime() As Long
DelayTime = mvarDelayTime
End Property
Public Property Let DelayTime(ByVal lData As Long)
mvarDelayTime = lData
End Property
Public Property Let Icon(ByVal vData As ttIconType)
mvarIcon = vData
If m_lTTHwnd <> 0 And mvarTitle <> Empty And mvarIcon <> TTNoIcon Then
SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle
End If
End Property
Public Property Get Icon() As ttIconType
Icon = mvarIcon
End Property
Public Property Let ForeColor(ByVal vData As Long)
mvarForeColor = vData
If m_lTTHwnd <> 0 Then
SendMessage m_lTTHwnd, TTM_SETTIPTEXTCOLOR, mvarForeColor, 0&
End If
End Property
Public Property Get ForeColor() As Long
ForeColor = mvarForeColor
End Property
Public Property Let Title(ByVal vData As String)
mvarTitle = vData
If m_lTTHwnd <> 0 And mvarTitle <> Empty And mvarIcon <> TTNoIcon Then
SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle
End If
End Property
Public Property Get Title() As String
Title = ti.lpStr
End Property
Public Property Let PopupOnDemand(ByVal vData As Boolean)
mvarPopupOnDemand = vData
End Property
Public Property Get PopupOnDemand() As Boolean
PopupOnDemand = mvarPopupOnDemand
End Property
Public Property Let BackColor(ByVal vData As Long)
mvarBackColor = vData
If m_lTTHwnd <> 0 Then
SendMessage m_lTTHwnd, TTM_SETTIPBKCOLOR, mvarBackColor, 0&
End If
End Property
Public Property Get BackColor() As Long
BackColor = mvarBackColor
End Property
Public Property Let TipText(ByVal vData As String)
mvarTipText = vData
ti.lpStr = vData
If m_lTTHwnd <> 0 Then
SendMessage m_lTTHwnd, TTM_UPDATETIPTEXTA, 0&, ti
End If
End Property
Public Property Get TipText() As String
TipText = mvarTipText
End Property
Public Property Let Style(ByVal vData As ttStyleEnum)
mvarStyle = vData
End Property
Public Property Get Style() As ttStyleEnum
Style = mvarStyle
End Property
Public Property Let Centered(ByVal vData As Boolean)
mvarCentered = vData
End Property
Public Property Get Centered() As Boolean
Centered = mvarCentered
End Property
Public Sub Show(Optional X As Long = 0, Optional Y As Long = 0)
Dim pt As POINTAPI
Dim ptTip As Long
Dim ret As Long With pt
.X = X
.Y = Y
End With
ret = ClientToScreen(Form1.Text1.hwnd, pt)
ptTip = pt.Y * &H10000
ptTip = ptTip + pt.X
ret = SendMessage(m_lTTHwnd, TTM_TRACKPOSITION, 0, ByVal ptTip)
ret = SendMessage(m_lTTHwnd, TTM_TRACKACTIVATE, True, ti)
End Sub
Public Function CreateToolTip(ByVal ParentHwnd As Long) As Boolean
Dim lWinStyle As Long
If m_lTTHwnd <> 0 Then
DestroyWindow m_lTTHwnd
End If
m_lParentHwnd = ParentHwnd
''create baloon style if desired
If mvarStyle = TTBalloon Then lWinStyle = lWinStyle Or TTS_BALLOON m_lTTHwnd = CreateWindowEx(0&, TOOLTIPS_CLASSA, vbNullString, lWinStyle, 0&, 0&, 0&, 0&, m_lParentHwnd, 0&, 0&, 0&)
With ti
If mvarCentered Then
If mvarPopupOnDemand = False Then
.lFlags = TTF_SUBCLASS Or TTF_CENTERTIP Or TTF_IDISHWND
Else
.lFlags = TTF_IDISHWND Or TTF_TRACK Or TTF_CENTERTIP
End If
Else
If mvarPopupOnDemand = False Then
.lFlags = TTF_SUBCLASS Or TTF_IDISHWND
Else
.lFlags = TTF_IDISHWND Or TTF_TRACK Or TTF_TRANSPARENT
End If
End If 'set the hwnd prop to our parent control's hwnd
.hwnd = m_lParentHwnd
.lId = m_lParentHwnd '0
.hInstance = App.hInstance
.lSize = Len(ti)
End With
'add the tooltip structure
SendMessage m_lTTHwnd, TTM_ADDTOOLA, 0&, ti 'if we want a title or we want an icon
If mvarTitle <> vbNullString Or mvarIcon <> TTNoIcon Then
SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle
End If
If mvarForeColor <> Empty Then
SendMessage m_lTTHwnd, TTM_SETTIPTEXTCOLOR, mvarForeColor, 0&
End If
If mvarBackColor <> Empty Then
SendMessage m_lTTHwnd, TTM_SETTIPBKCOLOR, mvarBackColor, 0&
End If
SendMessageLong m_lTTHwnd, TTM_SETDELAYTIME, TTDT_AUTOPOP, mvarVisibleTime
SendMessageLong m_lTTHwnd, TTM_SETDELAYTIME, TTDT_INITIAL, mvarDelayTime
End FunctionPublic Sub Destroy()
If m_lTTHwnd <> 0 Then
DestroyWindow m_lTTHwnd
End If
End Sub'使用窗体代码,以输入数字为例Option Explicit
Dim tip As New CTipsPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
tip.Destroy
End SubPrivate Sub Form_Terminate()
Set tip = Nothing
End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer)
If (KeyAscii > 57 Or KeyAscii < 48) And KeyAscii <> 8 Then
Call ShowMyTip
KeyAscii = 0
Else
tip.Destroy
End If
End SubPrivate Sub ShowMyTip()
tip.Style = TTBalloon
tip.Icon = TTIconError
tip.Title = "请输入数字!"
tip.TipText = " "
tip.PopupOnDemand = True
tip.CreateToolTip Text1.hwnd
tip.Show Text1.Width / Screen.TwipsPerPixelX, Text1.Height / Screen.TwipsPerPixelX / 2 - 1 '//In Pixel only
End Sub
怎樣保證Text1.text輸入必須是數字呢?
如是字符,提示......
提示可以放在状态栏中,何必用气泡?
从交互设计的角度来讲,用气泡的优点可能交互性更强,缺点可能就是和可能因为一些API的问题耦合性较强。我选择气泡只是提供一个参考。
收藏了
只是tooltip上面那个红色的X,鼠标放到上面没有变成"手",另外那个红色的X也不管用
不过可以在这个基础上改改
TKS!
特別謝謝 clear_zero
不愧是一個好BZ;
可能我基礎不行吧;
我的要求是:
Text1.text必須是數字;
如果Text1.text輸入的是"字符",提示“你輸入的是字符,請重新輸入數字!”
如果Text1.text輸入的是"空格",提示“你輸入的是空格,請重新輸入數字!"
如果Text1.text輸入的是......
etc;
Text1 = ""
End SubPrivate Sub Text1_Change()
If Text1 = "" Then Exit Sub
If Not IsNumeric(Text1) Then
MsgBox "请输入数字!"
Text1 = Left(Text1, Len(Text1.Text) - 1)
Text1.SelStart = Len(Text1.Text)
End If
End Sub
If Left(Text1.Text, 1) = 0 Then
Text2.Text = "你輸入的是數字"
ElseIf Left(Text1.Text, 1) = 1 Then
Text2.Text = "你輸入的是數字"
ElseIf Left(Text1.Text, 1) = 3 Then
Text2.Text = "你輸入的是數字"
ElseIf Left(Text1.Text, 1) = 4 Then
Text2.Text = "你輸入的是數字"
ElseIf Left(Text1.Text, 1) = 5 Then
Text2.Text = "你輸入的是數字"
ElseIf Left(Text1.Text, 1) = 6 Then
Text2.Text = "你輸入的是數字"
ElseIf Left(Text1.Text, 1) = 7 Then
Text2.Text = "你輸入的是數字"
ElseIf Left(Text1.Text, 1) = 8 Then
Text2.Text = "你輸入的是數字"
ElseIf Left(Text1.Text, 1) = 9 Then
Text2.Text = "你輸入的是數字"
Else
Text2.Text = "你輸入的是非數字!"
End If
如果这不是特别要求的话,其实不需要做 “你输入的是...”。
多一些代码是可以实现你的需求,但我们给一个msgbox的最终目的是告诉用户这个text需要什么,客户刚刚敲入的东西其实不必要重复出来。
如果非要的话,你需要把字符,空格等等用一个字典一样的东西从asc码
你的msgbox就这样Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < &H30 Or KeyAscii > &H39 Then
if KeyAscii=&H32 then
MsgBox "The character you just input is ENTER,please input number"
else
MsgBox "The character you just input is '" & chr(KeyAscii) & "',please input number"
end ifKeyAscii = 0
End IfEnd Sub大概就是那样了,你自己再改改
Option Explicit
'只允许文本框输入数值示例
'
'处理思路:
' 先在文本框的KeyPress事件里处理键盘上的输入,再使用子类化禁止复制粘贴与剪切消息.
'
'BY 嗷嗷叫的老马
'紫水晶工作室
'http://www.m5home.com/
'2009-10-03Private Sub Form_Load()
'复制粘贴剪切使用子类化处理
PrevWndProc = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf SubWndProc)
End SubPrivate Sub Form_Unload(Cancel As Integer)
SetWindowLong Text1.hwnd, GWL_WNDPROC, PrevWndProc
End SubPrivate 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'以下代码在模块中.
Option Explicit
'子类化模块
'
'BY 嗷嗷叫的老马
'紫水晶工作室
'http://www.m5home.com/
'2009-10-03Public 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 = &H300Public PrevWndProc As LongPublic 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