|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Дек 11, 2003 12:54:50 masquer зачем тебе нужно превращать hmenu в hwnd Потому я и удивился, так как разницу я знаю :) |
|
|
Дата: Дек 11, 2003 21:23:18 masquer hwnd меню ловится элементарно CBT хуком (так более правильно), и зачем тебе нужно превращать hmenu в hwnd? Мне как раз хендл окна меню и нужен. Можешь закинуть пример как его отловить хуком, а то я в них не силён. |
|
|
Дата: Дек 12, 2003 00:19:27 Black_mirror По поводу DRAWITEMSTRUCT: вообще-то я знаю назначение полей и знаю, что hWnd окна-владельца там нет. Я лишь предложил использовать WM_DRAWITEM как точку начала отлова хэндла. |
|
|
Дата: Дек 12, 2003 01:37:28 Нашел замечательное сообщение для отлова хендла окна меню: WM_ENTERIDLE! Теперь осталось только хук повесить. |
|
|
Дата: Дек 12, 2003 10:53:09 · Поправил: masquer Black_mirror Условно-схематично - так: invoke SetWindowsHookEx, WH_CBT, addr CBTHookProc, hInstance, 0 ... invoke TrackPopupMenuEx,... ... invoke UnhookWindowsHookEx,... ... CBTHookProc proc cmp nCode, HCBT_CREATEWND jnz @@end invoke GetClassName, wParam,... if class==szMenuClass ... endif @@end: ... CBTHookProc endpToxic использовать WM_DRAWITEM как точку начала отлова хэндла Оригинально, а почему тогда не WM_MEASUREITEM? |
|
|
Дата: Дек 13, 2003 01:43:13 masquer Оригинально, а почему тогда не WM_MEASUREITEM? The WM_MEASUREITEM message is sent to the owner window of an owner-drawn button, combo box, list box, list view control, or menu item when the control or menu is created. |
|
|
Дата: Дек 13, 2003 01:50:12 Black_mirror WM_ENTERIDLE Я не уверен(т.к. не имею возможности проверить), но мне кажется что это сообщение будет отослано только один раз (в связке с WM_ENTERMENULOOP). Если это так, то что ты будешь делать, если у меню есть pop-up'ы (а в 99% случаев они будут)? |
|
|
Дата: Дек 13, 2003 06:33:58 masquer Спасибо! Toxic Это сообщение отсылается очень часто. Но мне кажется, что если программа тормозит и в очереди сообщений всегда есть что обрабатывать, то такой метод не сработает. |
|
|
Дата: Дек 13, 2003 13:42:40 Toxic Я, в общем-то, в курсе того, как обрабатывать WM_*ITEM и в связи с чем они приходят. Мне просто интересно, насколько это лучше хука в плане получения хендла окна меню и добавления к нему дочернего окна или мы не ищем легких путей? :) |
|
|
Дата: Дек 13, 2003 13:46:46 masquer Если хук локальный и за ним следует анхук - что может быть проще? |
|
|
Дата: Дек 13, 2003 14:12:45 · Поправил: Black_mirror С добавлением окна все понятно, только вот толка от этого мало - сообщения о вводе пользователя оно не получает. Само окно меню получает сообщения типа: был клик на первом пункте меню или мышь сместилась на второй. А сообщения от мыши поступают главному окну, но не все. Из-за того, что обработка меню происходит в хук-функции, думаю перенаправить ввод внедренному в меню окошку будет проблематично. P.S: И как такое может работать?! |
|
|
Дата: Дек 13, 2003 14:27:43 Black_mirror Я хотел получить хэндл окна только чтобы сабклассить. Мне нужно сообщение окну меню, дающее рект нужного айтема. Есть ли такие? Если нет, я могу воспользоваться ownerdraw и получить рект через drawitem (предварительно задав достаточную ширину меню в measureitem). Но уже в очереди главного окна. А что ты хотел делать с меню? |
|
|
Дата: Дек 13, 2003 14:37:34 Valery что может быть проще? ну, я так и делаю, мне просто интересно, почему Toxic советует по-другому делать. |
|
|
Дата: Дек 13, 2003 14:51:54 Valery Получить RECT можно через GetMenuItemRect, только вот возвращает его эта функция в каких-то не понятных координатах, даже в том случае когда меню на экране нет. Хочу добавить в меню элементы для выбора интенсивности компонент цвета типа SCROLLBAR'ов. |
|
|
Дата: Дек 13, 2003 14:56:14 Black_mirror GetMenuItemRect, только вот возвращает его эта функция в каких-то не понятных координатах, даже в том случае когда меню на экране нет. Во-во! У меня одна из координат иногда под 2 гига и потому я забил на GetMenuItemRect. |