X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/017dc06b502c041c112a3948e6c5f65000a86d94..4e15d1caa03346c126015019c1fdf093033ef40b:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index b4f5be57ef..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__) @@ -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); }