]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement constrained best size calculation in wxMSW wxListCtrl.
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 9 May 2012 14:24:47 +0000 (14:24 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 9 May 2012 14:24:47 +0000 (14:24 +0000)
This fixes wxListbook controller size to avoid spurious scrollbars.

Closes #13898.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71394 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/msw/listctrl.h
src/msw/listctrl.cpp

index 7e47a6716a7996f0cb4ecad6ca50750673c4df57..3f795ed8673c2a53daed25004c3683885b6fd5c8 100644 (file)
@@ -566,6 +566,7 @@ MSW:
 - Fix coordinate handling in wxDC::Blit() when source DC is a DIB.
 - Fix handling of composite windows in wxToolTip (Armel Asselin).
 - Add VT_I8 support to wxAutomationObject (PB).
+- Fix wxListbook size calculations to avoid spurious scrollbars.
 
 OSX:
 
index 75c30270be549118c96cbe55c34e7c3d56d5526a..a873d075461619f18909bf1806f6b6a666e4b680 100644 (file)
@@ -384,6 +384,14 @@ protected:
     // common part of all ctors
     void Init();
 
+    // Implement constrained best size calculation.
+    virtual int DoGetBestClientHeight(int width) const
+        { return MSWGetBestViewRect(width, -1).y; }
+    virtual int DoGetBestClientWidth(int height) const
+        { return MSWGetBestViewRect(-1, height).x; }
+
+    wxSize MSWGetBestViewRect(int x, int y) const;
+
     // Implement base class pure virtual methods.
     long DoInsertColumn(long col, const wxListItem& info);
 
index 3c3e797059c39eaabeffe36b91f82f187725035c..1b0a6c74ac70e41cc28d4cbdc271f44a87a9aa4a 100644 (file)
@@ -1333,6 +1333,29 @@ void wxListCtrl::AssignImageList(wxImageList *imageList, int which)
         m_ownsImageListState = true;
 }
 
+// ----------------------------------------------------------------------------
+// Geometry
+// ----------------------------------------------------------------------------
+
+wxSize wxListCtrl::MSWGetBestViewRect(int x, int y) const
+{
+    const DWORD rc = ListView_ApproximateViewRect(GetHwnd(), x, y, -1);
+
+    wxSize size(LOWORD(rc), HIWORD(rc));
+
+    // We have to add space for the scrollbars ourselves, they're not taken
+    // into account by ListView_ApproximateViewRect(), at least not with
+    // commctrl32.dll v6.
+    const DWORD mswStyle = ::GetWindowLong(GetHwnd(), GWL_STYLE);
+
+    if ( mswStyle & WS_HSCROLL )
+        size.y += wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y);
+    if ( mswStyle & WS_VSCROLL )
+        size.x += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
+
+    return size;
+}
+
 // ----------------------------------------------------------------------------
 // Operations
 // ----------------------------------------------------------------------------