Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Вызов меню правой кнопкой мыши


Автор: ArtNeoX 8.3.2006, 12:55
На форме TextBox. Поместив в него указатель мышки нажимаем правую кнопку мышки открывается меню пользователя, выбираем в нем определенный пункт, щелкаем и в TextBox'е появляется определенный текст.
Как это сделать?

Автор: Exception 8.3.2006, 16:13
А что именно непонятно?

Автор: ArtNeoX 8.3.2006, 17:39
как добавить в меню по правой кнопке свои команды

Автор: Exception 8.3.2006, 17:45
Хм. А Вы документацию хоть раз читали? Нужно создать меню с Visible = False и повесить на клик команду PopupMenu имя_твоего_меню.

Автор: ArtNeoX 8.3.2006, 19:48
Это понятно. Вопрос то в другом. При щелчке по текст боксу правой кнопкой появляется свое меню там где выделить все, копировать, вырезать, вставить.... как убрать это меню и оставить свое.

Автор: Exception 8.3.2006, 20:09
Ох. Это гораздо сложнее. Тут без API никак.

Автор: Тутанхамец 9.3.2006, 08:40
Код

Private Declare Function LockWindowUpdate Lib "User32" (ByVal hwndLock As Long) As Long

Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbRightButton Then
LockWindowUpdate Text1.hWnd
Text1.Enabled = False
DoEvents
PopupMenu MyMenu
Text1.Enabled = True
LockWindowUpdate 0&
End If
End Sub



Чтоб по совести соблюсти копирайт, скажу, что взято отсюда: http://vbnet.ru/faq/showtopic.asp?id=286 smile

Автор: Тутанхамец 9.3.2006, 09:10
Или вот так, хотя первый вариант, наверное, попроще:

Код


'Form1

Option Explicit

' Textmenu sample by Matt Hart - [email protected]
' http://matthart.com
'
' This sample shows how to subclass a text box and replace its
' default right-click edit menu with one of your own.

Private Sub Form_Load()
    Call SetHook(Text1.hwnd, True)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call SetHook(Text1.hwnd, False)
End Sub

Private Sub mnuPrint_Click()
    MsgBox "Print!"
End Sub








'Module1.bas
' Textmenu sample by Matt Hart - [email protected]
' http://matthart.com

Option Explicit

Public Const GWL_WNDPROC = (-4)
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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 Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
      (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
    
Public Const WM_MOUSEACTIVATE = &H21
Public Const WM_RBUTTONDOWN = &H204

Public origWndProc As Long

Public Sub SetHook(hwnd, bSet As Boolean)
    If bSet Then
        origWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf AppWndProc)
    ElseIf origWndProc Then
        Dim lRet As Long
        lRet = SetWindowLong(hwnd, GWL_WNDPROC, origWndProc)
    End If
End Sub

Public Function AppWndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case Msg
        Case WM_MOUSEACTIVATE
            Dim C As Integer
            Call CopyMemory(C, ByVal VarPtr(lParam) + 2, 2)
            If C = WM_RBUTTONDOWN Then
                Form1.PopupMenu Form1.mnuBP
                SendKeys "{ESC}"
            End If
    End Select
    AppWndProc = CallWindowProc(origWndProc, hwnd, Msg, wParam, lParam)
End Function





Об копирайте некий Мэтт Харт сам позаботился. smile

P.S. У умных людей этот вариант называется "сабклассинг". smile

Автор: ArtNeoX 9.3.2006, 17:48
Первый вариант круче. smile

Автор: Exception 9.3.2006, 18:48
Тутанхамец, +1.
Ждём-с модераторов для добавления в FAQ - полезная инфа.

Автор: Тутанхамец 10.3.2006, 07:22
Цитата

Тутанхамец, +1.


Пасип smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)