Контекстное меню (КМ)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Контекстное меню (КМ)

Сообщение Space » 12.05.2009 (Вт) 23:58

Form1.BorderStyle=0. Создаю на форме КМ, форма получает заголовок. Почему и как избавиться от заголовка?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Контекстное меню (КМ)

Сообщение iGrok » 13.05.2009 (Ср) 0:07

Space писал(а):Form1.BorderStyle=0. Создаю на форме КМ, форма получает заголовок. Почему и как избавиться от заголовка?

Первое, что приходит в голову - сделать меню на API. (CreateMenu, AppendMenu, TrackPopupMenu ...)

Второе, что приходит в голову - сделать км на другой форме, а показывать на этой.

Почему - потому, что окно получает стили WS_CAPTION | WS_SYSMENU и WS_EX_WINDOWEDGE.
Почему оно их получает.. Ну, считай это глюком или недоработкой VB6.
label:
cli
jmp label

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Контекстное меню (КМ)

Сообщение arvitaly » 13.05.2009 (Ср) 0:13

Мне кажется все проще, попробуй очистить поле Form1.caption

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Контекстное меню (КМ)

Сообщение iGrok » 13.05.2009 (Ср) 0:16

arvitaly писал(а):Мне кажется все проще, попробуй очистить поле Form1.caption

Пробовал? Думаю, нет. :wink:
label:
cli
jmp label

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Контекстное меню (КМ)

Сообщение arvitaly » 13.05.2009 (Ср) 0:24

Пробовал :bom: Заголовок будет всегда, если caption имеет не пустое значение

Ну по крайней мере без задания стилей, возможно какой-нибудь и есть, но зачем?
Последний раз редактировалось arvitaly 13.05.2009 (Ср) 0:25, всего редактировалось 1 раз.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 0:25

Я не знаю как контекстное меню может повлиять на заголовок окна, и какие там "глюки" в VB6. КМ созданное на Win32API работает как надо. Зачем окно может получать стили WS_CAPTION | WS_SYSMENU и WS_EX_WINDOWEDGE, при создании КМ, ума не приложу.

UPD: Зачем что-то выдумывать, когда верное предложение уже было дано? Создавайте меню сами.
Последний раз редактировалось Xcode 13.05.2009 (Ср) 0:27, всего редактировалось 1 раз.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Контекстное меню (КМ)

Сообщение iGrok » 13.05.2009 (Ср) 0:27

2Xcode:
Та же фигня. Не понимаю.
Впрочем, как реализуется контекстное меню средствами "чистого" VB?
Делается пункт-пустышка, в котором будет попап, делается само попап-меню, у пустышки снимается галка Visible.
Видимо, при наличии меню на форме, VB автоматом добавляет стиль SYSMENU, а с ним и всё остальное. Совершенно не обращая при этом внимания не тот факт, что меню скрыто...

arvitaly писал(а):Пробовал :bom: Заголовок будет всегда, если caption имеет не пустое значение

Лови опровержение. :wink:
Вложения
pt.rar
(1 Кб) Скачиваний: 65
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Контекстное меню (КМ)

Сообщение Space » 13.05.2009 (Ср) 0:39

вариант через показ КМ с другой формы не проходит, выдаёт ошибку
Вложения
frmMnu.zip
(1.43 Кб) Скачиваний: 70

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Контекстное меню (КМ)

Сообщение arvitaly » 13.05.2009 (Ср) 0:44

Me.PopupMenu frmMnu.mnuFrmMain

Рабочий вариант с другой формой, но непонятно для чего он тебе
Лови опровержение. :wink:

Согласен. Значит условие выполняется только для меню. Хотя было что-то еще, не могу вспомнить (давно сталкивался)
Последний раз редактировалось arvitaly 13.05.2009 (Ср) 0:46, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Контекстное меню (КМ)

Сообщение Хакер » 13.05.2009 (Ср) 0:45

Space, ты понимаешь, что ты пишешь? Вдумайся ещё раз в смысл той строчки кода, на которой возникает ошибка. И откажись от Goto.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 0:56

Вся проблема, как оказалось, была упомянута еще в первом посте. Автор, ты создаешь не контекстное меню, но называешь его контекстным, отсюда и проблемы.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Контекстное меню (КМ)

Сообщение Space » 13.05.2009 (Ср) 1:01

если ты имеешь ввиду флаг Visible для КМ, то снятие его не решает проблему. Хакер, я уже в таком состоянии, что ничё не понимаю :) Всё, кажись работает :) Спасибо.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Контекстное меню (КМ)

Сообщение arvitaly » 13.05.2009 (Ср) 1:05

Я тебе уже написал как решить проблему. И не нужно никаких 2-х форм

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 1:09

Space, у контекстного меню нет флага Visible.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Контекстное меню (КМ)

Сообщение Space » 13.05.2009 (Ср) 1:21

флаг Visible есть в меню верхнего уровня, снятие которого означает КМ.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 1:25

Не знаю где ты это вычитал, установка свойства Visible в False не делает из него КМ.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Контекстное меню (КМ)

Сообщение Space » 13.05.2009 (Ср) 1:39

ну и ладно. У меня делает :)

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Контекстное меню (КМ)

Сообщение arvitaly » 13.05.2009 (Ср) 1:42

Правильно, оно становится контекстным при вызове метода popup.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 9:51

Неправильно, оно не становиться контекстным. Встроенный в VB6 Menu Editor, насколько мне известно, не позволяет создавать Popup меню вообще, свойство Visible пунктов меню служит для установки видимости этих пунктов.
Контекстное меню можно создать при помощи Win32 API функций CreatePopupMenu и AppendMenu, и отобразить при помощи TrackPopupMenu, желательно в обработчике сообщения WM_CONTEXTMENU.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Контекстное меню (КМ)

Сообщение arvitaly » 13.05.2009 (Ср) 10:41

Xcode,

На и больше не шути так
Вложения
popup.rar
(3.64 Кб) Скачиваний: 75

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 11:16

И где же я пошутил? Этот пример нисколько не доказывает что твое созданное при помощи Menu Editor "несуществующее"(бред, скрыв меню с помощью установки свойства Visible=False, считать его несуществующим) является Popup.
Все ключевые моменты уже были сказаны в первом же ответе. При создании меню при помощи Menu Editor происходит установка стиля WS_SYSMENU, что однозначно указыват на то, что это никак не контекстное меню, хотя в некоторых случаях этим меню можно воспользоваться при создании своего КМ. Строчка кода Me.PopupMenu Me.mnuPopup не делает меню, созданное при помощи Menu Editor, Popup меню.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Контекстное меню (КМ)

Сообщение arvitaly » 13.05.2009 (Ср) 11:26

что однозначно указыват на то, что это никак не контекстное меню

хотя в некоторых случаях этим меню можно воспользоваться при создании своего КМ.


Мне почему-то видится в этих словах противоречие. Тебе не нравится название?
в графическом интерфейсе пользователя — меню, открываемое как правило при нажатии второй[1] кнопки указательного устройства ввода.

Мне кажется, от того какие там устанавливаются стили и вообще каким способом это достигнуто(хорошим или плохим) - определение контекстного меню не изменится.
В моем примере, исходя из определения, именно контекстное меню.
Этот пример нисколько не доказывает что твое созданное при помощи Menu Editor "несуществующее"

Что-то не помню, чтобы я где-то писал что оно "несуществующее"!

И еще, раз ты так хорошо разбираешься в классификации меню, может напишешь чем отличает контекстное меню от неконтекстного

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Контекстное меню (КМ)

Сообщение iGrok » 13.05.2009 (Ср) 12:11

Xcode:
А чем, вообще говоря, popup menu отличается от просто menu?
Если справочник по Win32API не врёт, то Menu - это верхний уровень (строка), а popup menu - это всё остальное (все выпадающие). А такого понятия, как Context Menu в Win32 не существует в принципе. Это уже, скажем так, "понятие уровня логики приложения". Так что тут ты "несколько" не прав. :wink:

Другое дело, что средствами VB НЕЛЬЗЯ создать popup menu отдельно от строки меню. В любом случае, строка создаётся. Но не отображается, т.к. там невидимый пункт. Со всеми вытекающими.
label:
cli
jmp label

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 15:04

Интересная получилась тема. :) Покопавшись в интернете, я несколько изменил свое мнение. Давайте все-таки попробуем окончательно разобраться.
1. Контекст в переводе означает связь, соединение.
2. Popup меню — все те меню, которые всплывают.
3. Строка меню, она же menu bar содержит перечень Popup меню.

Отсюда я сделал следующие выводы:
Контекстное меню — (дословно)меню, которое к чему-то привязанно, соединено. Этот термин применяется для обозначения меню, привязанных к отдельным объектам(полям ввода текста, и т.п.) для отображения списка команд предоставляемых объектом. Можно ли назвать те меню, которые находятся в строке меню контекстными? И да и нет. С одной стороны эти меню связанны со строкой меню, но из этого вытекает, что эти меню должны иметь список команд, предоставляемых строкой меню, но это не так. Контекстное меню можно вызвать нажатием клавиши "menu" на клавиатуре(при этом посылается сообщение WM_CONTEXTMENU), и я не разу не встречал программ, в которых по нажатию этой клавиши открывалось бы меню, привязанное к строке меню. Поэтому я придержусь мнениия что меню, находящиеся в строке меню, контекстными не являются.
arvitaly писал(а):Что-то не помню, чтобы я где-то писал что оно "несуществующее"!

Это было написанно в заголовке окна программы из предоставленного тобой архива "popup.rar":
Пример несуществующего меню


Давайте вернемся к проблеме, вы упорно не хотите смотреть в ее корень. Menu Editor создает строку меню со всеми вытекающими для вас проблемами. Зачем вам понадобилась строка меню? Вам нужно было контекстное меню. Так и создавайте сразу контекстное.

Подытожим: для создания контекстного меню, откажитесь от использования строки меню, а делайте это с помощью Win32 API, и желательно делайте его вызов в обработчике сообщения WM_CONTEXTMENU.

Всем большое спасибо за спор, в спорах меняются мнения и рождается истина :thumright:
Жду ваших замечаний :)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Контекстное меню (КМ)

Сообщение iGrok » 13.05.2009 (Ср) 17:15

Всё классно. Замечательно исследование. Мои поздравления. Только нафига?

Всё как было, так и остаётся - те, кому не влом заморачиваться с сабклассингом, CreatePopupMenu/AppendMenu/TrackPopupMenu и пр. - делают так. Те, кто не знает, как это делается, или не хочет заморачиваться - делают через подменю скрытого пункта в строке.
Те, кому при этом нужно скрыть заголовок формы - либо учатся работать с API, либо суют меню во вторую форму.

А вот за момент насчёт WM_CONTEXTMENU - спасибо. Это на будущее учту. :)

Но надо заметить, что я встречал программы, в которых по клавише "меню" открвалось меню, находящееся в строке. Естественно, открывалось оно как popup, а не прямо из строки.
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Контекстное меню (КМ)

Сообщение arthur2 » 13.05.2009 (Ср) 17:32

Чтобы и с субклассингом не заморачиваться, и контекстное меню было не только по мыши, но и по клавише, нужно просто в _KeyUp добавить
If KeyCode = 93 Then + тот же код, что и в _MouseUp

И не будет ни каких отличий от обработки WM_CONTEXTMENU
Артур
 
   

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 17:37

iGrok писал(а): Только нафига?

Как минимум для себя. А кто как будет делать дальше — это уже их дело. Зато прочитав этот топик будут знать чего следует ожидать/остерегаться и как преодолеть проблемы.
Я пытался доказать что использовать строку меню, в качестве контейнера для контекстных меню немного неправильно, хотя в некоторых случаях этим и можно воспользоваться.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Контекстное меню (КМ)

Сообщение iGrok » 13.05.2009 (Ср) 17:49

arthur2 писал(а):Чтобы и с субклассингом не заморачиваться...

Сабклассинг - это про обработку WM_COMMAND от меню, созданного при помощи CreatePopupMenu.

Xcode писал(а):Я пытался доказать что использовать строку меню, в качестве контейнера для контекстных меню немного неправильно...

Гм. Ну, правильно оно, или не правильно, но насколько я понимаю, разработчики VB6(да и все остальные) предлагают именно этот способ для создания контекстных меню в VB6.
http://msdn.microsoft.com/ru-ru/library/62aawczc.aspx
http://www.codeguru.com/columns/vb/article.php/c6541
label:
cli
jmp label

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Контекстное меню (КМ)

Сообщение Xcode » 13.05.2009 (Ср) 18:09

iGrok писал(а):Гм. Ну, правильно оно, или не правильно, но насколько я понимаю, разработчики VB6(да и все остальные) предлагают именно этот способ для создания контекстных меню в VB6. m http://msdn.microsoft.com/ru-ru/library/62aawczc.aspx m m http://www.codeguru.com/columns/vb/article.php/c6541

В MSDN всего-навсего написанно что это так делать можно, никто не говорил что нельзя. А остальные, ну хорошо, пусть предлагают, а мы будем знать что у этого способа есть свои недостатки.

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Контекстное меню (КМ)

Сообщение Alec » 13.05.2009 (Ср) 19:57

iGrok писал(а):Почему - потому, что окно получает стили WS_CAPTION | WS_SYSMENU и WS_EX_WINDOWEDGE.

А кто мешает эти стили убрать при загрузке?
PS. WS_EX_WINDOWEDGE у меня не получает.
Иногда лучше вовремя остановиться...
И начать заново!

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 59

    TopList  
cron