,focus在此panel上,敲快捷键,menu的快捷键不起效用,keyevent事件进入了。但windows上是好的,wx2.8 也没有问题,就linux上无效(redhat6.3 centos5.6(gnome))。有谁遇到这问题的么 ,该如何解决,请帮忙看下,谢谢
下面是一个简单的测试例子,子窗口的ID_EXITSUBWIN和ID_EXITSUBWIN的menu事件没有触发。
Code: Select all
#include <wx/wx.h>
#define ID_OPENSUBWIN 1000
#define ID_EXITWIN 1001
#define ID_TIPWARNING 1002
#define ID_EXITSUBWIN 1003
class CSubPanel : public wxPanel
{
public:
CSubPanel(wxWindow *parent);
void OnKeyDown(wxKeyEvent &event);
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(CSubPanel, wxPanel)
EVT_KEY_DOWN(CSubPanel::OnKeyDown)
END_EVENT_TABLE()
CSubPanel::CSubPanel(wxWindow *parent) : wxPanel(parent, -1)
{
}
void CSubPanel::OnKeyDown(wxKeyEvent &event)
{
int keycode = event.GetKeyCode();
switch (keycode){
case 'O':
wxMessageBox("key event");
break;
default:
break;
}
event.Skip();
}
class CSubWindow : public wxFrame
{
public:
CSubWindow(wxWindow *parent);
void OnMenu(wxCommandEvent& event);
void OnClose(wxCloseEvent& event);
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(CSubWindow, wxFrame)
EVT_CLOSE(CSubWindow::OnClose)
EVT_MENU(ID_TIPWARNING, CSubWindow::OnMenu)
EVT_MENU(ID_EXITWIN, CSubWindow::OnMenu)
END_EVENT_TABLE()
CSubWindow::CSubWindow(wxWindow *parent) : wxFrame(parent, -1, wxT("SubWindow"), wxDefaultPosition, wxSize(600, 600))
{
wxMenuBar *menubar = new wxMenuBar();
wxMenu* fileMenu = new wxMenu;
fileMenu->Append(ID_TIPWARNING, wxT("&Warning dlg\tO"));
fileMenu->AppendSeparator();
fileMenu->Append(ID_EXITSUBWIN, wxT("E&xit\tCtrl+Q"));
menubar->Append(fileMenu, wxT("Window"));
SetMenuBar(menubar);
CSubPanel *panel = new CSubPanel(this);
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
mainSizer->Add(panel, 1, wxEXPAND);
SetSizer(mainSizer);
SetAutoLayout(true);
}
void CSubWindow::OnMenu(wxCommandEvent& event)
{
if (event.GetId() == ID_TIPWARNING)
{
wxMessageDialog dlg(this, "Tip Window");
dlg.ShowModal();
}
else if (event.GetId() == ID_EXITSUBWIN)
{
this->Destroy();
}
event.Skip();
}
void CSubWindow::OnClose(wxCloseEvent& event)
{
Destroy();
}
class CTestMainWindow :public wxFrame
{
public:
CTestMainWindow(wxWindow* parent);
void OnClose(wxCloseEvent& event);
void OnMenu(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(CTestMainWindow, wxFrame)
EVT_CLOSE(CTestMainWindow::OnClose)
EVT_MENU(ID_OPENSUBWIN,CTestMainWindow::OnMenu)
EVT_MENU(ID_EXITSUBWIN, CTestMainWindow::OnMenu)
EVT_MENU(ID_TIPWARNING, CTestMainWindow::OnMenu)
END_EVENT_TABLE()
CTestMainWindow::CTestMainWindow(wxWindow* parent) : wxFrame(parent, -1, wxT("MainWindow"), wxDefaultPosition, wxSize(720,680))
{
wxMenuBar *menubar = new wxMenuBar();
wxMenu* fileMenu = new wxMenu;
fileMenu->Append(ID_OPENSUBWIN, wxT("&Open..\tCtrl+O"));
fileMenu->AppendSeparator();
fileMenu->Append(ID_EXITWIN, wxT("E&xit\tCtrl+X"));
menubar->Append(fileMenu, wxT("Window"));
SetMenuBar(menubar);
}
void CTestMainWindow::OnClose(wxCloseEvent& event)
{
Destroy();
}
void CTestMainWindow::OnMenu(wxCommandEvent& event)
{
int evtid = event.GetId();
if (evtid == ID_OPENSUBWIN)
{
CSubWindow* subwindow = new CSubWindow(this);
subwindow->Show();
}
else if (evtid == ID_EXITWIN)
{
Destroy();
}
event.Skip();
}
class CTestApp : public wxApp
{
public:
CTestApp();
bool OnInit(void);
int OnExit(void);
protected:
CTestMainWindow *frame;
};
IMPLEMENT_APP(CTestApp)
CTestApp::CTestApp()
{
}
bool CTestApp::OnInit()
{
frame = new CTestMainWindow(NULL);
frame->CentreOnScreen(wxBOTH);
frame->Show(TRUE);
SetTopWindow(frame);
return true;
}
int CTestApp::OnExit(void)
{
return wxApp::OnExit();
}