将enable属性设置为false则,多行文本框的滚动条都不可用了,所以应该用locked=true ,另外用变量将textbox的值保留,再在textbox的change事件中再将值赋给textbox的text属性Private Sub Text1_Change() Text1.Text = preValue'前值 End Sub
Private Const GWL_WNDPROC = (-4) Private Const WM_RBUTTONDOWN = &H204Private 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 CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate prevWndProc As Long Private Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_RBUTTONDOWN Then Else WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) End If End Function'禁止TextBox的系统右键菜单 Sub DisableRightClick(txtTarget As TextBox)
prevWndProc = GetWindowLong(txtTarget.hwnd, GWL_WNDPROC) SetWindowLong txtTarget.hwnd, GWL_WNDPROC, AddressOf WndProc End Sub 把以上代码放到模块中在Form中 =============================== Text1.Locked=True DisableRightClick Text1这样就可以把右键菜单给禁止掉了 =============================== 不知道TextBox的Locked属性为True以后,还可以通过 右键菜单来粘贴是MS故意留下的还是Bug至少我试过,在ComboBox的Text中粘贴是不可行的
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 Const EM_SETREADONLY = &HCF Dim boReadOnly As Boolean'第一次双击只读,再次双击可编辑,再双击又只读...。设定boReadOnly的初值为True或False可改变第一次双击时的状态 Private Sub Text1_DblClick() Dim retval As Long ReadOnly = Not ReadOnly retval = SendMessage(Text1.hwnd, EM_SETREADONLY, ReadOnly, ByVal 0&) '将文本框设为可编辑 End Sub
笔误 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 Const EM_SETREADONLY = &HCF Dim boReadOnly As Boolean'第一次双击只读,再次双击可编辑,再双击又只读...。设定boReadOnly的初值为True或False可改变第一次双击时的状态 Private Sub Text1_DblClick() Dim retval As Long boReadOnly = Not boReadOnly retval = SendMessage(Text1.hwnd, EM_SETREADONLY, boReadOnly, ByVal 0&) '将文本框设为可编辑 End Sub
text1.locked=true 或text1.enable=false
别忘了加分哟!UP
Text1.Text = preValue'前值
End Sub
Private Const WM_RBUTTONDOWN = &H204Private 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 CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate prevWndProc As Long
Private Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_RBUTTONDOWN Then
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End If
End Function'禁止TextBox的系统右键菜单
Sub DisableRightClick(txtTarget As TextBox)
prevWndProc = GetWindowLong(txtTarget.hwnd, GWL_WNDPROC)
SetWindowLong txtTarget.hwnd, GWL_WNDPROC, AddressOf WndProc
End Sub
把以上代码放到模块中在Form中
===============================
Text1.Locked=True
DisableRightClick Text1这样就可以把右键菜单给禁止掉了
===============================
不知道TextBox的Locked属性为True以后,还可以通过
右键菜单来粘贴是MS故意留下的还是Bug至少我试过,在ComboBox的Text中粘贴是不可行的
'设为只读
sendmessage text1.hwnd,em_setreadonly,true,0
'解除只读
sendmessage text1.hwnd,em_setreadonly,false,0
Private Const EM_SETREADONLY = &HCF
Dim boReadOnly As Boolean'第一次双击只读,再次双击可编辑,再双击又只读...。设定boReadOnly的初值为True或False可改变第一次双击时的状态
Private Sub Text1_DblClick()
Dim retval As Long
ReadOnly = Not ReadOnly
retval = SendMessage(Text1.hwnd, EM_SETREADONLY, ReadOnly, ByVal 0&) '将文本框设为可编辑
End Sub
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 Const EM_SETREADONLY = &HCF
Dim boReadOnly As Boolean'第一次双击只读,再次双击可编辑,再双击又只读...。设定boReadOnly的初值为True或False可改变第一次双击时的状态
Private Sub Text1_DblClick()
Dim retval As Long
boReadOnly = Not boReadOnly
retval = SendMessage(Text1.hwnd, EM_SETREADONLY, boReadOnly, ByVal 0&) '将文本框设为可编辑
End Sub
要么用api发送EM_SetReadOnly消息
要么在事件响应中做文章
要么屏蔽右键
Dim boReadonly As BooleanPrivate Sub Text1_DblClick()
boReadonly = Not boReadonly
Text1.Locked = boReadonly
End Sub
呵呵,Locked以后,用户可以依靠右键系统菜单来达到对TextBox的修改就算送EM_SETREADONLY效果也是一样的。
谢谢!
你将text控件的Enable设为false
虽然label控件在text下,但照样可以达到响应用户事件的目的
================
我还有个方法
你就用label控件模拟text控件,只要将其boderstyle设为1,同时在程序中通过改变label1.caption来显示或改变你要在显示的内容。
如:label1.caption=“123”