Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать видимость меню зная значение HMENU? Или хотя бы узнать HWND окна этого меню? 
V
    Опции темы
DigitalDummy
  Дата 25.6.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.4.2006
Где: В подвале шоколад ной фабрики.

Репутация: нет
Всего: 2



Здравствуйте.

Нужно определить показано ли на экране в данный момент всплывающее (popup) меню или скрыто. То есть, не главное для окна, что сверху. Известен только хендл меню (HMENU), окно к которому оно привязано (но не окно, самого меню).

Событие на показ вызвать не проблема. А мне нужно событие его закрытия. Писать собственный класс меню со своим окном, пока нет времени. Если будет способ определить хендл окна самого меню, то это уже, думаю, решит проблему. Но, возможно, что система создает окна таких меню только на момент появления.

Подскажите, пожалуйста, кто может хоть что-нибудь по этой теме.
Заранее огромное спасибо.

Это сообщение отредактировал(а) DigitalDummy - 28.6.2007, 09:58
PM WWW   Вверх
Coocky
Дата 26.6.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.

Я правильно понял?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
DigitalDummy
Дата 26.6.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.4.2006
Где: В подвале шоколад ной фабрики.

Репутация: нет
Всего: 2



Нет. Это не определяет видимости меню на экране (то, что оно сейчас открыто и видно).
PM WWW   Вверх
Coocky
Дата 26.6.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



А.... Понял. Развернуто или нет? Хм.. "Ну это вряд ли..." тов. Сухов . (с) "Белое солнце" smile 


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
GremlinProg
Дата 27.6.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(DigitalDummy @  25.6.2007,  15:49 Найти цитируемый пост)
Событие на показ вызвать не проблема. А мне нужно событие его закрытия. Писать собственный класс меню со своим окном, пока нет времени. Если будет способ определить хендл окна самого меню, то это уже, думаю, решит проблему. Но, возможно, что система создает окна таких меню только на момент появления.

Можно воспользоваться уведомлениями WM_ENTERMENULOOP и WM_EXITMENULOOP, они приходят в окно, владеющее меню.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
DigitalDummy
Дата 28.6.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.4.2006
Где: В подвале шоколад ной фабрики.

Репутация: нет
Всего: 2



Спасибо. Но, это не совсем то, что необходимо. Потому что, меню не главное для окна, а всплывающее (забыл упомянуть - сейчас исправлю тему). В таком случае, это сообщение не обрабатывается.
PM WWW   Вверх
DigitalDummy
  Дата 1.7.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.4.2006
Где: В подвале шоколад ной фабрики.

Репутация: нет
Всего: 2



РЕШЕНИЕ
(для Windows 2000, XP – в других не проверял)

Чтобы определить видимость всплывающего меню, находим окно по классу окна (для стандартных меню он фиксирован). Так как известно, что всплывающее меню на экране всегда одно (если стандартное), то первое найденное окно и будет «нужным». Потом проверяем видимость найденного окна и всё.

Код

#define    CLASS_WINDOW_MENU_POPUP TEXT("#32768")

bool Menu_Popup_Visible()
{
    HWND    vHandle;

    vHandle    = FindWindow(CLASS_WINDOW_MENU_POPUP, NULL);
    return (vHandle) && (IsWindowVisible(vHandle));
}

Код

function Menu_Popup_Visible(): Boolean;
const
  CLASS_WINDOW_MENU_POPUP = '#32768';

var
  vHandle: Cardinal;

begin
  vHandle   := FindWindow(CLASS_WINDOW_MENU_POPUP, nil);
  Result    := (vHandle <> 0) and IsWindowVisible(vHandle);
end;

Данную проверку можно вставить в основной цикл программы или, например, в таймер. Как будет удобнее.

Это сообщение отредактировал(а) DigitalDummy - 1.7.2007, 11:07
PM WWW   Вверх
Coocky
Дата 2.7.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Хех. Действительно.Все контекстные меню имеют одно и тоже атомарное значение-#32768.
И действительно-одновремено не может быть более одного меню smile
Прикол.
А откуда узнал? Чисто интуитивно? Или подсказали где?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
maxim1000
Дата 2.7.2007, 09:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



а если во всплывающем меню открывается подменю, оно считается тем же или отдельным?


--------------------
qqq
PM WWW   Вверх
Earnest
Дата 2.7.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Отдельным, я думаю (и HMENU и HWND разные). Но если подменю видимо, то и его исходное тоже. Только вот как ты отличишь, что видно: подменю выпавшее из главного меню и подменю контекстное? Или это все равно?

Добавлено через 2 минуты и 45 секунд
И еще, DigitalDummy, ты уверен насчет WM_ENTERMENULOOP, что оно не приходит для контекстного меню? Потому что в MSDN написано, что должно... 


--------------------
...
PM   Вверх
DigitalDummy
Дата 5.7.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.4.2006
Где: В подвале шоколад ной фабрики.

Репутация: нет
Всего: 2



Цитата(Coocky @  2.7.2007,  09:07 Найти цитируемый пост)
А откуда узнал? Чисто интуитивно? Или подсказали где?

Да просто «исходники» Windows посмотрел. Как же ещё?!
Меню это окно. У окна есть какой-то класс. Раз через HMENU узнать окно способа я не нашел, то, в первую очередь, хотел, проверять все окна нужного класса и находить своё. Но всё оказалось ещё проще.

Цитата(maxim1000 @  2.7.2007,  09:44 Найти цитируемый пост)
а если во всплывающем меню открывается подменю, оно считается тем же или отдельным?

Как меню оно конечно отдельно. А вот на счёт окна - странная тема. Пока не смог найти окно, которое создается для открытого под-меню. Но, пока разбираться в этом нет времени. Моя задача пока решена.

Цитата(Earnest @  2.7.2007,  19:13 Найти цитируемый пост)
ты уверен насчет WM_ENTERMENULOOP, что оно не приходит для контекстного меню? Потому что в MSDN написано, что должно...  

Правда – на счёт WM_ENTERMENULOOP был не прав. Оно все-таки приходит в присвоенное меню окно.
Для меню я использовал готовый визуальный компонент от VCL. Его свойство WindowHandle указывает совсем не туда, куда надо. И в другие окна программы сообщение не доходит. Этот компонент, оказывается, создает собственное скрытое окно для каждого «себя». Из-за этого, я изначально ошибся, подумав, что эти сообщения используются только для главного оконного меню.

Цитата(Earnest @  2.7.2007,  19:13 Найти цитируемый пост)
Только вот как ты отличишь, что видно: подменю выпавшее из главного меню и подменю контекстное? Или это все равно?

А подменю от главного меню отличаю как раз через WM_ENTERMENULOOP, WM_EXITMENULOOP. Ирония судьбы.

Это сообщение отредактировал(а) DigitalDummy - 5.7.2007, 10:16
PM WWW   Вверх
Earnest
Дата 5.7.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(DigitalDummy @  5.7.2007,  11:14 Найти цитируемый пост)
А подменю от главного меню отличаю как раз через WM_ENTERMENULOOP, WM_EXITMENULOOP.

Я не про главное меню, а про подменю, которое из него выпадает. Бывает же еще меню контекстное, которое выпадает по правой кнопке в любом месте экрана. И то и другое - это попап-меню. Тебе их надо отличать или нет?


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.