From 69c7c9375c99ab99691e748b6e4b792ba9d45684 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Wed, 14 Aug 2013 15:47:21 +0000 Subject: [PATCH] Fix wxComboCtrlBase::DoGetSizeFromTextSize() performance regression. r72935 introduced code that created a temporary wxComboBox control to take measurements. This is very expensive in MSW and adds noticeable delay when creating more than a few controls. Replace with equivalent wxMSW code that computes the height in the same way other wxMSW controls do. The wxGTK version cannot be eliminated in the same way, so at least add some basic caching there. It's much less of a problem, because GTK+ controls creation is much cheaper than MSW one. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74658 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/combocmn.cpp | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index d76166d771..82d1657960 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -24,6 +24,10 @@ #include "wx/combo.h" +#ifdef __WXMSW__ +#include "wx/msw/private.h" +#endif + #if wxUSE_COMBOBOX #include "wx/combobox.h" extern WXDLLEXPORT_DATA(const char) wxComboBoxNameStr[] = "comboBox"; @@ -1370,15 +1374,31 @@ wxSize wxComboCtrlBase::DoGetSizeFromTextSize(int xlen, int ylen) const int fhei; -#if wxUSE_COMBOBOX && (defined(__WXMSW__) || defined(__WXGTK__)) \ - && !defined(__WXUNIVERSAL__) - wxComboBox* cb = new wxComboBox; - cb->Hide(); - cb->Create(const_cast(this), wxID_ANY); +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + fhei = EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight()); +#elif defined(__WXGTK__) && !defined(__WXUNIVERSAL__) + // Control creation is not entirely cheap, so cache the heights to + // avoid repeatedly creating dummy controls: + static wxString s_last_font; + static int s_last_fhei = -1; + wxString fontdesc; if ( m_font.IsOk() ) - cb->SetFont(m_font); - fhei = cb->GetBestSize().y; - cb->Destroy(); + fontdesc = m_font.GetNativeFontInfoDesc(); + if ( s_last_fhei != -1 && fontdesc == s_last_font ) + { + fhei = s_last_fhei; + } + else + { + wxComboBox* cb = new wxComboBox; + cb->Hide(); + cb->Create(const_cast(this), wxID_ANY); + if ( m_font.IsOk() ) + cb->SetFont(m_font); + s_last_font = fontdesc; + s_last_fhei = fhei = cb->GetBestSize().y; + cb->Destroy(); + } #else if ( m_font.IsOk() ) fhei = (m_font.GetPointSize()*2) + 5; -- 2.50.0