![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| DigitalDummy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 7.4.2006 Где: В подвале шоколад ной фабрики. Репутация: нет Всего: 2 |
Здравствуйте.
Нужно определить показано ли на экране в данный момент всплывающее (popup) меню или скрыто. То есть, не главное для окна, что сверху. Известен только хендл меню (HMENU), окно к которому оно привязано (но не окно, самого меню). Событие на показ вызвать не проблема. А мне нужно событие его закрытия. Писать собственный класс меню со своим окном, пока нет времени. Если будет способ определить хендл окна самого меню, то это уже, думаю, решит проблему. Но, возможно, что система создает окна таких меню только на момент появления. Подскажите, пожалуйста, кто может хоть что-нибудь по этой теме. Заранее огромное спасибо. Это сообщение отредактировал(а) DigitalDummy - 28.6.2007, 09:58 |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
BOOL GetMenuItemInfo( HMENU hMenu,
UINT uItem, BOOL fByPosition, LPMENUITEMINFO lpmii ); typedef struct tagMENUITEMINFO { UINT cbSize; UINT fMask; UINT fType; UINT fState; UINT wID; HMENU hSubMenu; HBITMAP hbmpChecked; HBITMAP hbmpUnchecked; ULONG_PTR dwItemData; LPTSTR dwTypeData; UINT cch; HBITMAP hbmpItem; } MENUITEMINFO, *LPMENUITEMINFO; fState Menu item state. This member can be one or more of these values. Set fMask to MIIM_STATE to use fState. MFS_CHECKED Checks the menu item. For more information about selected menu items, see the hbmpChecked member. MFS_DEFAULT Specifies that the menu item is the default. A menu can contain only one default menu item, which is displayed in bold. MFS_DISABLED Disables the menu item and grays it so that it cannot be selected. This is equivalent to MFS_GRAYED. MFS_ENABLED Enables the menu item so that it can be selected. This is the default state. MFS_GRAYED Disables the menu item and grays it so that it cannot be selected. This is equivalent to MFS_DISABLED. MFS_HILITE Highlights the menu item. MFS_UNCHECKED Unchecks the menu item. For more information about clear menu items, see the hbmpChecked member. MFS_UNHILITE Removes the highlight from the menu item. This is the default state. Я правильно понял? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| DigitalDummy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 7.4.2006 Где: В подвале шоколад ной фабрики. Репутация: нет Всего: 2 |
Нет. Это не определяет видимости меню на экране (то, что оно сейчас открыто и видно).
|
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
А.... Понял. Развернуто или нет? Хм.. "Ну это вряд ли..." тов. Сухов . (с) "Белое солнце"
-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Можно воспользоваться уведомлениями WM_ENTERMENULOOP и WM_EXITMENULOOP, они приходят в окно, владеющее меню. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| DigitalDummy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 7.4.2006 Где: В подвале шоколад ной фабрики. Репутация: нет Всего: 2 |
Спасибо. Но, это не совсем то, что необходимо. Потому что, меню не главное для окна, а всплывающее (забыл упомянуть - сейчас исправлю тему). В таком случае, это сообщение не обрабатывается.
|
|||
|
||||
| DigitalDummy |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 7.4.2006 Где: В подвале шоколад ной фабрики. Репутация: нет Всего: 2 |
РЕШЕНИЕ
(для Windows 2000, XP – в других не проверял) Чтобы определить видимость всплывающего меню, находим окно по классу окна (для стандартных меню он фиксирован). Так как известно, что всплывающее меню на экране всегда одно (если стандартное), то первое найденное окно и будет «нужным». Потом проверяем видимость найденного окна и всё.
Данную проверку можно вставить в основной цикл программы или, например, в таймер. Как будет удобнее. Это сообщение отредактировал(а) DigitalDummy - 1.7.2007, 11:07 |
||||
|
|||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
Хех. Действительно.Все контекстные меню имеют одно и тоже атомарное значение-#32768.
И действительно-одновремено не может быть более одного меню Прикол. А откуда узнал? Чисто интуитивно? Или подсказали где? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
а если во всплывающем меню открывается подменю, оно считается тем же или отдельным?
-------------------- qqq |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Отдельным, я думаю (и HMENU и HWND разные). Но если подменю видимо, то и его исходное тоже. Только вот как ты отличишь, что видно: подменю выпавшее из главного меню и подменю контекстное? Или это все равно?
Добавлено через 2 минуты и 45 секунд И еще, DigitalDummy, ты уверен насчет WM_ENTERMENULOOP, что оно не приходит для контекстного меню? Потому что в MSDN написано, что должно... -------------------- ... |
|||
|
||||
| DigitalDummy |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 7.4.2006 Где: В подвале шоколад ной фабрики. Репутация: нет Всего: 2 |
Да просто «исходники» Windows посмотрел. Как же ещё?! Меню это окно. У окна есть какой-то класс. Раз через HMENU узнать окно способа я не нашел, то, в первую очередь, хотел, проверять все окна нужного класса и находить своё. Но всё оказалось ещё проще.
Как меню оно конечно отдельно. А вот на счёт окна - странная тема. Пока не смог найти окно, которое создается для открытого под-меню. Но, пока разбираться в этом нет времени. Моя задача пока решена.
Правда – на счёт WM_ENTERMENULOOP был не прав. Оно все-таки приходит в присвоенное меню окно. Для меню я использовал готовый визуальный компонент от VCL. Его свойство WindowHandle указывает совсем не туда, куда надо. И в другие окна программы сообщение не доходит. Этот компонент, оказывается, создает собственное скрытое окно для каждого «себя». Из-за этого, я изначально ошибся, подумав, что эти сообщения используются только для главного оконного меню.
А подменю от главного меню отличаю как раз через WM_ENTERMENULOOP, WM_EXITMENULOOP. Ирония судьбы. Это сообщение отредактировал(а) DigitalDummy - 5.7.2007, 10:16 |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Я не про главное меню, а про подменю, которое из него выпадает. Бывает же еще меню контекстное, которое выпадает по правой кнопке в любом месте экрана. И то и другое - это попап-меню. Тебе их надо отличать или нет? -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |