Mikołaj Zalewski : comctl32: listview: Make LVM_GETCOLUMNWIDTH query the header control instead of using cached data .

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 4 08:14:35 CDT 2007


Module: wine
Branch: master
Commit: a1b55be6935a6a3b44fff69eed6dfdee53d217f7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a1b55be6935a6a3b44fff69eed6dfdee53d217f7

Author: Mikołaj Zalewski <mikolaj at zalewski.pl>
Date:   Mon Jun  4 00:26:46 2007 +0200

comctl32: listview: Make LVM_GETCOLUMNWIDTH query the header control instead of using cached data.

---

 dlls/comctl32/listview.c |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 38f9c18..ba94aec 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -5147,7 +5147,7 @@ static BOOL LISTVIEW_GetColumnOrderArray(const LISTVIEW_INFO *infoPtr, INT iCoun
 static INT LISTVIEW_GetColumnWidth(const LISTVIEW_INFO *infoPtr, INT nColumn)
 {
     INT nColumnWidth = 0;
-    RECT rcHeader;
+    HDITEMW hdItem;
 
     TRACE("nColumn=%d\n", nColumn);
 
@@ -5158,9 +5158,19 @@ static INT LISTVIEW_GetColumnWidth(const LISTVIEW_INFO *infoPtr, INT nColumn)
 	nColumnWidth = infoPtr->nItemWidth;
 	break;
     case LVS_REPORT:
-	if (nColumn < 0 || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return 0;
-	LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcHeader);
-	nColumnWidth = rcHeader.right - rcHeader.left;
+	/* We are not using LISTVIEW_GetHeaderRect as this data is updated only after a HDM_ITEMCHANGED.
+	 * There is an application that subclasses the listview, calls LVM_GETCOLUMNWIDTH in the
+	 * HDM_ITEMCHANGED handler and goes into infinite recursion if it receives old data.
+	 *
+	 * TODO: should we do the same in LVM_GETCOLUMN?
+	 */
+	hdItem.mask = HDI_WIDTH;
+	if (!SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nColumn, (LPARAM)&hdItem))
+	{
+	    WARN("(%p): HDM_GETITEMW failed for item %d\n", infoPtr->hwndSelf, nColumn);
+	    return 0;
+	}
+	nColumnWidth = hdItem.cxy;
 	break;
     }
 




More information about the wine-cvs mailing list