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
T-Rex wrote:Ну так да. Надо ид. Ты ж при добавлении ид указываешь.
http://docs.wxwidgets.org/stable/wx_wxm ... menuappend
И это... иди код примеров смотри
Э нет :) . Меня интересует как раз не этот 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(...), не подходит?
Блин, точно - именно оно :) . Большое спасибо.