powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как четко отловить нажатие правой кнопки мыши на API-ребар и API-тулбар
4 сообщений из 4, страница 1 из 1
Как четко отловить нажатие правой кнопки мыши на API-ребар и API-тулбар
    #38224763
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно вызвать контекстное меню настройки панелей (VB меню через popup) правой кнопкой мыши.

Два случая, которыми я "злоупотребляю".

1. API-ребар, на нем API-тулбар, где кончается тулбар ХЗ, я это не отслеживаю
2. API-ребар, в нем один band с неопределенным wID, т.е. просто за ради написать на банде заголовочный текст, где кончается band в произвольном случае также ХЗ.

В общем чего надо ловить (и где, и от кого, предполагаю в me.hwnd), чтоб при нажатии на любую область этого хозяйства, хоть на кнопку, хоть на пустое место (toolbar, band, просто пусто) но ПРАВОЙ кнопкой вызывалось меню?

Пока нарыл (но не испытывал)
NM_RCLICK (toolbar)
NM_NCHITTEST (rebar) -но неясно где там правая кнопка мыши ?
...
Рейтинг: 0 / 0
Как четко отловить нажатие правой кнопки мыши на API-ребар и API-тулбар
    #38224782
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вроде вот так(код ниже) гарантированно (если сабклассить родителя ребара).
NM_RELEASEDCAPTURE немного смущает, потому как по описанию
NM_RELEASEDCAPTURE (rebar) notification code
Notifies a rebar control's parent window that the control is releasing mouse capture.
Но срабатывает только при mouse_up ПРАВОЙ клавиши мыши (вроде).
Для:
>1. API-ребар, на нем API-тулбар, где кончается тулбар ХЗ, я это не отслеживаю
NM_RCLICK вроде достаточно (тулбар у меня вроде как на весь ребар всегда),

а вот для
>2. API-ребар, в нем один band с неопределенным wID, т.е. просто за ради написать на банде заголовочный текст, где кончается band в произвольном случае также ХЗ.
ничего лучше NM_RELEASEDCAPTURE я не придумал,
если только не сабклассить сам контрол на предмет Mouse_Up, чего делать чего-то не очень хочется.


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
Private Type NMHDR
  hwndFrom As Long   ' Window handle of control sending message
  idFrom As Long     ' Identifier of control sending message
  code  As Long      ' Specifies the notification code
End Type

Private Type NMMOUSE
   hdr As NMHDR
   dwItemSpec As Long
   dwItemData As Long
   pt As POINTAPI
   dwHitInfo As Long '// any specifics about where on the item or control the mouse is
End Type

Private Const WM_NOTIFY As Long = &H4E&

Private Const H_MAX As Long = &HFFFF + 1
Private Const NM_FIRST = H_MAX               '(0U-  0U)       // generic to all
Private Const NM_RCLICK = (NM_FIRST - 5)
Private Const NM_RELEASEDCAPTURE = (NM_FIRST - 16)


Public Function NewFormMeWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
  Dim uNMMOUSE  As NMMOUSE
 
  Select Case Msg
    Case WM_NOTIFY
      Call CopyMemory(uNMMOUSE, ByVal lParam, Len(uNMMOUSE))
      If uNMMOUSE.hdr.hwndFrom = g_hwndToolBar Then
        Select Case uNMMOUSE.hdr.code
          Case NM_RCLICK
            Debug.Print "NM_RCLICK(toolbar)"
            Form1.PopupMenu Form1.file
          Case Else
        End Select
      ElseIf uNMMOUSE.hdr.hwndFrom = g_hwndRebar Then
        Select Case uNMMOUSE.hdr.code
          Case NM_RELEASEDCAPTURE
            Debug.Print "NM_RELEASEDCAPTURE(rebar)"
            Form1.PopupMenu Form1.file
          Case Else
        End Select
      End If
    Case Else
  End Select

  NewFormMeWindowProc = CallWindowProc( _
   OldFormMeWindowProc, hwnd, Msg, wParam, _
   lParam)
End Function
...
Рейтинг: 0 / 0
Как четко отловить нажатие правой кнопки мыши на API-ребар и API-тулбар
    #38224832
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понимаю, что в данном случае достаточно копировать в
Dim uNMHDR As NMHDR,
не вникая в подробности
Dim uNMMOUSE As NMMOUSE ?

Т.е. вот такой код вместо предыдущего:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Public Function NewFormMeWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

  Dim uNMHDR As NMHDR

  Select Case Msg
    Case WM_NOTIFY
      Call CopyMemory(uNMHDR, ByVal lParam, Len(uNMHDR))
      If uNMHDR.hwndFrom = g_hwndToolBar Then
        Select Case uNMHDR.code
          Case NM_RCLICK
            Debug.Print "NM_RCLICK(toolbar)"
            Form1.PopupMenu Form1.file
          Case Else
        End Select
      ElseIf uNMHDR.hwndFrom = g_hwndRebar Then
        Select Case uNMHDR.code
          Case NM_RELEASEDCAPTURE
            Debug.Print "NM_RELEASEDCAPTURE(rebar)"
            Form1.PopupMenu Form1.file
          Case Else
        End Select
      End If
    Case Else
  End Select

  NewFormMeWindowProc = CallWindowProc( _
   OldFormMeWindowProc, hwnd, Msg, wParam, _
   lParam)
End Function



А спрашиваю потому, что у меня в реальном приложении в той же ф-ции ловится еще:
LVN_ITEMCHANGED
TBN_HOTITEMCHANGE
TTN_GETDISPINFO

и везде первая часть структуры
NMHDR
а подробности NMMOUSE
мне как бы и не нужны.

И здесь еще академический вопрос.
Если я сразу делаю как в коде выше:
Код: vbnet
1.
2.
    Case WM_NOTIFY
      Call CopyMemory(uNMMOUSE, ByVal lParam, Len(uNMMOUSE))


-до выяснения
uNMMOUSE.hdr.code
Не рискую ли я нарваться на "ошибку памяти" с вылетом приложения, если длина реальной начинки короче длины uNMMOUSE?
По сути ведь копирую лишнюю память.

По идее ведь сначала надо копировать в NMHDR
Потом выяснять hdr.code (и желательно .hwndFrom)
и только потом в зависимости от результата копировать в расширенную структуру, если это вообще надо
Так?
Или можно забивать и копировать все подряд в то, что ожидается в требуемом Msg?
...
Рейтинг: 0 / 0
Как четко отловить нажатие правой кнопки мыши на API-ребар и API-тулбар
    #38224887
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77NM_RELEASEDCAPTURE немного смущает, потому как по описанию
NM_RELEASEDCAPTURE (rebar) notification code
Notifies a rebar control's parent window that the control is releasing mouse capture.
Но срабатывает только при mouse_up ПРАВОЙ клавиши мыши (вроде).
Если банд со стилем
Or RBBS_GRIPPERALWAYS
то срабатывает и на левую кнопку мыши.
Поэтому с ребаром думаю правильно все-таки ловить отжатие правой клавиши мыши в самом ребаре:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Function NewRebarWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Select Case Msg
    Case WM_RBUTTONUP
      Debug.Print "WM_RBUTTONUP(rebar)"
      Form1.PopupMenu Form1.file
    Case Else
  End Select
  NewRebarWindowProc = CallWindowProc( _
   OldRebarWindowProc, hwnd, Msg, wParam, _
   lParam)
End Function
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как четко отловить нажатие правой кнопки мыши на API-ребар и API-тулбар
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]