Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Эксперт C
25491 / 15874 / 3398
Регистрация: 24.12.2010
Сообщений: 34,736
1

Исчезновение Popup-меню

29.09.2015, 12:52. Просмотров 2096. Ответов 37


При проходе мыши по некоторой области окна вызываю Popup-меню (пользуюсь WM_MOUSEMOVE).
Как сделать, чтобы при выходе мыши за пределы меню (и этой области, естественно) меню исчезало?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2015, 12:52
Ответы с готовыми решениями:

Добавить в Popup-меню Windows Explorer новый пункт
Собственно название темы и есть вопрос,хочу сделать дабы при клике правой кнопкой мыши на файле bmp...

Появление и исчезновение меню: исправить код
Сделал так, чтобы при скроллинге вниз менюшка красиво появлялась, а при скроллинге вверх - красиво...

Popup меню
Нашел в интернете код для работы с этим меню, все работает как надо, кроме одного. Мне нужно, чтобы...

popup меню в lotus
Подскажите пожалуйста. Мне необходимо в дизайнере в окне редактирования кода добавить свой строку в...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
37
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
29.09.2015, 13:19 2
Так можно:
C++
1
2
keybd_event(VK_ESCAPE, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_ESCAPE, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0);
1
Эксперт C
25491 / 15874 / 3398
Регистрация: 24.12.2010
Сообщений: 34,736
29.09.2015, 14:04  [ТС] 3
dmitry94, да, понял. Просто симулировать нажатие Esc
Но вот как найти этот момент? Опять же по WM_MOUSEMOVE, да? В данный момент просто нет возможности провести эксперимент.
0
565 / 194 / 70
Регистрация: 25.05.2012
Сообщений: 806
29.09.2015, 14:09 4
Цитата Сообщение от Байт Посмотреть сообщение
Опять же по WM_MOUSEMOVE, да?
Ну да, видимо так.

Желательно еще определять видно ли контекстное меню в данный момент. Тоже сильно интересует ответ на вопрос как это можно сделать.
0
Эксперт C
25491 / 15874 / 3398
Регистрация: 24.12.2010
Сообщений: 34,736
29.09.2015, 14:29  [ТС] 5
Цитата Сообщение от dmitry94 Посмотреть сообщение
Ну да, видимо так.
Не-а. Не получается. Видимо, дело в том, что фокус ввода находится в менюшке и окно никак не реагирует на WM_MOUSEMOVE.
Может быть ловить выход мыши за пределы менюшки? но как это делать конкретно?
0
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
29.09.2015, 17:24 6
Popup-меню отображается через TrackPopupMenu?
0
Эксперт C
25491 / 15874 / 3398
Регистрация: 24.12.2010
Сообщений: 34,736
29.09.2015, 18:36  [ТС] 7
Цитата Сообщение от castaway Посмотреть сообщение
Popup-меню отображается через TrackPopupMenu?
Да! И становится модальным. А вот как бы его сделать немодальным?
0
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
29.09.2015, 18:48 8
Т.е. мы знаем позицию меню и можем узнать его размер. Так же мы можем отслеживать позицию курсора. Т.е. мы можем узнать в какой момент курсор покидает область меню. Мм.. в чём проблема то? Или я что-то не понял?
0
Эксперт C
25491 / 15874 / 3398
Регистрация: 24.12.2010
Сообщений: 34,736
29.09.2015, 19:05  [ТС] 9
Цитата Сообщение от castaway Посмотреть сообщение
Мм.. в чём проблема то?
Как только меню появляется, окно (из которого меню было вызвано) не реагирует на WM_MOUSEMOVE. Просто сообщения с таким кодом не поступают окну.

Добавлено через 9 минут
А насчет модальности я не прав. Вот, меню вызвано, но окно реагирует на другие события (щелчок мыши, закрытие, изменение размера через системные кнопки. А вот изменить размер мышью (те ухватиться за край) не получается.
И любой ввод с клавы закрывает pop-меню.
0
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
29.09.2015, 19:15 10
Цитата Сообщение от Байт Посмотреть сообщение
И любой ввод с клавы закрывает pop-меню.
Так и ввод с мыши (нажатия) тоже должен скрывать меню.
Просто ради интереса, зачем это?
1
Эксперт C
25491 / 15874 / 3398
Регистрация: 24.12.2010
Сообщений: 34,736
29.09.2015, 19:22  [ТС] 11
Попытаюсь объяснить, чего это мне приспичило.
Заказчик хочет, чтобы какие-то действия выполнялись по одному щелчку. Но действий может быть несколько. Было предложено, чтобы в окне были какие-то чувствительные области, при щелчке на которые эти действия выполнялись. Но для каждого действия делать свою область со своей картинкой, ИМХО, не разумно. Пользователь очень быстро забудет смысл этих картинок и/или долго будет репу тереть, гадая, зачем же они. К тому же окно и так перегружено информацией.
Вот я и придумал такую штуку, сохраняющую "принцип одного щелчка". Ведет юзер мышку - вдруг выскакивает поп-меню. Ведет дальше - попа пропадает. И где-то я видел похожие механизмы. Например, при движении по тому же поп-меню иерархической структуры. Или при проходе мышки по панели инструментов (там, правда, только тикеты появляются)
Если есть какое-то другое решение - буду рад и благодарен.
ЗЫ. Заказчик и Юзер - совсем не одно лицо. Точнее, заказчик-то - одно лицо, а Юзеров - легион!
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
29.09.2015, 19:24 12
Опишите подробнее что и с какой целью вам требуется, а так же как именно вы делаете и отображаете окно Popup.

Добавлено через 1 минуту
опс... Первая часть отпала.
0
Байт
29.09.2015, 19:24  [ТС]
  #13

Не по теме:

castaway, Вот как хорошо! Вы не успели спросить, а я уже ответил. Или наоборот. Я не успел ответить, а вы спросили.:)

0
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
29.09.2015, 19:32 14
Байт, я не совсем понимаю, можете мне немного пояснить, что значит "по одному щелчку"? Кнопка тоже работает по одному щелчку...
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
29.09.2015, 19:36 15
Я понял что требуется, но надо будет подумать. И хорошо бы какой-то мини-образец кода близкого к оригиналу, для тестов.

Добавлено через 1 минуту
Открыли Блокнот. Нажали один раз на "файл". И водим мышою влево-вправо. Надо то же, только без кликов и при уводе мышкой закрывать Popup.
1
castaway
29.09.2015, 19:40
  #16

Не по теме:

Думаю что "въехал"...

0
Эксперт C
25491 / 15874 / 3398
Регистрация: 24.12.2010
Сообщений: 34,736
29.09.2015, 20:00  [ТС] 17
Цитата Сообщение от castaway Посмотреть сообщение
Кнопка тоже работает по одному щелчку...
Так в том и дело, что кнопок мне не надо! И так в окне ого-ого как наворочено. Я хочу, чтоб кнопки (а поп-меню в конце концов те же кнопки) сами появлялись и ненавязчиво так пропадали.
Можно, конечно, сделать так, что по щелчку на какой-то рожице появляется диалог с кнопками и комбоксами и там развернуть полноценную беседу. Но это уже будет как минимум ДВА щелчка. По рожице и по кнопке. А мой заказчик юзверя жалеет. Не дай Бог пальчик натрет! Обидится и деньги попросит назад.

Добавлено через 7 минут
Цитата Сообщение от UI-Maker Посмотреть сообщение
Открыли Блокнот.
Да, я вот по вашей наводке с блокнотом поигрался. И оказалось, что если схватиться мышкой за не активный пункт поп-меню и слегка протащить - меню пропадает!
Это я копаю в разные стороны, пытаясь понять, где же собака зарыта

Добавлено через 9 минут
Цитата Сообщение от UI-Maker Посмотреть сообщение
И хорошо бы какой-то мини-образец кода близкого к оригиналу, для тестов.
Тут такая штука. Я работаю (не браните - вынужден!) в Borland C++ 5.02 И библиотекой OWL. Которая есть лишь тонкая обертка над WinAPI. В основном методы OWL-классов отличаются от Апишных только отсутствием дескриптора окна. Так имеет ли смысл напрягать уважаемых экспертов смесью французского с нижегородским? Элементарная деликатность не позволяет мне это сделать без спроса.
А пытаться все (содержательную часть) перевести на чистую АПИ, ИМХО, бессмысленно.
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
29.09.2015, 20:13 18
Посмотреть хранцузкое чюдо изволим, изволим. :3
1
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
29.09.2015, 20:22 19
Увы, но пока ничего кроме как нарисовать собственноручно в голову не приходит.
Но мне почему-то кажется, что можно обойтись малой кровью...
0
Эксперт C
25491 / 15874 / 3398
Регистрация: 24.12.2010
Сообщений: 34,736
29.09.2015, 23:17  [ТС] 20
Цитата Сообщение от UI-Maker Посмотреть сообщение
Посмотреть хранцузкое чюдо изволим, изволим.
Ну, вот такой код. Кажется, это все, что имеет отношение к делу
C++
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
class DMult : public TMDIChild {     // Много кругов
 private:
  // ....
  TPopupMenu *mPop;
  void EvMouseMove(uint modkey, TPoint &pt);
 DECLARE_RESPONSE_TABLE(DMult);
};
DEFINE_RESPONSE_TABLE1(DMult, TMDIChild)
  // ....
  EV_WM_MOUSEMOVE,
END_RESPONSE_TABLE;
//-----------
TMDIClient client;  // Глобальная.
//-----------
DMult::DMult() : TMDIChild(client, "Cards")
{
   mPop = NULL;
   // ....
}
//-----------
void DMult::EvMouseMove(uint /*modkey*/, TPoint &pt)
{
  // wrjur("x=%d y=%d", pt.x, pt.y);  // Журналирование входа в метод
  if (pt.x < 20 && pt.y < 20) { // Попало в область реагирования
    mPop = new TPopupMenu(AutoDelete);
    DAddMenu(mPop, "MDMult"); // Построение энтого меню. Работает.Проверено
    ClientToScreen(pt);
    mPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt, 0, HWindow);
    // SetFocus();  // Не помогает
  }
  else if (mPop!=NULL) {  // Вне области, но меню есть
                 // Так вот, сюда никогда не попадаем
    keybd_event(VK_ESCAPE, 0, KEYEVENTF_EXTENDEDKEY, 0);
    keybd_event(VK_ESCAPE, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0);
    mPop = NULL;
  }
}
Добавлено через 8 минут
Чудится мне, что может помочь TrackMouseEvent, но вот как им воспользоваться - ума не приложу...

Добавлено через 1 час 20 минут
Вот еще что мне видится. PopMenu хоть и не модальная тварь, но блокирует некоторые сообщения. Полу-модальная какая-то. Типа того, что эти мессаджи ей самой нужны.
А если и впрямь вызвать диалог? С кнопочками. И вызвать его не Execute, а Create. А он уже полноценное окно, с предсказуемым поведением. И у него, наверное, можно отследить, когда мышка убежала.
Пока это в порядке бреда. Я слышал, что король Науки - Эксперимент. Но это - завтра. Сегодня мне уже лучше от кода держаться подальше.

Добавлено через 22 минуты
Как правильно скролить ListView который находится внутри другого ListView?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2015, 23:17

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Вопрос по Popup-меню
Привет всем! Столкнулся вот с какой задачей: необходимо программно выбрать определенный пункт...

Режим появления PopUp меню
Как лучше сделать, чтобы когда в ListView щелкали правой кнопкой мыши по строке выпадало PopUp...

PopUp меню для строк DBGrid
Привет, не могу сообразить как корректно организовать вызов контекстного меню для строк dbgrida....

Как вызвать Popup меню на закладке TTabset
Для удаления закладки в Runtime режиме, хочу сделать чтобы при нажатии правой кнопкой мыши над...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.