Beginning of some simple optimization of the listview

drawing. Specifically it reduces flicker when selection changes.
This commit is contained in:
Aric Stewart 2000-08-21 20:16:53 +00:00 committed by Alexandre Julliard
parent 62f3eaa782
commit 59dae22a43
1 changed files with 55 additions and 8 deletions

View File

@ -2401,6 +2401,7 @@ static BOOL LISTVIEW_SetItem(HWND hwnd, LPLVITEMA lpLVItem)
UINT uChanged; UINT uChanged;
UINT uView = lStyle & LVS_TYPEMASK; UINT uView = lStyle & LVS_TYPEMASK;
INT item_width; INT item_width;
RECT rcItem;
if (lStyle & LVS_OWNERDATA) if (lStyle & LVS_OWNERDATA)
{ {
@ -2451,6 +2452,10 @@ static BOOL LISTVIEW_SetItem(HWND hwnd, LPLVITEMA lpLVItem)
nmlv.hdr.code = LVN_ITEMCHANGED; nmlv.hdr.code = LVN_ITEMCHANGED;
ListView_LVNotify(GetParent(hwnd), lCtrlId, &nmlv); ListView_LVNotify(GetParent(hwnd), lCtrlId, &nmlv);
rcItem.left = LVIR_BOUNDS;
LISTVIEW_GetItemRect(hwnd, lpLVItem->iItem, &rcItem);
InvalidateRect(hwnd, &rcItem, TRUE);
} }
} }
return TRUE; return TRUE;
@ -2542,8 +2547,13 @@ static BOOL LISTVIEW_SetItem(HWND hwnd, LPLVITEMA lpLVItem)
{ {
bResult = TRUE; bResult = TRUE;
} }
InvalidateRect(hwnd, NULL, FALSE); if (uChanged)
{
rcItem.left = LVIR_BOUNDS;
LISTVIEW_GetItemRect(hwnd, lpLVItem->iItem, &rcItem);
InvalidateRect(hwnd, &rcItem, TRUE);
}
} }
} }
} }
@ -2571,6 +2581,7 @@ static BOOL LISTVIEW_SetSubItem(HWND hwnd, LPLVITEMA lpLVItem)
HDPA hdpaSubItems; HDPA hdpaSubItems;
LISTVIEW_SUBITEM *lpSubItem; LISTVIEW_SUBITEM *lpSubItem;
LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE); LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE);
RECT rcItem;
if (lStyle & LVS_OWNERDATA) if (lStyle & LVS_OWNERDATA)
return FALSE; return FALSE;
@ -2595,7 +2606,9 @@ static BOOL LISTVIEW_SetSubItem(HWND hwnd, LPLVITEMA lpLVItem)
bResult = LISTVIEW_AddSubItem(hwnd, lpLVItem); bResult = LISTVIEW_AddSubItem(hwnd, lpLVItem);
} }
InvalidateRect(hwnd, NULL, FALSE); rcItem.left = LVIR_BOUNDS;
LISTVIEW_GetItemRect(hwnd, lpLVItem->iItem, &rcItem);
InvalidateRect(hwnd, &rcItem, FALSE);
} }
} }
} }
@ -3979,6 +3992,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial)
INT nScrollPosWidth = 0; INT nScrollPosWidth = 0;
SCROLLINFO scrollInfo; SCROLLINFO scrollInfo;
RECT rcItem; RECT rcItem;
BOOL bRedraw = FALSE;
ZeroMemory(&scrollInfo, sizeof(SCROLLINFO)); ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
scrollInfo.cbSize = sizeof(SCROLLINFO); scrollInfo.cbSize = sizeof(SCROLLINFO);
@ -3994,6 +4008,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial)
if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE) if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
{ {
/* scroll left */ /* scroll left */
bRedraw = TRUE;
if (uView == LVS_LIST) if (uView == LVS_LIST)
{ {
nScrollPosWidth = infoPtr->nItemWidth; nScrollPosWidth = infoPtr->nItemWidth;
@ -4027,6 +4042,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial)
if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE) if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
{ {
/* scroll right */ /* scroll right */
bRedraw = TRUE;
if (uView == LVS_LIST) if (uView == LVS_LIST)
{ {
rcItem.right -= infoPtr->rcList.right; rcItem.right -= infoPtr->rcList.right;
@ -4059,6 +4075,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial)
if (rcItem.top < infoPtr->rcList.top) if (rcItem.top < infoPtr->rcList.top)
{ {
/* scroll up */ /* scroll up */
bRedraw = TRUE;
if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE) if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
{ {
if (uView == LVS_REPORT) if (uView == LVS_REPORT)
@ -4087,6 +4104,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial)
else if (rcItem.bottom > infoPtr->rcList.bottom) else if (rcItem.bottom > infoPtr->rcList.bottom)
{ {
/* scroll down */ /* scroll down */
bRedraw = TRUE;
if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE) if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
{ {
if (uView == LVS_REPORT) if (uView == LVS_REPORT)
@ -4113,7 +4131,9 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial)
} }
} }
} }
if(bRedraw)
InvalidateRect(hwnd,NULL,TRUE);
return TRUE; return TRUE;
} }
@ -5172,6 +5192,8 @@ static LRESULT LISTVIEW_GetItemRect(HWND hwnd, INT nItem, LPRECT lprc)
nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem); nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
nLabelWidth += TRAILING_PADDING; nLabelWidth += TRAILING_PADDING;
if (infoPtr->himlSmall)
nLabelWidth += IMAGE_PADDING;
if (lprc->left + nLabelWidth < nLeftPos + infoPtr->nItemWidth) if (lprc->left + nLabelWidth < nLeftPos + infoPtr->nItemWidth)
{ {
lprc->right = lprc->left + nLabelWidth; lprc->right = lprc->left + nLabelWidth;
@ -5214,6 +5236,8 @@ static LRESULT LISTVIEW_GetItemRect(HWND hwnd, INT nItem, LPRECT lprc)
nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem); nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
nLabelWidth += TRAILING_PADDING; nLabelWidth += TRAILING_PADDING;
if (infoPtr->himlSmall)
nLabelWidth += IMAGE_PADDING;
if (lprc->right + nLabelWidth < lprc->left + infoPtr->nItemWidth) if (lprc->right + nLabelWidth < lprc->left + infoPtr->nItemWidth)
{ {
lprc->right += nLabelWidth; lprc->right += nLabelWidth;
@ -5350,6 +5374,8 @@ static LRESULT LISTVIEW_GetItemRect(HWND hwnd, INT nItem, LPRECT lprc)
nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem); nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
nLabelWidth += TRAILING_PADDING; nLabelWidth += TRAILING_PADDING;
if (infoPtr->himlSmall)
nLabelWidth += IMAGE_PADDING;
if (lprc->right + nLabelWidth < nLeftPos + infoPtr->nItemWidth) if (lprc->right + nLabelWidth < nLeftPos + infoPtr->nItemWidth)
{ {
lprc->right += nLabelWidth; lprc->right += nLabelWidth;
@ -7647,7 +7673,6 @@ static LRESULT LISTVIEW_KeyDown(HWND hwnd, INT nVirtualKey, LONG lKeyData)
if (bRedraw != FALSE) if (bRedraw != FALSE)
{ {
/* refresh client area */ /* refresh client area */
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd); UpdateWindow(hwnd);
} }
} }
@ -7670,7 +7695,11 @@ static LRESULT LISTVIEW_KillFocus(HWND hwnd)
LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongA(hwnd, 0); LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongA(hwnd, 0);
INT nCtrlId = GetWindowLongA(hwnd, GWL_ID); INT nCtrlId = GetWindowLongA(hwnd, GWL_ID);
NMHDR nmh; NMHDR nmh;
INT i,nTop,nBottom;
RECT rcItem;
LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE);
UINT uView = lStyle & LVS_TYPEMASK;
TRACE("(hwnd=%x)\n", hwnd); TRACE("(hwnd=%x)\n", hwnd);
/* send NM_KILLFOCUS notification */ /* send NM_KILLFOCUS notification */
@ -7683,7 +7712,26 @@ static LRESULT LISTVIEW_KillFocus(HWND hwnd)
infoPtr->bFocus = FALSE; infoPtr->bFocus = FALSE;
/* NEED drawing optimization ; redraw the selected items */ /* NEED drawing optimization ; redraw the selected items */
InvalidateRect(hwnd, NULL, FALSE); if (uView & LVS_REPORT)
{
nTop = LISTVIEW_GetTopIndex(hwnd);
nBottom = nTop +
LISTVIEW_GetCountPerColumn(hwnd) + 1;
}
else
{
nTop = 0;
nBottom = GETITEMCOUNT(infoPtr);
}
for (i = nTop; i<nBottom; i++)
{
if (LISTVIEW_IsSelected(hwnd,i))
{
rcItem.left = LVIR_BOUNDS;
LISTVIEW_GetItemRect(hwnd, i, &rcItem);
InvalidateRect(hwnd, &rcItem, FALSE);
}
}
return 0; return 0;
} }
@ -8248,7 +8296,6 @@ static LRESULT LISTVIEW_SetFocus(HWND hwnd, HWND hwndLoseFocus)
/* set window focus flag */ /* set window focus flag */
infoPtr->bFocus = TRUE; infoPtr->bFocus = TRUE;
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd); UpdateWindow(hwnd);
return 0; return 0;