Я пытался вызвать его через wxFrame
вместо текущего окна (a wxListCtrl
).Это помогло, но не сильно: оно очистило бы строку состояния, когда указатель мыши перемещался над элементом всплывающего меню, но не показывало бы текст справки для него.
Когда я копался в исходном коде wxWidgets, яобнаружил причину: пункты моего всплывающего меню не были в строке меню.wxWidgets отправляет идентификатор пункта меню в строку меню для извлечения текста, что в данном случае явно не получается.
Это заняло некоторое время, но я нашел способ обойти проблему:
////////////////////////////////////////////////////////////////////////////
// In a header file...
class PopupMenu: public wxMenu {
public: //
PopupMenu(): mPushed(false) { }
void OnOpen(wxMenuEvent &evt);
void OnClose(wxMenuEvent &evt);
void OnShowMenuHelp(wxMenuEvent &evt);
private: //
bool mPushed;
DECLARE_EVENT_TABLE()
};
////////////////////////////////////////////////////////////////////////////
// In a cpp file...
BEGIN_EVENT_TABLE(PopupMenu, wxMenu)
EVT_MENU_OPEN(PopupMenu::OnOpen)
EVT_MENU_CLOSE(PopupMenu::OnClose)
EVT_MENU_HIGHLIGHT(wxID_ANY, PopupMenu::OnShowMenuHelp)
END_EVENT_TABLE()
void PopupMenu::OnOpen(wxMenuEvent &evt) {
if (!mPushed) {
// Clear it
findStatusBar()->PushStatusText(wxString());
mPushed = true;
}
}
void PopupMenu::OnClose(wxMenuEvent &evt) {
if (mPushed) {
findStatusBar()->PopStatusText();
mPushed = false;
}
}
void PopupMenu::OnShowMenuHelp(wxMenuEvent &evt) {
if (mPushed) {
findStatusBar()->SetStatusText(GetHelpString(evt.GetMenuId()));
} else {
findStatusBar()->PushStatusText(GetHelpString(evt.GetMenuId()));
mPushed = true;
}
}
(findStatusBar
- это вспомогательная функция, которая находит рамочное окно программы и вызывает на нем GetStatusBar
.)
Теперь я просто извлекаю класс из PopupMenu
для всех всплывающих окон, которые мне нужны.Результаты превосходны.
Возможно, есть более простой способ обойти эту проблему, но без размещения элементов всплывающего окна в строке меню я не смог его найти.