Page 1 of 1
Есть ли возможность заблокирова
Posted: Mon Aug 23, 2010 11:18 am
by baralgin
К примеру имеем такой код(он больше схематический, но не важно):
Code: Select all
wxMenu* m1 = new wxMenu;
m1->Append(id11, str);
m1->Append(id12, str);
wxMenu* m2 = new wxMenu;
m2->Append(id21, str);
m2->Append(id22, str);
wxMenuBar* mbar = new wxMenuBar;
mbar->Append(m1, str);
mbar->Append(m2, str);
SetMenuBar(mbar);
Необходимо динамически включать выключать m1 и m2. Добраться до них можно через: GetMenuBar()->GetMenu(0 или 1), но что делать потом? Можно применить метод Enable по id к каждому итему, но это не удобно. Под ms такое возможно, т.к. любой итем имеет id(его даже можно нажимать...). На крайний случай был бы enumeration итемов, тоже бы сошло. А так нет ни того ни другого... Как поступать в таком случае?
Re: Есть ли возможность заблокиро
Posted: Mon Aug 23, 2010 12:03 pm
by Mojo
baralgin wrote:К примеру имеем такой код(он больше схематический, но не важно):
Code: Select all
wxMenu* m1 = new wxMenu;
m1->Append(id11, str);
m1->Append(id12, str);
wxMenu* m2 = new wxMenu;
m2->Append(id21, str);
m2->Append(id22, str);
wxMenuBar* mbar = new wxMenuBar;
mbar->Append(m1, str);
mbar->Append(m2, str);
SetMenuBar(mbar);
Необходимо динамически включать выключать m1 и m2. Добраться до них можно через: GetMenuBar()->GetMenu(0 или 1), но что делать потом? Можно применить метод Enable по id к каждому итему, но это не удобно. Под ms такое возможно, т.к. любой итем имеет id(его даже можно нажимать...). На крайний случай был бы enumeration итемов, тоже бы сошло. А так нет ни того ни другого... Как поступать в таком случае?
Как понять "включать выключать m1 и m2"?
Re: Есть ли возможность заблокиро
Posted: Mon Aug 23, 2010 12:19 pm
by baralgin
Mojo wrote:Как понять "включать выключать m1 и m2"?
->Enable(false); имеется в виду. Мы можем действовать так:
m1->Enable(id11, false/true), где m1 это wxMenu*. Но в m1 может быть много пунктов(включая подменю) - хочу заблокировать доступ ко всем пунктам сразу - тоесть "загрэйить" сразу весь куст меню.
Posted: Mon Aug 23, 2010 4:44 pm
by integer
С помощью wxMenuItem:
Code: Select all
wxMenu* m1 = new wxMenu;
wxMenuItem* i1 = m1->Append(...);
i1->Enable(false);
Posted: Mon Aug 23, 2010 6:41 pm
by baralgin
integer wrote:С помощью wxMenuItem:
Code: Select all
wxMenu* m1 = new wxMenu;
wxMenuItem* i1 = m1->Append(...);
i1->Enable(false);
Так это
, опять же это только один итем. А нужно сразу все.
Значит чтобы окончательно разьяснить что именно нужно покажу видео(приаттачено к посту). По клику меню "Включить-выключить меню слева" меню Options включается и отключается. Тут два момента может ли wxwidgets создать такое меню(верхнего уровня), которое можно кликать? И второй собственно сабж.
Код(win32api) который выполняется при этом:
Code: Select all
void OnTestMenuOnOff(HWND hwnd)
{
static bool enabled = false;
enabled = !enabled;
HMENU menu = GetMenu(hwnd);
EnableMenuItem(menu, ID_OPTION_OFF, enabled);
DrawMenuBar(hwnd);
}
Ведь элементарно
. И всё дело в том что это раскрывающееся меню(Options) имеет свой личный ID.
ps: прикреплённое видео имеет формат MS Screen 9(4СС: MSS2) - медиаплэйером под windows смотреться должно.
Вот ссылка на youtube:
http://www.youtube.com/watch?v=PRNI2cZXGBo
Posted: Mon Aug 23, 2010 9:16 pm
by T-Rex
wxUpdateUIEvent
обработчик будет выглядеть как-то так...
Code: Select all
void MyFrame::OnID_MYITEM_UpdateUI(wxUpdateUIEvent & event)
{
event.Enable(m_mySuperVariable == 3);
}
Posted: Tue Aug 24, 2010 10:16 am
by baralgin
T-Rex wrote:wxUpdateUIEvent
обработчик будет выглядеть как-то так...
Code: Select all
void MyFrame::OnID_MYITEM_UpdateUI(wxUpdateUIEvent & event)
{
event.Enable(m_mySuperVariable == 3);
}
Так ведь обработчик нужно натравливать на ID, а в конструкторе wxMenu ID не прусмотрен. Или я что-то не так понимаю?
Оказывается есть такой метод wxMenuItemList& wxMenu::GetMenuItems() const. В принципе его достаточно чтобы отключить(циклом) все итемы меню. Хотя не совсем понятно: метод константный, но изменять состояние меню позволяет
.
Posted: Tue Aug 24, 2010 10:22 am
by T-Rex
Ну так да. Надо ид. Ты ж при добавлении ид указываешь.
http://docs.wxwidgets.org/stable/wx_wxm ... menuappend
И это... иди код примеров смотри
Posted: Tue Aug 24, 2010 10:34 am
by baralgin
Э нет
. Меня интересует как раз не этот Append, а wxMenuBar::Append(wxMenu *menu, const wxString &title) - id нет(собственно как и для любого PopupMenu). Тем не менее PopupMenu замечательно блокируется, т.к. wxMenu::AppendSubMenu возвращает как раз wxMenuItem. Но этого
не делает wxMenuBar::Append, хотя это судя по всему не сложно...
Среди примеров не нашёл ничего подходящего. Да, у меня trunc и дока оттуда же.
Posted: Tue Aug 24, 2010 3:55 pm
by integer
А метод wxMenuBar::EnableTop(...), не подходит?
Posted: Tue Aug 24, 2010 4:37 pm
by baralgin
integer wrote:А метод wxMenuBar::EnableTop(...), не подходит?
Блин, точно - именно оно
. Большое спасибо.