Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши? / 7 сообщений из 7, страница 1 из 1
18.10.2013, 04:22
    #38432192
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши?
ContextMenu (не стрип)
А как сделать чтоб итемы в меню нажимались только левой кнопкой мыши?
Или это мода сейчас такая - и левой и правой?
Может я туплю, в разных программах по разному, но я хочу чтоб только левой.
Опять через API лечить?

И сюда же вопрос.
Код: vbnet
1.
 ListView1.ContextMenu = menu_Edit

Я например хочу чтоб контекстное меню выводилось только там где есть итемы-сабитемы, а на "белом поле" не выводилось.
Через popup (подменю MainMenu) этот вопрос решается на этапе MouseUp через HitTest.
А здесь как?

Да, еще.
Оно куда Msg-ы шлет? Я так понял в тот контрол, для кот. является контекстным. Сабклассинг ListView1 показывает что вроде так. Так?

Чет у меня нет уверенности что Context дает какие-то удобства по сравнению с popup(подменю MainMenu) -как в VB6
...
Рейтинг: 0 / 0
18.10.2013, 05:12
    #38432196
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши?
Дмитрий77как сделать чтоб итемы в меню нажимались только левой кнопкой мыши?
Или это мода сейчас такая - и левой и правой?
Может я туплю, в разных программах по разному, но я хочу чтоб только левой.
Не надо чинить, то что не сломано. Оставь поведение по умолчанию.

Дмитрий77Я например хочу чтоб контекстное меню выводилось только там где есть итемы-сабитемы, а на "белом поле" не выводилось.
Через popup (подменю MainMenu) этот вопрос решается на этапе MouseUp через HitTest.
А здесь как?
Замени ContextMenu на ContextMenuStrip. Там есть событие Opening. В нем и делаешь проверяешь с помощью HitTest или GetItemAt
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub ContextMenuStrip1_Opening(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
	Dim lstView As ListView = CType(CType(sender, ContextMenuStrip).SourceControl, ListView)
	Dim mousePosition As Point = ContextMenuStrip.MousePosition
	If (lstView.HitTest(mousePosition).Location <> ListViewHitTestLocations.??? Then
	'If lstView.GetItemAt() Then
		e.Cancel = True
	End If
End Sub

...
Рейтинг: 0 / 0
18.10.2013, 05:55
    #38432206
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши?
bazile,

Мне всегда казалось что по умолчанию это когда на правую кнопку мыши не реагирует.
Сейчас я засомневался.
У Microsoft в части приложений только левой, а в части - обеими.


>Замени ContextMenu на ContextMenuStrip.
Мне стрип не нужен.
Это по другому делается.
14857362
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As IntPtr,
   ByVal uFlags As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nReserved As Integer, _
   ByVal hwnd As IntPtr, Optional ByRef prcRect As RECT = Nothing) As Boolean

  Private Sub ToolBar1_MouseUp(ByVal sender As Object,
   ByVal e As System.Windows.Forms.MouseEventArgs) Handles ToolBar1.MouseUp
    If e.Button = MouseButtons.Right Then TrackPopupMenu(menu_Edit.Handle, 0,
     Control.MousePosition.X, Control.MousePosition.Y, 0, Me.Handle)
  End Sub


Я хочу сказать что в main menu "только левой".
А выводить submenu от main в качестве context через popup -это стандартный прием.
И тогда будет "только левой".

Счас пытаюсь найти от чего это зависит (в "настоящих" документациях):
Menus
Но что-то не нашел пока.
...
Рейтинг: 0 / 0
18.10.2013, 05:58
    #38432207
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши?
Дмитрий77,

если сделать что то подобное помодет?
Код: c#
1.
2.
3.
4.
5.
protected override void OnMouseClick(MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left) base.OnMouseClick(e);
            else DontFocus;
        }


сорри, но VB не владею
...
Рейтинг: 0 / 0
18.10.2013, 06:06
    #38432208
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши?
А, вот и ответ нашелся (кажется):

TrackPopupMenu function

TrackPopupMenuuFlags [in]
Type: UINT

Use zero of more of these flags to specify function options.

Use one of the following flags to specify which mouse button the shortcut menu tracks.

Value Meaning
TPM_LEFTBUTTON
0x0000L The user can select menu items with only the left mouse button .

TPM_RIGHTBUTTON
0x0002L The user can select menu items with both the left and right mouse buttons.

Вопрос только как это увязать с Net-реализацией ContextMenu.
Возможно никак, потому что это не стиль, а параметр ф-ции.

Если только... не забить на вот это

Код: vbnet
1.
ListView1.ContextMenu = menu_Edit



и не использовать ф-цию в лоб.
...
Рейтинг: 0 / 0
18.10.2013, 06:38
    #38432213
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши?
Вот оно, ДЕФОЛТНОЕ поведение (uFlags=0), даже никаких констант не понадобилось.
"Только левая кнопка". А правая в этом случае генерирует WM_MENURBUTTONUP вместо WM_COMMAND.

Это все фантазии .Net -художников -забабахать &H2 и не оставить пользователю возможности маневра.
Я вообще не понимаю удобство этого Context.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  <StructLayout(LayoutKind.Sequential)>
  Private Structure RECT
    Dim Left As Integer
    Dim Top As Integer
    Dim Right As Integer
    Dim Bottom As Integer
  End Structure

  Private Const TPM_LEFTBUTTON = &H0
  Private Const TPM_RIGHTBUTTON = &H2

  Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As IntPtr,
   ByVal uFlags As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nReserved As Integer, _
   ByVal hwnd As IntPtr, Optional ByRef prcRect As RECT = Nothing) As Boolean
  
  Private Sub ListView1_MouseUp(ByVal sender As Object,
   ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseUp
    If e.Button = MouseButtons.Right Then TrackPopupMenu(ContextMenu1.Handle, 0,
         Control.MousePosition.X, Control.MousePosition.Y, 0, ListView1.Handle)
  End Sub

Проверяйте.


Дмитрий77Я например хочу чтоб контекстное меню выводилось только там где есть итемы-сабитемы, а на "белом поле" не выводилось.
Через popup (подменю MainMenu) этот вопрос решается на этапе MouseUp через HitTest.Соответственно решается проверкой в ListView1_MouseUp перед вызовом TrackPopupMenu
...
Рейтинг: 0 / 0
18.10.2013, 06:41
    #38432215
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши?
твою энергию бы в мирных целях...
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Элемент ContextMenu (не стрип) - а почему итемы нажимаются правой кнопкой мыши? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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