From fca418ae12286d47a0e8490185daa84fde9f20e9 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 12 Jul 2006 21:44:34 +0000 Subject: [PATCH] call SetHorizontalExtent() from SetString(); also simplified/cleaned up the former function and call InvalidateBestSize() from it automatically now git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40077 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/listbox.h | 7 ++-- src/msw/listbox.cpp | 85 ++++++++++++++++------------------------ 2 files changed, 38 insertions(+), 54 deletions(-) diff --git a/include/wx/msw/listbox.h b/include/wx/msw/listbox.h index bd32aa8401..afe5f34d1e 100644 --- a/include/wx/msw/listbox.h +++ b/include/wx/msw/listbox.h @@ -105,9 +105,10 @@ public: int GetItemIndex(wxOwnerDrawn *item) const { return m_aItems.Index(item); } #endif // wxUSE_OWNER_DRAWN - // Windows-specific code to set the horizontal extent of the listbox, if - // necessary. If s is non-NULL, it's used to calculate the horizontal - // extent. Otherwise, all strings are used. + // Windows-specific code to update the horizontal extent of the listbox, if + // necessary. If s is non-empty, the horizontal extent is increased to the + // length of this string if it's currently too short, otherwise the maximum + // extent of all strings is used. In any case calls InvalidateBestSize() virtual void SetHorizontalExtent(const wxString& s = wxEmptyString); // Windows callbacks diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index 0801c0fc79..bc989f5d32 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -275,8 +275,6 @@ void wxListBox::Delete(unsigned int n) m_noItems--; SetHorizontalExtent(wxEmptyString); - - InvalidateBestSize(); } int wxListBox::DoAppend(const wxString& item) @@ -296,7 +294,6 @@ int wxListBox::DoAppend(const wxString& item) SetHorizontalExtent(item); - InvalidateBestSize(); return index; } @@ -344,8 +341,6 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) // show the listbox back if we hid it ShowWindow(GetHwnd(), SW_SHOW); } - - InvalidateBestSize(); } int wxListBox::FindString(const wxString& s, bool bCase) const @@ -369,8 +364,6 @@ void wxListBox::Clear() m_noItems = 0; SetHorizontalExtent(); - - InvalidateBestSize(); } void wxListBox::Free() @@ -547,8 +540,6 @@ wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos) m_noItems += nItems; SetHorizontalExtent(); - - InvalidateBestSize(); } int wxListBox::DoListHitTest(const wxPoint& point) const @@ -606,7 +597,7 @@ void wxListBox::SetString(unsigned int n, const wxString& s) if ( wasSelected ) Select(n); - InvalidateBestSize(); + SetHorizontalExtent(); } unsigned int wxListBox::GetCount() const @@ -615,64 +606,56 @@ unsigned int wxListBox::GetCount() const } // ---------------------------------------------------------------------------- -// helpers +// size-related stuff // ---------------------------------------------------------------------------- -// Windows-specific code to set the horizontal extent of the listbox, if -// necessary. If s is non-NULL, it's used to calculate the horizontal extent. -// Otherwise, all strings are used. void wxListBox::SetHorizontalExtent(const wxString& s) { - // Only necessary if we want a horizontal scrollbar - if (!(m_windowStyle & wxHSCROLL)) + // in any case, our best size could have changed + InvalidateBestSize(); + + // the rest is only necessary if we want a horizontal scrollbar + if ( !HasFlag(wxHSCROLL) ) return; - TEXTMETRIC lpTextMetric; - if ( !s.empty() ) - { - int existingExtent = (int)SendMessage(GetHwnd(), LB_GETHORIZONTALEXTENT, 0, 0L); - HDC dc = GetWindowDC(GetHwnd()); - HFONT oldFont = 0; - if (GetFont().Ok() && GetFont().GetResourceHandle() != 0) - oldFont = (HFONT) ::SelectObject(dc, (HFONT) GetFont().GetResourceHandle()); - - GetTextMetrics(dc, &lpTextMetric); - SIZE extentXY; - ::GetTextExtentPoint32(dc, (LPTSTR) (const wxChar *)s, s.length(), &extentXY); - int extentX = (int)(extentXY.cx + lpTextMetric.tmAveCharWidth); - if (oldFont) - ::SelectObject(dc, oldFont); + WindowHDC dc(GetHwnd()); + SelectInHDC selFont(dc, GetHfontOf(GetFont())); - ReleaseDC(GetHwnd(), dc); - if (extentX > existingExtent) - SendMessage(GetHwnd(), LB_SETHORIZONTALEXTENT, LOWORD(extentX), 0L); - } - else - { - int largestExtent = 0; - HDC dc = GetWindowDC(GetHwnd()); - HFONT oldFont = 0; - if (GetFont().Ok() && GetFont().GetResourceHandle() != 0) - oldFont = (HFONT) ::SelectObject(dc, (HFONT) GetFont().GetResourceHandle()); + TEXTMETRIC lpTextMetric; + ::GetTextMetrics(dc, &lpTextMetric); - GetTextMetrics(dc, &lpTextMetric); + int largestExtent = 0; + SIZE extentXY; - for (unsigned int i = 0; i < m_noItems; i++) + if ( s.empty() ) + { + // set extent to the max length of all strings + for ( unsigned int i = 0; i < m_noItems; i++ ) { - wxString str = GetString(i); - SIZE extentXY; + const wxString str = GetString(i); ::GetTextExtentPoint32(dc, str.c_str(), str.length(), &extentXY); + int extentX = (int)(extentXY.cx + lpTextMetric.tmAveCharWidth); - if (extentX > largestExtent) + if ( extentX > largestExtent ) largestExtent = extentX; } - if (oldFont) - ::SelectObject(dc, oldFont); + } + else // just increase the extent to the length of this string + { + int existingExtent = (int)SendMessage(GetHwnd(), + LB_GETHORIZONTALEXTENT, 0, 0L); - ReleaseDC(GetHwnd(), dc); - SendMessage(GetHwnd(), LB_SETHORIZONTALEXTENT, LOWORD(largestExtent), 0L); + ::GetTextExtentPoint32(dc, s.c_str(), s.length(), &extentXY); + + int extentX = (int)(extentXY.cx + lpTextMetric.tmAveCharWidth); + if ( extentX > existingExtent ) + largestExtent = extentX; } + + if ( largestExtent ) + SendMessage(GetHwnd(), LB_SETHORIZONTALEXTENT, LOWORD(largestExtent), 0L); + //else: it shouldn't change } wxSize wxListBox::DoGetBestSize() const -- 2.45.2