As pointed out by Dimitrie, the MS docs do specify that for LISTVIEW_GetSubItemRect, LVIR_LABEL and LVIR_BOUNDS should return the same values.
Testing on WinNT shows that for non-zero subitems, which are the only correct documented values, this is true. For subitem '0', WinNT just passes the call on to LISTVIEW_GetItemRect.
So the only fix to LISTVIEW_GetSubItemRect that remains is to change the offset that is applied. This is needed because the LISTVIEW_GetItemPosition call that is used returns a position that already includes the origin. This differs from what is returned by LISTVIEW_GetItemOrigin that is used in LISTVIEW_GetItemRect to get the item position.
Changelog:
Report mode padding tweaks.
Fix to LISTVIEW_GetSubItemRect.
Index: dlls/comctl32/listview.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/listview.c,v retrieving revision 1.333 diff -u -r1.333 listview.c --- dlls/comctl32/listview.c 10 Dec 2002 19:07:27 -0000 1.333 +++ dlls/comctl32/listview.c 20 Dec 2002 17:57:46 -0000 @@ -329,10 +329,10 @@ #define LISTVIEW_SCROLL_ICON_LINE_SIZE 37 /* Padding betwen image and label */ -#define IMAGE_PADDING 2 +#define IMAGE_PADDING 0 /* Padding behind the label */ -#define TRAILING_PADDING 5 +#define TRAILING_PADDING 10 /* Border for the icon caption */ #define CAPTION_BORDER 2 @@ -1684,7 +1684,7 @@ } else /* LVS_REPORT */ { - lpptPosition->x = REPORT_MARGINX; + lpptPosition->x = 0; lpptPosition->y = nItem * infoPtr->nItemHeight; } } @@ -1788,9 +1788,9 @@ State.left = Box.left; if (uView == LVS_REPORT) { - State.left += REPORT_MARGINX; if (lpLVItem->iSubItem == 0) { + State.left += REPORT_MARGINX; assert(lpLVItem->mask & LVIF_INDENT); State.left += infoPtr->iconSize.cx * lpLVItem->iIndent; } @@ -1853,7 +1853,6 @@ if (uView == LVS_REPORT) { if (lpLVItem->iSubItem == 0) Label = lpColumnInfo->rcHeader; - Label.right -= REPORT_MARGINX; } if (lpLVItem->iSubItem || ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && uView == LVS_REPORT)) @@ -3556,7 +3555,12 @@ default: uFormat |= DT_LEFT; } } - if (!(uFormat & (DT_RIGHT | DT_CENTER))) rcLabel.left += 2; + if (!(uFormat & (DT_RIGHT | DT_CENTER))) + { + if (himl && lvItem.iImage >= 0 && !IsRectEmpty(&rcIcon)) rcLabel.left += 2; + else rcLabel.left += 5; + } + else if (uFormat & DT_RIGHT) rcLabel.right -= 5; DrawTextW(hdc, lvItem.pszText, -1, &rcLabel, uFormat); postpaint: @@ -5204,14 +5208,16 @@ */ static BOOL LISTVIEW_GetSubItemRect(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprc) { - POINT Position, Origin; + POINT Position; LVITEMW lvItem; if (!lprc || (infoPtr->dwStyle & LVS_TYPEMASK) != LVS_REPORT) return FALSE; TRACE("(nItem=%d, nSubItem=%d)\n", nItem, lprc->top); + /* On WinNT, a subitem of '0' calls LISTVIEW_GetItemRect */ + if (lprc->top == 0) + return LISTVIEW_GetItemRect(infoPtr, nItem, lprc); - LISTVIEW_GetOrigin(infoPtr, &Origin); if (!LISTVIEW_GetItemPosition(infoPtr, nItem, &Position)) return FALSE; lvItem.mask = lprc->top == 0 ? LVIF_INDENT : 0; @@ -5235,7 +5241,7 @@ return FALSE; } - OffsetRect(lprc, Position.x + Origin.x, Position.y + Origin.y); + OffsetRect(lprc, Position.x, Position.y); return TRUE; } @@ -6307,7 +6313,7 @@ SIZE size; if (GetTextExtentPoint32W(hdc, hdi.pszText, lstrlenW(hdi.pszText), &size)) - cx = size.cx; + cx = size.cx + 11; /* FIXME: Take into account the header image, if one is present */ SelectObject(hdc, old_font); ReleaseDC(infoPtr->hwndSelf, hdc);