O$>а так?
[skip]
В связи с этим, вчера нашел желанную мульку — мож, кому пригодится.
Если для элементов меню существуют обработчики ON_UPDATE_COMMAND_UI, то TrackPopupMenu их не вызовет. Полученное в результате всплывающее меню не будет отражать своевременно Enabled/Disabled элементы.
Чтобы получить обработку, после создания меню необходимо послать соосветствующее сообщение главному окну:
Хорошая мулька. Видно люди иногда соображают в одну и ту же сторону — в правильную. А вот теперь вопрос на засыпку: а как заставить показываться подсказки в статусной строке? Было бы ой как удобно. Я начал искать, но забросил...
TL>Хорошая мулька. Видно люди иногда соображают в одну и ту же сторону — в правильную. А вот теперь вопрос на засыпку: а как заставить показываться подсказки в статусной строке? Было бы ой как удобно. Я начал искать, но забросил...
Ну тады ставь оценку . Надо при вызове TrackPopupMenu обязательно указать родительское окно. Тогда в него будет приходить сообщение WM_MENUSELECT при выборе элементов.
Если у нас есть Main Frame, а "родитель" контекстного меню — это View, то обработка будет выглядеть примерно так:
Здравствуйте retalik, Вы писали:
R>Ну тады ставь оценку . Надо при вызове TrackPopupMenu обязательно указать родительское окно. Тогда в него будет приходить сообщение WM_MENUSELECT при выборе элементов.
Э нет! Утром деньги, вечером стулья! А если честно то я что-то не понял. Нет, все понятно, но че конкретно...
Здравствуйте retalik, Вы писали:
R>Если у нас есть Main Frame, а "родитель" контекстного меню — это View, то обработка будет выглядеть примерно так: R>
Здравствуйте The Lex, Вы писали:
R>>Ну тады ставь оценку . Надо при вызове TrackPopupMenu обязательно указать родительское окно. Тогда в него будет приходить сообщение WM_MENUSELECT при выборе элементов. TL>Э нет! Утром деньги, вечером стулья! А если честно то я что-то не понял. Нет, все понятно, но че конкретно...
А я не понял, что ты не понял. Рабочий проверенный кусок кода ты проигнорировал? В классе View обрабатывается сообщение WM_MENUSELECT и соответственно выводятся подсказки в строке статуса главного окна — одной строкой, между прочим.
А единственная хитрость (повторяю! ) — что в случае TrackPopupMenu это сообщение будет приходить только тому, кого укажешь в качестве Owner Window:
BOOL TrackPopupMenu(
HMENU hMenu, // handle to shortcut menu
UINT uFlags, // optionsint x, // horizontal positionint y, // vertical positionint nReserved, // reserved, must be zeroHWND hWnd, // handle to owner window
CONST RECT *prcRect // ignored
);
Здравствуйте retalik, Вы писали:
R>Здравствуйте The Lex, Вы писали:
R>>>Ну тады ставь оценку . Надо при вызове TrackPopupMenu обязательно указать родительское окно. Тогда в него будет приходить сообщение WM_MENUSELECT при выборе элементов. TL>>Э нет! Утром деньги, вечером стулья! А если честно то я что-то не понял. Нет, все понятно, но че конкретно... R>А я не понял, что ты не понял. Рабочий проверенный кусок кода ты проигнорировал?
Здравствуйте The Lex, Вы писали: TL>Я попробовал грубо в лоб: TL>
TL> // TODO: Add your message handler code here
TL> if (nFlags != 0xFFFF)
TL> static_cast<CFrameWnd*>(AfxGetMainWnd())->SetMessageText(nItemID);
TL>else
TL> static_cast<CFrameWnd*>(AfxGetMainWnd())->SetMessageText(AFX_IDS_IDLEMESSAGE);
TL>
TL>Что-то мне в этом не совсем нравится и работает тоже не совсем так, но уже ближе. Принимаю другие предложения.
Я постараюсь объяснить, что именно может тебе в этом не нравиться.
1. AfxGetMainWnd может вернуть и не Main Frame (в диалоговом приложении, например). Тогда приведение типов вернет недопустимый результат. Но для диалога и нет схемы Idle-обработчиков, ее все равно придется вручную поддерживать.
2. AFX_IDS_IDLEMESSAGE является константой для внутренного использования, и ее может и не быть (или ее в других версиях MFC могут спрятать). Тогда вместо этого достаточно очищать строку состояния пустой строкой (все равно, после изменения состояния программы статусная строка обновится).
Резюме: такой подход является вполне рабочим, если держать в уме его ограничения.
Да и вообще, наиболее необычные эффекты получаются после долгих ковыряний во внутренностях — неважно чего, исходников MFC или оконных сообщений в Spy++.
Важно то, что они позволяют добиться результата.
А>И никаких проблем ни с enabled/disabled, ни со строкой статуса
%-( )~~~~~
Посыпаю голову пеплом...
Действительно, так все работает! Ну где же ты раньше был?! (до того как я тут позориться начал )
А>>И никаких проблем ни с enabled/disabled, ни со строкой статуса R>%-( )~~~~~ R>Посыпаю голову пеплом... R>Действительно, так все работает! Ну где же ты раньше был?! (до того как я тут позориться начал )
А я наблюдал с высокой горы
А если серьезно — мне сейчас некогда по форумам гулять, поэтому я поздно топик заметил
ЗЫ Года четыре назад я тоже вопросом с меню долго мучился — пока на набрел на очевидное решение, представленное выше
А>>И никаких проблем ни с enabled/disabled, ни со строкой статуса R>%-( )~~~~~ R>Посыпаю голову пеплом... R>Действительно, так все работает! Ну где же ты раньше был?! (до того как я тут позориться начал )
А я вот не стану спешить с выводами. Мне почему-то все же приятнее контекстное меню для того окна, в котором это меню было вызвано. Но идею я оценил.