diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index f9608c6eda3..53298be706e 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -6944,6 +6944,44 @@ fail: return -1; } +/*** + * DESCRIPTION: + * Checks item visibility. + * + * PARAMETER(S): + * [I] infoPtr : valid pointer to the listview structure + * [I] nFirst : item index to check for + * + * RETURN: + * Item visible : TRUE + * Item invisible or failure : FALSE + */ +static BOOL LISTVIEW_IsItemVisible(const LISTVIEW_INFO *infoPtr, INT nItem) +{ + POINT Origin, Position; + RECT rcItem; + HDC hdc; + BOOL ret; + + TRACE("nItem=%d\n", nItem); + + if (nItem < 0 || nItem >= DPA_GetPtrCount(infoPtr->hdpaItems)) return FALSE; + + LISTVIEW_GetOrigin(infoPtr, &Origin); + LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position); + rcItem.left = Position.x + Origin.x; + rcItem.top = Position.y + Origin.y; + rcItem.right = rcItem.left + infoPtr->nItemWidth; + rcItem.bottom = rcItem.top + infoPtr->nItemHeight; + + hdc = GetDC(infoPtr->hwndSelf); + if (!hdc) return FALSE; + ret = RectVisible(hdc, &rcItem); + ReleaseDC(infoPtr->hwndSelf, hdc); + + return ret; +} + /*** * DESCRIPTION: * Redraws a range of items. @@ -10340,6 +10378,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) /* case LVM_ISGROUPVIEWENABLED: */ + case LVM_ISITEMVISIBLE: + return LISTVIEW_IsItemVisible(infoPtr, (INT)wParam); + /* case LVM_MAPIDTOINDEX: */ /* case LVM_MAPINDEXTOID: */ diff --git a/include/commctrl.h b/include/commctrl.h index b064c01537d..6eb5f32f6c8 100644 --- a/include/commctrl.h +++ b/include/commctrl.h @@ -3252,6 +3252,7 @@ static const WCHAR WC_LISTVIEWW[] = { 'S','y','s', #define LVM_CANCELEDITLABEL (LVM_FIRST + 179) #define LVM_MAPINDEXTOID (LVM_FIRST + 180) #define LVM_MAPIDTOINDEX (LVM_FIRST + 181) +#define LVM_ISITEMVISIBLE (LVM_FIRST + 182) #define LVN_FIRST (0U-100U) #define LVN_LAST (0U-199U)