Как выборочно отключить шоткаты в меню

September 26th, 2008 Begemot Posted in Программирование

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

Уже во второй программе я сталкиваюсь с тем что мне необходимо, отключить автоматическую обработку для некоторых пунктов меню. Прямого способа нет. Я спрашивал в wx-листе, но там или меня не поняли или тоже не знали ответа.

Решение нашлось на форуме, собственно ответ тут. Добавляем обработчики для открытия\закрытия меню.

 
[sourcecode language=”cpp”]
EVT_MENU_OPEN(MainFrame::OnOpenMenu)
EVT_MENU_CLOSE(MainFrame::OnCloseMenu)

void MainFrame::OnOpenMenu(wxMenuEvent & event)
{
GetMenuBar()->FindItem(ID_COPYITEMTOCLIPBOARD)->SetItemLabel(_(“&Copy to Clipboard\tCtrl+C”));
event.Skip();
}

void MainFrame::OnCloseMenu(wxMenuEvent & event)
{
GetMenuBar()->FindItem(ID_COPYITEMTOCLIPBOARD)->SetItemLabel(_(“&Copy to Clipboard”));
GetMenuBar()->FindItem(ID_COPYITEMTOCLIPBOARD)->SetBitmaps(wxBitmap(copy_clipboard_xpm), wxNullBitmap);
event.Skip();
}
[/sourcecode]

Выглядит грязным хаком, но работает. Особое удивление у меня вызывает необходимость устанавливать каждый раз иконку для меню, причем именно в обработчике закрытия, а не открытия (!), но это волшебство я уже объяснить не могу.

Related:

One Response to “Как выборочно отключить шоткаты в меню”

  1. […] Как выборочно отключить шоткаты в меню […]