]> git.saurik.com Git - wxWidgets.git/commitdiff
wxMSW: Fix incorrect subitem rect calculation in wxListCtrl.
authorVáclav Slavík <vslavik@fastmail.fm>
Fri, 7 Sep 2012 09:51:10 +0000 (09:51 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Fri, 7 Sep 2012 09:51:10 +0000 (09:51 +0000)
HandleSubItemPrepaint() calls wxGetListCtrlSubItemRect() (a thin
replacement of ListView_GetSubItemRect) with subitem argument
corresponding to MSDN documentation: it should be 0 for the whole item
and 1-based for subitems.

Unfortunately, as pointed out in an explanatory comment for
wxGetListCtrlSubItemRect(), MSDN lies and the index actually is 0-based.

The bug causes wxListCtrl's content to be shifted by one column and
rendered with additional artifacts as soon as custom drawing is used,
e.g. when a custom font is used.

This bug was introduced in r55378; the code correctly accounted for this
before that. This change partially reverts that commit.

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

src/msw/listctrl.cpp

index 5a605efb8e40d6b98d3ade72859e398c934fb46e..abfdf8db8917d93da59b028587687e8341cefbbb 100644 (file)
@@ -2661,10 +2661,21 @@ bool HandleSubItemPrepaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont, int colCount)
     SelectInHDC selFont(hdc, hfont);
 
     // get the rectangle to paint
-    int subitem = colCount ? col + 1 : col;
     RECT rc;
-    wxGetListCtrlSubItemRect(hwndList, item, subitem, LVIR_BOUNDS, rc);
-    rc.left += 6;
+    wxGetListCtrlSubItemRect(hwndList, item, col, LVIR_BOUNDS, rc);
+    if ( !col && colCount > 1 )
+    {
+        // ListView_GetSubItemRect() returns the entire item rect for 0th
+        // subitem while we really need just the part for this column
+        RECT rc2;
+        wxGetListCtrlSubItemRect(hwndList, item, 1, LVIR_BOUNDS, rc2);
+        rc.right = rc2.left;
+        rc.left += 4;
+    }
+    else // not first subitem
+    {
+        rc.left += 6;
+    }
 
     // get the image and text to draw
     wxChar text[512];