comctl32: listview: make LVM_GETCOLUMNWIDTH query the header control
instead of using cached data (fixes bug #6805)
Mikołaj Zalewski
mikolaj at zalewski.pl
Sun Jun 3 17:29:16 CDT 2007
-------------- next part --------------
From 0301716133fff5496068884acc231cfbb4724d2e Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Miko=C5=82aj_Zalewski?= <mikolaj at zalewski.pl>
Date: Mon, 4 Jun 2007 00:26:46 +0200
Subject: [PATCH] comctl32: listview: make LVM_GETCOLUMNWIDTH query the header control
---
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;
}
--
1.4.4.2
More information about the wine-patches
mailing list