//Text1.Enabled = False //Me.PopupMenu mymenu //Text1.Enabled = True这三句话的确没什么意思,但 Text1.Enabled = False Me.PopupMenu mymenu 这两者的结合就大有意思了,它们的确以最简便的方法将系统菜单取消掉了,这就是熟能生巧。你要真屏蔽掉TextBox自带的菜单也行,用下面这个程序就行了,但体积也就大大增加了。'新建一个模块将下面语句贴入其中Public OldWinProc As Long ' 保存系统窗口函数的地址 Public Const WM_CONTEXTMENU = &H7B ' 当右击文本框时,系统发送这条消息Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) 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 Public Function SubClass_WndMessage(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wParam As OLE_HANDLE, ByVal lParam As Long) As Long If Msg <> WM_CONTEXTMENU Then SubClass_WndMessage = CallWindowProc(OldWinProc, hWnd, Msg, wParam, lParam) ' 如果消息不是WM_CONTEXTMENU,就调用系统的窗口处理函数 Exit Function End If SubClass_WndMessage = True End Function '将下面语句贴在Form代码窗中: Private Const GWL_WNDPROC = (-4)Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then Exit Sub OldWinProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC) ' 取得窗口函数的地址 Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf SubClass_WndMessage) ' 用SubClass_WndMessage代替窗口函数处理消息 End SubPrivate Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then Exit Sub Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWinProc) ' 恢复窗口的默认函数 Me.PopupMenu mymenu End Sub
Text1.Enabled = True
''''////////应该没什么意思.只需要Me.PopupMenu mymenu就可以
why?
如何达到我的目的
//Me.PopupMenu mymenu
//Text1.Enabled = True这三句话的确没什么意思,但
Text1.Enabled = False
Me.PopupMenu mymenu
这两者的结合就大有意思了,它们的确以最简便的方法将系统菜单取消掉了,这就是熟能生巧。你要真屏蔽掉TextBox自带的菜单也行,用下面这个程序就行了,但体积也就大大增加了。'新建一个模块将下面语句贴入其中Public OldWinProc As Long ' 保存系统窗口函数的地址
Public Const WM_CONTEXTMENU = &H7B ' 当右击文本框时,系统发送这条消息Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) 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
Public Function SubClass_WndMessage(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wParam As OLE_HANDLE, ByVal lParam As Long) As Long
If Msg <> WM_CONTEXTMENU Then
SubClass_WndMessage = CallWindowProc(OldWinProc, hWnd, Msg, wParam, lParam)
' 如果消息不是WM_CONTEXTMENU,就调用系统的窗口处理函数
Exit Function
End If
SubClass_WndMessage = True
End Function
'将下面语句贴在Form代码窗中:
Private Const GWL_WNDPROC = (-4)Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Exit Sub
OldWinProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
' 取得窗口函数的地址
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf SubClass_WndMessage)
' 用SubClass_WndMessage代替窗口函数处理消息
End SubPrivate Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Exit Sub
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWinProc)
' 恢复窗口的默认函数
Me.PopupMenu mymenu
End Sub