wxWidget方法创建多级动态菜单

得先有一个菜单配置文件menu.cfg

[menu](&Aquisition){}
	[menu](Tool Control)
		[menu](OCTselect)
			[exec](sysa[K]...	F1){sysa}<./file_selection.sh> 
			[exec](sysb[K]...	F2){sysb}<ls -l> //这里面写执行路径
			[exec](RDR...	F3){RDR}<ls -l> 
		[end]
	[end]
	[exec](&Seismic Logging Software...){Seismic Logging Software}<ls -l> 
	[exec](&Toolcmd......){Toolcmd}<ls -l> 
	[exec](&Communication Utils...){Communication Utils}<ls -l> 
[end]

程序里这样写

if(file.Open(wxT("menu.cfg"))) {
		size_t i;
		size_t x,y,z,u,w;

		wxString line;
		wxString* execCmd;

		for(i = 0; i<file.GetLineCount(); i++) {
			line = file.GetLine(i);
			if(line.Length() < EMPTYLINE_LEN )
				continue;

			x = line.Find(wxT("[menu]"));
			if(x != wxNOT_FOUND) {
				if(ident == 0) {
					m[0] = new wxMenu();
					y = line.Find(wxT('(')) + 1;
					z = line.Find(wxT(')')) - 1;
					m_menubar->Append( m[0], line.SubString(y,z));
					ident = 1;
				} else {
					m[ident] = new wxMenu();
					y = line.Find(wxT('(')) + 1;
					z = line.Find(wxT(')')) - 1;
					m[ident-1]->Append(-1, line.SubString(y,z), m[ident]);
					ident = ident + 1;
				}
			} else {
				x = line.Find(wxT("[exec]"));
				if(x != wxNOT_FOUND ) {
					y = line.Find(wxT('(')) + 1;
					z = line.Find(wxT(')'), true) - 1;
					u = line.Find(wxT('{')) + 1;
					w = line.Find(wxT('}')) - 1;

					//menuExec = m[ident-1]->Append(-1, line.SubString(y,z), line.SubString(u,w), wxITEM_NORMAL);
					menuExec = m[ident-1]->Append(-1, line.SubString(y,z), line.SubString(u,w), wxITEM_NORMAL);
					wxString aa = line.SubString(u,w);
					//std::cout<<aa.ToUTF8()<<"这是menuItem名"<<std::endl;

					u = line.find(wxT('<')) + 1;
					w = line.find(wxT('>')) - 1;
					this->Connect( wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(EclipsFrame::OnExec), menuExec );//OnExec()里根据不同的menuitemID执行不同的代码
					//execCmd = &line.SubString(u,w);
					execCmd = new wxString(line.SubString(u,w));
					//std::cout<<"item名:"<<aa.ToUTF8()<<"  命令:"<<execCmd->ToUTF8()<<std::endl;
					m_execCmd->Put(menuExec->GetId(), (wxObject *)execCmd);
					m_menuItemHash[line.SubString(y,z).BeforeFirst(wxT('.'))] = menuExec->GetId();
//std::cout << menuExec->GetId() << ":" << line.SubString(y,z).BeforeFirst(wxT('.')).mb_str() << std::endl;
				} else {
					x = line.Find(wxT("[end]"));
					if(x != wxNOT_FOUND)
						ident = ident - 1;
					x = line.Find(wxT("[space]"));
					if(x != wxNOT_FOUND)
						m[ident-1]->AppendSeparator();
				}
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值