COLORREF backcolor, textcolor;
/* apparently, for selected items, we have to override the returned values */
- if (!SubItem)
+ if (!SubItem || (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
{
if (lpnmlvcd->nmcd.uItemState & CDIS_SELECTED)
{
while (iterator_next(subitems))
{
DWORD subitemstage = CDRF_DODEFAULT;
+ NMLVCUSTOMDRAW temp_nmlvcd;
/* We need to query for each subitem, item's data (subitem == 0) is already here at this point */
if (subitems->nItem)
if (cdsubitemmode & CDRF_NOTIFYSUBITEMDRAW)
subitemstage = notify_customdraw(infoPtr, CDDS_SUBITEM | CDDS_ITEMPREPAINT, &nmlvcd);
- if (subitems->nItem == 0 || (cdmode & CDRF_NOTIFYITEMDRAW))
- prepaint_setup(infoPtr, hdc, &nmlvcd, FALSE);
- else if (!(infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
- prepaint_setup(infoPtr, hdc, &nmlvcd, TRUE);
+ /*
+ * A selection should neither affect the colors in the post paint notification nor
+ * affect the colors of the next drawn subitem. Copy the structure to prevent this.
+ */
+ temp_nmlvcd = nmlvcd;
+ prepaint_setup(infoPtr, hdc, &temp_nmlvcd, subitems->nItem);
if (!(subitemstage & CDRF_SKIPDEFAULT))
- LISTVIEW_DrawItemPart(infoPtr, &lvItem, &nmlvcd, &pos);
+ LISTVIEW_DrawItemPart(infoPtr, &lvItem, &temp_nmlvcd, &pos);
if (subitemstage & CDRF_NOTIFYPOSTPAINT)
subitemstage = notify_customdraw(infoPtr, CDDS_SUBITEM | CDDS_ITEMPOSTPAINT, &nmlvcd);