怎样屏蔽text框的系统右键菜单?  因为我用mouse _down弹出我的菜单时老是先出现系统默认的菜单后再点一下才出我想要的菜单.--------------在线等

解决方案 »

  1.   

    屏蔽TextBox的系统菜单 
         TextBox是最常用的控件之一,很多时候我们需要处理在其上的右键处理.而系统默认有右键菜单, 因此很多时候影响程序的美观.其实,我们可以将系统的右键菜单屏蔽掉.屏蔽TextBox右键菜单的 方法有很多,下面主要介绍常用的两种方法:方法一:投机取巧法;
    本方法实现起来十分简单,在某些场合下使用起来很方便;不足是有些场合下不适用.
    >>步骤1----建立新工程,在窗体上放置一个TextBox;
    >>步骤2----在窗体上创建一菜单,设其Name = a;Visible = false;
    >>步骤3----编写如下代码:
    Private Sub Text1_MouseDown(Button As Integer, Shift _
        As Integer, X As Single, Y As Single)
        If Button = vbRightButton Then
            Text1.Enabled = False
            Text1.Enabled = True
            PopupMenu a
        End If
    End Sub>>步骤4----编译运行,在TextBox中按下鼠标右键,看看,系统菜单不见了,弹出的只是你自己定义的菜单. 简单吧!
    方法二:截获系统消息法.
    本方法实现起来相对来说,麻烦些,不过,应该说这种方法放之四海而皆适用.
    首先取得系统函数的地址,并保存,然后用自定义的函数代替系统函数,最后恢复系统函数,弹出自定义菜单.
    请看下面的代码:
    >>步骤1----建立新工程,在窗体上放置一个TextBox; >>步骤2----在窗体上创建一菜单;设其Name = a;Visible = false;
    >>步骤3----添加以模块,加入如下代码: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>>步骤4----在窗体中加入如下代码:
    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)
        ' 恢复窗口的默认函数
        PopupMenu a
        ' 弹出自定义菜单
    End Sub>>步骤5----编译运行,系统菜单不见了,弹出自定义菜单.'---------以下代码放到模块中(.BAS)-----------------------------
    Private 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
    Private Const GWL_WNDPROC = (-4)
    Private Const WM_RBUTTONDOWN = &H204Private m_lpPrevDisableRButtonDownWindowProc As LongFunction DisableRButtonDownWindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If uMsg = WM_RBUTTONDOWN Then
            Exit Function
        End If
       DisableRButtonDownWindowProc = CallWindowProc(m_lpPrevDisableRButtonDownWindowProc, hwnd, uMsg, wParam, lParam)
    End FunctionPublic Function HookText(ByVal hwnd As Long) As Boolean
         m_lpPrevDisableRButtonDownWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf DisableRButtonDownWindowProc)
    End FunctionPublic Function UnHookText(ByVal hwnd As Long) As Boolean
        Call SetWindowLong(hwnd, GWL_WNDPROC, m_lpPrevDisableRButtonDownWindowProc)
    End Function
    '----------------------------------------------------
    '测试代码:
    Private Sub Form_Load()
        HookText Text1.hwnd
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        UnHookText Text1.hwnd
    End Sub'------------以上代码测试通过----------------------