Есть ли возможность заблокирова Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
baralgin
In need of some credit
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
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Есть ли возможность заблокиро

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
In need of some credit
Posts: 8
Joined: Mon Aug 23, 2010 10:41 am

Re: Есть ли возможность заблокиро

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
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
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 119 times

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
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
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. В принципе его достаточно чтобы отключить(циклом) все итемы меню. Хотя не совсем понятно: метод константный, но изменять состояние меню позволяет :? .

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Tue Aug 24, 2010 10:22 am

Ну так да. Надо ид. Ты ж при добавлении ид указываешь.
http://docs.wxwidgets.org/stable/wx_wxm ... menuappend
И это... иди код примеров смотри

baralgin
In need of some credit
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

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 и дока оттуда же.

integer
Earned a small fee
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
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(...), не подходит?
Блин, точно - именно оно :) . Большое спасибо.

Post Reply