Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
-
baralgin
- In need of some credit

- Posts: 8
- Joined: Mon Aug 23, 2010 10:41 am
Post
by baralgin » Mon Aug 23, 2010 11:18 am
К примеру имеем такой код(он больше схематический, но не важно):
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 итемов, тоже бы сошло. А так нет ни того ни другого... Как поступать в таком случае?
-
Mojo
- Super wx Problem Solver

- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Post
by Mojo » Mon Aug 23, 2010 12:03 pm
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"?
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
baralgin
- In need of some credit

- Posts: 8
- Joined: Mon Aug 23, 2010 10:41 am
Post
by baralgin » Mon Aug 23, 2010 12:19 pm
Mojo wrote:Как понять "включать выключать m1 и m2"?
->Enable(false); имеется в виду. Мы можем действовать так:
m1->Enable(id11, false/true), где m1 это wxMenu*. Но в m1 может быть много пунктов(включая подменю) - хочу заблокировать доступ ко всем пунктам сразу - тоесть "загрэйить" сразу весь куст меню.
-
integer
- Earned a small fee

- Posts: 11
- Joined: Fri Dec 04, 2009 5:41 pm
Post
by integer » Mon Aug 23, 2010 4:44 pm
С помощью wxMenuItem:
Code: Select all
wxMenu* m1 = new wxMenu;
wxMenuItem* i1 = m1->Append(...);
i1->Enable(false);
-
baralgin
- In need of some credit

- Posts: 8
- Joined: Mon Aug 23, 2010 10:41 am
Post
by baralgin » Mon Aug 23, 2010 6:41 pm
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
-
Attachments
-
- EnableDisableMenu.7z
- (18 KiB) Downloaded 135 times
-
T-Rex
- Moderator

- Posts: 1199
- Joined: Sat Oct 23, 2004 9:58 am
- Location: Zaporizhzhya, Ukraine
-
Contact:
Post
by T-Rex » Mon Aug 23, 2010 9:16 pm
wxUpdateUIEvent
обработчик будет выглядеть как-то так...
Code: Select all
void MyFrame::OnID_MYITEM_UpdateUI(wxUpdateUIEvent & event)
{
event.Enable(m_mySuperVariable == 3);
}
-
baralgin
- In need of some credit

- Posts: 8
- Joined: Mon Aug 23, 2010 10:41 am
Post
by baralgin » Tue Aug 24, 2010 10:16 am
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. В принципе его достаточно чтобы отключить(циклом) все итемы меню. Хотя не совсем понятно: метод константный, но изменять состояние меню позволяет

.
-
baralgin
- In need of some credit

- Posts: 8
- Joined: Mon Aug 23, 2010 10:41 am
Post
by baralgin » Tue Aug 24, 2010 10:34 am
Э нет

. Меня интересует как раз не этот Append, а wxMenuBar::Append(wxMenu *menu, const wxString &title) - id нет(собственно как и для любого PopupMenu). Тем не менее PopupMenu замечательно блокируется, т.к. wxMenu::AppendSubMenu возвращает как раз wxMenuItem. Но этого
не делает wxMenuBar::Append, хотя это судя по всему не сложно...
Среди примеров не нашёл ничего подходящего. Да, у меня trunc и дока оттуда же.
-
integer
- Earned a small fee

- Posts: 11
- Joined: Fri Dec 04, 2009 5:41 pm
Post
by integer » Tue Aug 24, 2010 3:55 pm
А метод wxMenuBar::EnableTop(...), не подходит?
-
baralgin
- In need of some credit

- Posts: 8
- Joined: Mon Aug 23, 2010 10:41 am
Post
by baralgin » Tue Aug 24, 2010 4:37 pm
integer wrote:А метод wxMenuBar::EnableTop(...), не подходит?
Блин, точно - именно оно

. Большое спасибо.