怎不让Text控件弹出右键菜单

tztz520 2003-12-17 04:23:42
怎不让Text控件弹出右键菜单
...全文
39 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
苏门答腊 2003-12-18
to longki(代码狂人)

写程序不是靠想象的,你试试就知道了

你认为不复杂的原因是因为你水平不高
你认为复杂的原因还是因为你水平不高
回复
liyan010 2003-12-17
To longki(代码狂人):

哈哈,你这招也管用,不过有点偷工减料~

不是楼主的原意哦
回复
longki 2003-12-17

没那么复杂吧!不就是在text控件的MouseDown或MouseUp事件中加入:
if button=2 then
PopupMenu mnuMyMenu '其中mnuMyMenu是事先在menu控件中存在的菜单
endif
这不就OK了,真搞不懂All of you!
回复
maskzha 2003-12-17
把 SoHo_Andy(冰) 前面改一下啊:
Option Explicit
Private Sub Form_Load()
Call Hook(Text1.hWnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnHook
End Sub

改为

Private Sub Text1_OnMouseIn(......)
Call Hook(Text1.hWnd)
End Sub

Private Sub Text1_OnMouseOut(......)
Call UnHook
End Sub

可能是这两个事件。机器上没VB,没有试!^_^!
回复
wully 2003-12-17
算我没说
回复
wully 2003-12-17
button=2的时候把它变一个值就行了,或者设为button=1,变成左键,要不就=3
回复
laozhaoskinny 2003-12-17
帮你UP一下
回复
986753421 2003-12-17
下面的方法可以简单实现屏蔽系统菜单,但要有一个自己定义的菜单;
如果连自己的菜单也不弹出,我就不知道怎么办啦,替你关注。
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
Text1.Enabled = False
Text1.Enabled = True
Me.PopupMenu menuNone'自定义菜单

End If
End Sub
回复
jjwwsb 2003-12-17
我来解释一下上面的程序
把WINDOWS操作系统看作人的大脑,它接收、处理、并发送各种各样的信息给我们的各个应用程序,也就是说它是消息的中枢。而每个应用程序(甚至每一个按钮、标签、窗体等等统称为窗口)在运行时都会被分配一个窗口过程WINDOWPROC,由这个窗口过程来接收和处理操作系统发来的消息(实际上存在一个消息队列),通常情况下这个窗口过程是由操作系统指定的,它会自动的响应并处理一些WINDOWS消息(如窗体移动、最大化、最小化、错误信息等),但也可由我们自己编写这个消息处理程序,不过还得借助API函数的威力了,怎么用?我们还是先看看这些API函数的定义和参数吧。

  程序中用到了CallWindowProc、SetWindowLong两个API函数,其中CallWindowProc函数用来发送消息到一个指定的窗口过程;而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。使用API函数之前必须先在程序中声明如下:
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

 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'其中各参数的意义如下表:

'CallWindowProc函数参数意义
'lpPrevWndFunc Long,原来的窗口过程地址
'HWnd Long,窗口句柄
'Msg Long,发送的消息
'wParam Long,消息类型,参考wParam参数表
'lParam Long,依据wParam参数的不同而不同
'  返回值 Long,依据发送的消息不同而变化

'SetWindowLong函数参数意义
'hwnd Long,欲为其取得信息的窗口的句柄
'nIndex Long,请参考GetWindowLong函数的nIndex参数的说明 ,其值如下:
'GWL_EXSTYLE 得到扩展窗口风格
'GWL_STYLE 得到窗口风格
'GWL_WNDPROC 得到窗口过程的地址, 或指向一个窗口过程地址的句柄. 必须用 CallWindowProc 函数来调用这个窗口过程
'GWL_HINSTANCE 得到应用程序的实例句柄.
'GWL_HWNDPARENT 得到父窗口的句柄.
'GWL_ID 得到窗口标志.
'GWL_USERDATA 得到与该窗口有关的一个32位值. 每个窗口都有一个32位值来给创建这个窗口的应用程序使用。
'当hWnd指向一个对话框时,hIndex还可取下列值
'DWL_DLGPROC 得到对话框过程的地址, 或指向一个对话框过程地址的句柄. 必须用 CallWindowProc 函数来调用这个窗口过程
'DWL_MSGRESULT 得到在对话框中一个信息的处理结果的值
'DWL_USER 得到应用程序一个额外的私有信息, 如句柄或指针.
'dwNewLong Long,由nIndex指定的窗口信息的新值
'返回值 Long,指定数据的前一个值

'我们要自己写程序来处理消息,必须先更改窗口的属性,从原来由默认的窗口过程来处理
'消息变成由我们自己写的消息处理过程来处理消息。方法是使用SetWindowLong函数来
'取得默认窗口过程的地址,然后转向为我们自己写的窗口过程的地址,具体的实现方法如下代码:
'注释:GWL_WNDPROC常量的含义见上面的参数SetWindowLong介绍,AddressOf是取址函数,
WindowProc是我们写的过程
lpPrevWndProc = SetWindowLong(lngHWnd, GWL_WNDPROC, AddressOf WindowProc)lpPrevWndProc就是有系统指定的原消息处理函数的地址
下面看一看自己编写的消息处理函数的定义,注意,这个定义是固定的
WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal _
lParam As Long) As Long
该函数的4个参数都在使用SetWindowLong函数时由系统自动获得,不需自己指定,其中
hw为窗口的句柄,uMsg为系统发送来的消息,它的值为WM_RBUTTONUP时代表该消息为鼠标右键弹起,wParam和lParam的含义由uMsg消息来决定。
明白了吗?
回复
landongfang 2003-12-17
Option Explicit
Public OldWindowProc As Long
'保存默认的窗口函数的地址
Public Const WM_CONTEXTMENU = &H7B
'当右击文本框时,产生这条消息
Public Const GWL_WNDPROC = (-4)
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
Public 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 MyMesg(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As Long
If Msg <> WM_CONTEXTMENU Then
MyMesg = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)
'如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理
Exit Function
End If
MyMesg = True
End Function



Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Exit Sub
OldWindowProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
'取得窗口函数的地址
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf MyMesg)
'用MyMesg代替窗口函数处理消息
End Sub

Private 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, OldWindowProc)
'恢复窗口的默认函数
'弹出自定义菜单
End Sub



回复
jhzhou882 2003-12-17
冰哥哥
你的代码是不是有点小问题?
人家要的是在TEXT里不能又右键
你怎么把右键整个屏蔽了?
回复
SoHo_Andy 2003-12-17
'禁止TextBox右键
'Form1代码:

Option Explicit
Private Sub Form_Load()
Call Hook(Text1.hWnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnHook
End Sub

'Model1代码:

Public 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 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = -4
Public Const WM_RBUTTONUP = &H205
Public lpPrevWndProc As Long
Private lngHWnd As Long

Public Sub Hook(hWnd As Long)
lngHWnd = hWnd
lpPrevWndProc = SetWindowLong(lngHWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnHook()
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(lngHWnd, GWL_WNDPROC, lpPrevWndProc)
End Sub

Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal _
lParam As Long) As Long
Select Case uMsg
'检测鼠标击键消息,如果是单击右键
Case WM_RBUTTONUP
' MsgBox "right button clicked."
Case WM_CUT, WM_COPY, WM_PASTE

Exit Function
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
回复
发动态
发帖子
VB基础类
创建于2007-09-28

7451

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告