Создаю в runtime popUpMenu. Меню появляется, все хорошо и красиво, но только как и где можно отловить, какой пункт меню будет выбран? Можно конечно через GetCursorPos в момент нажатия пункта меню, но может есть что попроще и правильнее
У меня MDI-приложение и если создавать меню в Design, то потом оно выпирает меню родительского окна(даже если оно PopUp), поэтому только в рантайм. Единственный контрол, где я смог обработать нажатия на пункты меню- это таймер
Сделано вот так, но почемуто пункты меню ( в смысле случаи в операторе Case) выбираются нерегулярно, иногда не срабатывает, хотя нажатие меню было, но код под этот пункт не выбирается, почему - не допру никак, причем чем меньше номер пункта, тем чаще не срабатывает, (инервал таймера минимальный - 1мс) помогите разобраться в чем дело:
Private Sub Часы1_Timer() GetCursorPos Pt mnuItem = MenuItemFromPoint&Me.hWnd, hMenu, Pt.x, Pt.y) If mnuItem >= 0 Then 'если мышь над меню oldItem = mnuItem 'то запомнили над каким Else 'если меню уже исчезло If mnuItem < -1 And oldItem > -1 Then 'и если меню было выбрано Select Case oldItem Case 0 'здесь код для первого пункта Me.Caption = oldItemа Case 1 'здесь код для второго пункта Me.Caption = oldItem Case 2 'здесь код для третьего пункта Me.Caption = oldItem Case 3 'здесь код для четвертого пункта Me.Caption = oldItem Case 5 'здесь код для шестого пункта Me.Caption = oldItem End Select End If End If End Sub
Я вообще ничего не понял. Тебе нужно именно своё меню (навороченное) или тебе подходит и стандартное, но тебя не устраивает, то что парентское меню подменяется дочерним.
Я делал лишь одно приложение MDI и единственное, что меня парило так это то, что я использовал чужой контрол (чтобы шрифты в попупе были другие), а если бы я использовал стандартные менюшки проблем - 0.0 было бы.
И ещё. Таймер я бы на твоём месте не использовал - прога почти всегда будет ненадёжной. Я его использовал в своём контроле последний раз. См. вопрос "Бешенный контрол". В следующий раз буду использовать хук: он хоть сложнее, но надёжнее.
Так что если тебя устраивают стандартные меню - пиши, Else ничем не могу помочь... попуп через API я ещё не пробовал...
Да в том и проблема, что меню делаю стандартное, но не хочу, чтобы оно подменяло парент-меню. А с кодом разобрался:
If mnuItem < -1 And oldItem > -1 Then 'и если меню было выбрано В этои строке ошибка - надо if mnuItem<0 и всё запахало как надо.
А с таймером - потому, что событие MouseMove и MouseDown больше негде обработать, т.к. меню создается в рантайме. А кто такой Hook я не знаю, один раз попробовал, но ничего не понял.