X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5a25f8581a6e11d4a7d61d40434a826a1a228d53..9967de02678d23a149183bc5908c7fadcd4f76eb:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 5007bc1d84..47ec9ab448 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -248,6 +248,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase) BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) EVT_CHAR(wxTextCtrl::OnChar) + EVT_KEY_DOWN(wxTextCtrl::OnKeyDown) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) #if wxUSE_RICHEDIT @@ -483,9 +484,19 @@ bool wxTextCtrl::MSWCreateText(const wxString& value, valueWin = value; } + // suppress events sent during control creation: we're called either from + // the ctor and then we shouldn't generate any events for compatibility + // with the other ports, or from SetWindowStyleFlag() and then we shouldn't + // generate the events because our text doesn't really change, the fact + // that we (sometimes) need to recreate the control is just an + // implementation detail + m_updatesCount = -2; + if ( !MSWCreateControl(windowClass.wx_str(), msStyle, pos, size, valueWin) ) return false; + m_updatesCount = -1; + #if wxUSE_RICHEDIT if (IsRich()) { @@ -1846,6 +1857,35 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) event.Skip(); } +void wxTextCtrl::OnKeyDown(wxKeyEvent& event) +{ + // richedit control doesn't send WM_PASTE, WM_CUT and WM_COPY messages + // when Ctrl-V, X or C is pressed and this prevents wxClipboardTextEvent + // from working. So we work around it by intercepting these shortcuts + // ourselves and emitting clipboard events (which richedit will handle, + // so everything works as before, including pasting of rich text): + if ( event.GetModifiers() == wxMOD_CONTROL && IsRich() ) + { + switch ( event.GetKeyCode() ) + { + case 'C': + Copy(); + return; + case 'X': + Cut(); + return; + case 'V': + Paste(); + return; + default: + break; + } + } + + // no, we didn't process it + event.Skip(); +} + WXLRESULT wxTextCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { WXLRESULT lRc = wxTextCtrlBase::MSWWindowProc(nMsg, wParam, lParam);