[2/3] comctl32/listview: Fix hittesting for "small" positive Y coordinates
Nikolay Sivov
bunglehead at gmail.com
Mon Jul 6 18:52:38 CDT 2009
Changelog:
- Fix hittesting for "small" positive Y coordinates
>From 7d2395b3689de0389733cca6df49800351912352 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <bunglehead at gmail.com>
Date: Tue, 7 Jul 2009 03:28:53 +0400
Subject: Fix hittesting for "small" positive Y coordinates
---
dlls/comctl32/listview.c | 28 +++++++++++++++++++++-------
dlls/comctl32/tests/listview.c | 18 +++++++++---------
2 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 2a66152..24da77d 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -6814,6 +6814,16 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
/* LVM_SUBITEMHITTEST checks left bound of possible client area */
if (infoPtr->rcList.left > lpht->pt.x && Origin.x < lpht->pt.x)
lpht->flags |= LVHT_TOLEFT;
+
+ if (lpht->pt.y < infoPtr->rcList.top && lpht->pt.y >= 0)
+ opt.y = lpht->pt.y + infoPtr->rcList.top;
+ else
+ opt.y = lpht->pt.y;
+
+ if (infoPtr->rcList.top > opt.y)
+ lpht->flags |= LVHT_ABOVE;
+ else if (infoPtr->rcList.bottom < opt.y)
+ lpht->flags |= LVHT_BELOW;
}
else
{
@@ -6821,12 +6831,12 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
lpht->flags |= LVHT_TOLEFT;
else if (infoPtr->rcList.right < lpht->pt.x)
lpht->flags |= LVHT_TORIGHT;
+
+ if (infoPtr->rcList.top > lpht->pt.y)
+ lpht->flags |= LVHT_ABOVE;
+ else if (infoPtr->rcList.bottom < lpht->pt.y)
+ lpht->flags |= LVHT_BELOW;
}
-
- if (infoPtr->rcList.top > lpht->pt.y)
- lpht->flags |= LVHT_ABOVE;
- else if (infoPtr->rcList.bottom < lpht->pt.y)
- lpht->flags |= LVHT_BELOW;
/* even if item is invalid try to find subitem */
if (infoPtr->uView == LV_VIEW_DETAILS && subitem)
@@ -6883,8 +6893,12 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, NULL, &rcIcon, &rcState, &rcLabel);
LISTVIEW_GetItemOrigin(infoPtr, iItem, &Position);
opt.x = lpht->pt.x - Position.x - Origin.x;
- opt.y = lpht->pt.y - Position.y - Origin.y;
-
+
+ if (lpht->pt.y < infoPtr->rcList.top && lpht->pt.y >= 0)
+ opt.y = lpht->pt.y - Position.y - Origin.y + infoPtr->rcList.top;
+ else
+ opt.y = lpht->pt.y - Position.y - Origin.y;
+
if (infoPtr->uView == LV_VIEW_DETAILS)
{
rcBounds = rcBox;
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 98c31c4..fd0e55c 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -2663,7 +2663,7 @@ static void test_hittest(void)
test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, FALSE, TRUE, __LINE__);
- test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
/* outside possible client rectangle (to right) */
x = pos.x + 500;
y = pos.y + (bounds.bottom - bounds.top) / 2;
@@ -2671,7 +2671,7 @@ static void test_hittest(void)
test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, FALSE, TRUE, __LINE__);
- test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, TRUE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE, __LINE__);
/* subitem returned with -1 item too */
x = pos.x + 150;
y = -10;
@@ -2684,7 +2684,7 @@ static void test_hittest(void)
test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
test_lvm_hittest(hwnd, x, y, -1, LVHT_NOWHERE, FALSE, TRUE, __LINE__);
- test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
/* the same with LVS_EX_FULLROWSELECT */
SendMessage(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
x = pos.x + 150; /* outside column */
@@ -2692,7 +2692,7 @@ static void test_hittest(void)
test_lvm_hittest(hwnd, x, y, 0, LVHT_ONITEM, FALSE, FALSE, __LINE__);
test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
- test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
MoveWindow(hwnd, 0, 0, 100, 100, FALSE);
x = pos.x + 150; /* outside column */
y = pos.y + (bounds.bottom - bounds.top) / 2;
@@ -2700,7 +2700,7 @@ static void test_hittest(void)
test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, FALSE, TRUE, __LINE__);
- test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
/* outside possible client rectangle (to right) */
x = pos.x + 500;
y = pos.y + (bounds.bottom - bounds.top) / 2;
@@ -2708,7 +2708,7 @@ static void test_hittest(void)
test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, FALSE, TRUE, __LINE__);
- test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, TRUE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE, __LINE__);
/* try with icons, state icons index is 1 based so at least 2 bitmaps needed */
himl = ImageList_Create(16, 16, 0, 4, 4);
ok(himl != NULL, "failed to create imagelist\n");
@@ -2736,7 +2736,7 @@ static void test_hittest(void)
test_lvm_hittest(hwnd, x, y, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, __LINE__);
test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
- test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, TRUE, FALSE, FALSE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, FALSE, __LINE__);
/* state icons indices are 1 based, check with valid index */
item.mask = LVIF_STATE;
@@ -2752,7 +2752,7 @@ static void test_hittest(void)
test_lvm_hittest(hwnd, x, y, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, __LINE__);
test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
- test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, TRUE, FALSE, FALSE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, FALSE, __LINE__);
himl2 = (HIMAGELIST)SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_STATE, (LPARAM)NULL);
ok(himl2 == himl, "should return handle\n");
@@ -2765,7 +2765,7 @@ static void test_hittest(void)
test_lvm_hittest(hwnd, x, y, 0, LVHT_ONITEMICON, FALSE, FALSE, __LINE__);
test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMICON, FALSE, FALSE, FALSE, __LINE__);
y = (bounds.bottom - bounds.top) / 2;
- test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMICON, TRUE, FALSE, TRUE, __LINE__);
+ test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMICON, FALSE, FALSE, FALSE, __LINE__);
DestroyWindow(hwnd);
}
--
1.5.6.5
More information about the wine-patches
mailing list