Add an option to use wxTextCtrl as input window in keyboard sample.

Keyboard handling is subtly different in wxGTK for native controls and generic
wxWindows so add a way to test both of them in the sample.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72266 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-07-31 11:09:00 +00:00
parent f239af65af
commit 7c8bfa876a

View File

@ -33,6 +33,8 @@ private:
void OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(true); }
void OnAbout(wxCommandEvent& event);
void OnUseTextCtrl(wxCommandEvent& event);
void OnTestAccelA(wxCommandEvent& WXUNUSED(event))
{ m_logText->AppendText("Test accelerator \"A\" used.\n"); }
void OnTestAccelCtrlA(wxCommandEvent& WXUNUSED(event))
@ -73,6 +75,9 @@ private:
void LogEvent(const wxString& name, wxKeyEvent& event);
// Set m_inputWin to either a new wxWindow or new wxTextCtrl.
void DoCreateInputWindow(bool text);
wxTextCtrl *m_logText;
wxWindow *m_inputWin;
bool m_skipHook,
@ -123,6 +128,7 @@ MyFrame::MyFrame(const wxString& title)
ClearID = wxID_CLEAR,
SkipHook = 100,
SkipDown,
UseTextCtrl,
TestAccelA,
TestAccelCtrlA,
TestAccelEsc
@ -149,6 +155,11 @@ MyFrame::MyFrame(const wxString& title)
menuFile->Check(SkipDown, true);
menuFile->AppendSeparator();
menuFile->AppendCheckItem(UseTextCtrl, "Use &text control\tCtrl-T",
"Use wxTextCtrl or a simple wxWindow for input window"
);
menuFile->AppendSeparator();
menuFile->Append(QuitID, "E&xit\tAlt-X", "Quit this program");
// the "About" item should be in the help menu
@ -163,9 +174,7 @@ MyFrame::MyFrame(const wxString& title)
// ... and attach this menu bar to the frame
SetMenuBar(menuBar);
m_inputWin = new wxWindow(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 50),
wxRAISED_BORDER);
m_inputWin->SetBackgroundColour(*wxBLUE);
DoCreateInputWindow(false /* simple window initially */);
wxTextCtrl *headerText = new wxTextCtrl(this, wxID_ANY, "",
wxDefaultPosition, wxDefaultSize,
@ -212,6 +221,9 @@ MyFrame::MyFrame(const wxString& title)
Connect(SkipDown, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnSkipDown));
Connect(UseTextCtrl, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnUseTextCtrl));
Connect(TestAccelA, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnTestAccelA));
@ -221,17 +233,6 @@ MyFrame::MyFrame(const wxString& title)
Connect(TestAccelEsc, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnTestAccelEsc));
// connect event handlers for the blue input window
m_inputWin->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MyFrame::OnKeyDown),
NULL, this);
m_inputWin->Connect(wxEVT_KEY_UP, wxKeyEventHandler(MyFrame::OnKeyUp),
NULL, this);
m_inputWin->Connect(wxEVT_CHAR, wxKeyEventHandler(MyFrame::OnChar),
NULL, this);
m_inputWin->Connect(wxEVT_PAINT,
wxPaintEventHandler(MyFrame::OnPaintInputWin),
NULL, this);
// notice that we don't connect OnCharHook() to the input window, unlike
// the usual key events this one is propagated upwards
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MyFrame::OnCharHook));
@ -255,6 +256,47 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
wxOK | wxICON_INFORMATION, this);
}
void MyFrame::DoCreateInputWindow(bool text)
{
wxWindow* const oldWin = m_inputWin;
m_inputWin = text ? new wxTextCtrl(this, wxID_ANY, "Press keys here",
wxDefaultPosition, wxSize(-1, 50),
wxTE_MULTILINE)
: new wxWindow(this, wxID_ANY,
wxDefaultPosition, wxSize(-1, 50),
wxRAISED_BORDER);
m_inputWin->SetBackgroundColour(*wxBLUE);
m_inputWin->SetForegroundColour(*wxWHITE);
// connect event handlers for the blue input window
m_inputWin->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MyFrame::OnKeyDown),
NULL, this);
m_inputWin->Connect(wxEVT_KEY_UP, wxKeyEventHandler(MyFrame::OnKeyUp),
NULL, this);
m_inputWin->Connect(wxEVT_CHAR, wxKeyEventHandler(MyFrame::OnChar),
NULL, this);
if ( !text )
{
m_inputWin->Connect(wxEVT_PAINT,
wxPaintEventHandler(MyFrame::OnPaintInputWin),
NULL, this);
}
if ( oldWin )
{
GetSizer()->Replace(oldWin, m_inputWin);
Layout();
delete oldWin;
}
}
void MyFrame::OnUseTextCtrl(wxCommandEvent& event)
{
DoCreateInputWindow(event.IsChecked());
}
void MyFrame::OnPaintInputWin(wxPaintEvent& WXUNUSED(event))
{
wxPaintDC dc(m_inputWin);