listview expert required
Dimitrie O. Paun
dpaun at rogers.com
Sat Aug 23 10:04:48 CDT 2003
On August 23, 2003 04:32 am, Eric Pouech wrote:
> listview: multicolumn, in report mode, without LVS_EX_FULLROWSELECT
> extended style
>
> message concerned:
> NM_CLICK notification for left click in LV (mainly in a column for any
> subitem)
>
> native:
> iItem: always set to -1
> iSubItem: set to the subItem of the column clicked
>
> builtin:
> iItem: set to the row number
> iSubItem: always set to 0
>
> (Note: I don't like either the iItem value I get from the native DLL
> (didn't test LVM_GETITEMHITTEST information though)
Can you please give this one a try? Sorry, my Wine crashes ATM so
I can not test, but I hope it Index: dlls/comctl32/listview.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/listview.c,v
retrieving revision 1.357
diff -u -r1.357 listview.c
--- dlls/comctl32/listview.c 24 Jul 2003 00:03:13 -0000 1.357
+++ dlls/comctl32/listview.c 23 Aug 2003 15:02:54 -0000
@@ -5768,6 +5768,7 @@
POINT Origin, Position, opt;
LVITEMW lvItem;
ITERATOR i;
+ INT iItem;
TRACE("(pt=%s, subitem=%d, select=%d)\n", debugpoint(&lpht->pt), subitem, select);
@@ -5800,17 +5801,17 @@
iterator_frameditems(&i, infoPtr, &rcSearch);
iterator_next(&i); /* go to first item in the sequence */
- lpht->iItem = i.nItem;
+ iItem = i.nItem;
iterator_destroy(&i);
- TRACE("lpht->iItem=%d\n", lpht->iItem);
- if (lpht->iItem == -1) return -1;
+ TRACE("lpht->iItem=%d\n", iItem);
+ if (iItem == -1) return -1;
lvItem.mask = LVIF_STATE | LVIF_TEXT;
if (uView == LVS_REPORT) lvItem.mask |= LVIF_INDENT;
lvItem.stateMask = LVIS_STATEIMAGEMASK;
if (uView == LVS_ICON) lvItem.stateMask |= LVIS_FOCUSED;
- lvItem.iItem = lpht->iItem;
+ lvItem.iItem = iItem;
lvItem.iSubItem = 0;
lvItem.pszText = szDispText;
lvItem.cchTextMax = DISP_TEXT_SIZE;
@@ -5818,11 +5819,11 @@
if (!infoPtr->bFocus) lvItem.state &= ~LVIS_FOCUSED;
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, &rcState, &rcIcon, &rcLabel);
- LISTVIEW_GetItemOrigin(infoPtr, lpht->iItem, &Position);
+ LISTVIEW_GetItemOrigin(infoPtr, iItem, &Position);
opt.x = lpht->pt.x - Position.x - Origin.x;
opt.y = lpht->pt.y - Position.y - Origin.y;
- if (uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
+ if (uView == LVS_REPORT)
rcBounds = rcBox;
else
UnionRect(&rcBounds, &rcIcon, &rcLabel);
@@ -5839,7 +5840,7 @@
lpht->flags &= ~LVHT_NOWHERE;
TRACE("lpht->flags=0x%x\n", lpht->flags);
- if (uView == LVS_REPORT && lpht->iItem != -1 && subitem)
+ if (uView == LVS_REPORT && subitem)
{
INT j;
@@ -5856,12 +5857,12 @@
}
}
- if (!select || lpht->iItem == -1) return lpht->iItem;
-
- if (uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT)) return lpht->iItem;
-
- if (uView == LVS_REPORT) UnionRect(&rcBounds, &rcIcon, &rcLabel);
- return PtInRect(&rcBounds, opt) ? lpht->iItem : -1;
+ if (select && !(uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT)))
+ {
+ if (uView == LVS_REPORT) UnionRect(&rcBounds, &rcIcon, &rcLabel);
+ if (!PtInRect(&rcBounds, opt)) iItem = -1;
+ }
+ return lpht->iItem = iItem;
}
implements what you described.
--
Dimi.
More information about the wine-devel
mailing list