X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6c6b938377211da1987c8b6e44134fb0f32c84df..4e15d1caa03346c126015019c1fdf093033ef40b:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 4f02fbaf85..66473a3e26 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -64,10 +64,6 @@ #if wxUSE_RICHEDIT -#if wxUSE_INKEDIT -#include "wx/dynlib.h" -#endif - // old mingw32 has richedit stuff directly in windows.h and doesn't have // richedit.h at all #if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__) @@ -427,7 +423,7 @@ bool wxTextCtrl::MSWCreateText(const wxString& value, // implementation detail m_updatesCount = -2; - if ( !MSWCreateControl(windowClass.wx_str(), msStyle, pos, size, valueWin) ) + if ( !MSWCreateControl(windowClass.t_str(), msStyle, pos, size, valueWin) ) return false; m_updatesCount = -1; @@ -1109,7 +1105,7 @@ void wxTextCtrl::DoWriteText(const wxString& value, int flags) ::SendMessage(GetHwnd(), selectionOnly ? EM_REPLACESEL : WM_SETTEXT, // EM_REPLACESEL takes 1 to indicate the operation should be redoable - selectionOnly ? 1 : 0, (LPARAM)valueDos.wx_str()); + selectionOnly ? 1 : 0, wxMSW_CONV_LPARAM(valueDos)); if ( !ucf.GotUpdate() && (flags & SetValue_SendEvent) ) { @@ -2106,18 +2102,42 @@ bool wxTextCtrl::AcceptsFocusFromKeyboard() const } wxSize wxTextCtrl::DoGetBestSize() const +{ + return DoGetSizeFromTextSize( DEFAULT_ITEM_WIDTH ); +} + +wxSize wxTextCtrl::DoGetSizeFromTextSize(int xlen, int ylen) const { int cx, cy; wxGetCharSize(GetHWND(), &cx, &cy, GetFont()); - int wText = DEFAULT_ITEM_WIDTH; + DWORD wText = 1; + ::SystemParametersInfo(SPI_GETCARETWIDTH, 0, &wText, 0); + wText += xlen; int hText = cy; if ( m_windowStyle & wxTE_MULTILINE ) { - hText *= wxMax(wxMin(GetNumberOfLines(), 10), 2); + // add space for vertical scrollbar + if ( !(m_windowStyle & wxTE_NO_VSCROLL) ) + wText += ::GetSystemMetrics(SM_CXVSCROLL); + + if ( ylen <= 0 ) + { + hText *= wxMax(wxMin(GetNumberOfLines(), 10), 2); + // add space for horizontal scrollbar + if ( m_windowStyle & wxHSCROLL ) + hText += ::GetSystemMetrics(SM_CYHSCROLL); + } + } + // for single line control cy (height + external leading) is ok + else + { + // Add the margins we have previously set + wxPoint marg( GetMargins() ); + wText += wxMax(0, marg.x); + hText += wxMax(0, marg.y); } - //else: for single line control everything is ok // Text controls without border are special and have the same height as // static labels (they also have the same appearance when they're disable @@ -2126,11 +2146,18 @@ wxSize wxTextCtrl::DoGetBestSize() const // stand out). if ( !HasFlag(wxBORDER_NONE) ) { + wText += 9; // borders and inner margins + // we have to add the adjustments for the control height only once, not // once per line, so do it after multiplication above hText += EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy) - cy; } + // Perhaps the user wants something different from CharHeight, or ylen + // is used as the height of a multiline text. + if ( ylen > 0 ) + hText += ylen - GetCharHeight(); + return wxSize(wText, hText); }