X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..d38d271fa63aa59d8531710b4c143ecf33fbb819:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 82f29026b7..49e3c4ed43 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -378,29 +378,34 @@ wxString wxTextCtrl::GetValue() const #if wxUSE_RICHEDIT if ( m_isRich ) { - int len = GetWindowTextLength(GetHwnd()) + 1; - wxString str; - wxChar *p = str.GetWriteBuf(len); - TEXTRANGE textRange; - textRange.chrg.cpMin = 0; - textRange.chrg.cpMax = -1; - textRange.lpstrText = p; + int len = GetWindowTextLength(GetHwnd()); + if ( len ) + { + // alloc one extra WORD as needed by the control + wxChar *p = str.GetWriteBuf(++len); - (void)SendMessage(GetHwnd(), EM_GETTEXTRANGE, 0, (LPARAM)&textRange); + TEXTRANGE textRange; + textRange.chrg.cpMin = 0; + textRange.chrg.cpMax = -1; + textRange.lpstrText = p; - // believe it or not, but EM_GETTEXTRANGE uses just CR ('\r') for the - // newlines which is neither Unix nor Windows style (Win95 with - // riched20.dll shows this behaviour) - convert it to something - // reasonable - for ( ; *p; p++ ) - { - if ( *p == _T('\r') ) - *p = _T('\n'); - } + (void)SendMessage(GetHwnd(), EM_GETTEXTRANGE, 0, (LPARAM)&textRange); - str.UngetWriteBuf(); + // believe it or not, but EM_GETTEXTRANGE uses just CR ('\r') for + // the newlines which is neither Unix nor Windows style (Win95 with + // riched20.dll shows this behaviour) - convert it to something + // reasonable + for ( ; *p; p++ ) + { + if ( *p == _T('\r') ) + *p = _T('\n'); + } + + str.UngetWriteBuf(); + } + //else: no text at all, leave the string empty return str; } @@ -493,7 +498,7 @@ bool wxTextCtrl::CanCopy() const // Can copy if there's a selection long from, to; GetSelection(& from, & to); - return (from != to); + return (from != to) ; } bool wxTextCtrl::CanCut() const @@ -501,7 +506,7 @@ bool wxTextCtrl::CanCut() const // Can cut if there's a selection long from, to; GetSelection(& from, & to); - return (from != to); + return (from != to) && (IsEditable()); } bool wxTextCtrl::CanPaste() const @@ -822,7 +827,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const wxString str; wxChar *buf = str.GetWriteBuf(len); - *(WORD *)buf = len; + *(WORD *)buf = (WORD)len; len = (size_t)::SendMessage(GetHwnd(), EM_GETLINE, lineNo, (LPARAM)buf); buf[len] = 0; @@ -962,10 +967,10 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) return TRUE; } -WXHBRUSH wxTextCtrl::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, - WXUINT message, - WXWPARAM wParam, - WXLPARAM lParam) +WXHBRUSH wxTextCtrl::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED(nCtlColor), + WXUINT WXUNUSED(message), + WXWPARAM WXUNUSED(wParam), + WXLPARAM WXUNUSED(lParam)) { #if wxUSE_CTL3D if ( m_useCtl3D ) @@ -1074,7 +1079,7 @@ wxSize wxTextCtrl::DoGetBestSize() const int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); if ( m_windowStyle & wxTE_MULTILINE ) { - hText *= wxMin(GetNumberOfLines(), 5); + hText *= wxMax(GetNumberOfLines(), 5); } //else: for single line control everything is ok