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))
void OnChar(wxKeyEvent& event) { LogEvent("Char", event); }
void OnCharHook(wxKeyEvent& event)
{
+ // The logged messages can be confusing if the input window doesn't
+ // have focus so warn about this.
+ if ( !m_inputWin->HasFocus() )
+ {
+ m_logText->SetDefaultStyle(*wxRED);
+ m_logText->AppendText("WARNING: focus is not on input window, "
+ "non-hook events won't be logged.\n");
+ m_logText->SetDefaultStyle(wxTextAttr());
+ }
+
LogEvent("Hook", event);
if ( m_skipHook )
event.Skip();
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,
ClearID = wxID_CLEAR,
SkipHook = 100,
SkipDown,
+ UseTextCtrl,
TestAccelA,
TestAccelCtrlA,
TestAccelEsc
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
// ... 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,
m_logText = new wxTextCtrl(this, wxID_ANY, "",
wxDefaultPosition, wxDefaultSize,
- wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL);
+ wxTE_MULTILINE|wxTE_READONLY|wxTE_RICH|wxHSCROLL);
// set monospace font to have output in nice columns
wxFont font(10, wxFONTFAMILY_TELETYPE,
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));
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));
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);