得先有一个菜单配置文件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();
}
}
}
}