Listview X7

Dimitrie O. Paun dpaun at rogers.com
Thu Oct 24 10:17:54 CDT 2002


ChangeLog
  Eliminate most of the flicker when resizing columns
  More debug tracing.

--- dlls/comctl32/listview.c.X6	Thu Oct 24 02:31:16 2002
+++ dlls/comctl32/listview.c	Thu Oct 24 11:15:31 2002
@@ -248,7 +248,8 @@
   HCURSOR hHotCursor;
   HFONT hDefaultFont;
   HFONT hFont;
-  INT ntmHeight;		/* From GetTextMetrics from above font */
+  INT ntmHeight;		/* Some cached metrics of the font used */
+  INT ntmAveCharWidth;		/* by the listview to draw items */
   BOOL bRedraw;  		/* Turns on/off repaints & invalidations */
   BOOL bFirstPaint;		/* Flags if the control has never painted before */
   BOOL bAutoarrange;		/* Autoarrange flag when NOT in LVS_AUTOARRANGE */
@@ -1244,7 +1245,7 @@
 {
     RECT rcCol;
     
-    if(!infoPtr->bRedraw) return; 
+    if(!is_redrawing(infoPtr)) return; 
     LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcCol);
     rcCol.top = infoPtr->rcList.top;
     rcCol.bottom = infoPtr->rcList.bottom;
@@ -2045,6 +2046,8 @@
 
     if (uView != LVS_ICON && uView != LVS_SMALLICON) return FALSE;
   
+    TRACE("nAlignCode=%d\n", nAlignCode);
+
     if (nAlignCode == LVA_DEFAULT)
     {
 	if (infoPtr->dwStyle & LVS_ALIGNLEFT) nAlignCode = LVA_ALIGNLEFT;
@@ -2192,7 +2195,9 @@
 static INT LISTVIEW_CalculateItemWidth(LISTVIEW_INFO *infoPtr)
 {
     UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
-    INT nItemWidth;
+    INT nItemWidth = 0;
+
+    TRACE("uView=%d\n", uView);
 
     if (uView == LVS_ICON)
 	nItemWidth = infoPtr->iconSpacing.cx;
@@ -2205,13 +2210,12 @@
 	    LISTVIEW_GetHeaderRect(infoPtr, infoPtr->hdpaColumns->nItemCount - 1, &rcHeader);
             nItemWidth = rcHeader.right;
 	}
-	else nItemWidth = 0;
     }
     else /* LVS_SMALLICON, or LVS_LIST */
     {
 	INT i;
 	
-	for (nItemWidth = i = 0; i < infoPtr->nItemCount; i++)
+	for (i = 0; i < infoPtr->nItemCount; i++)
 	    nItemWidth = max(LISTVIEW_GetLabelWidth(infoPtr, i), nItemWidth);
 
         if (infoPtr->himlSmall) nItemWidth += infoPtr->iconSize.cx + IMAGE_PADDING; 
@@ -2238,6 +2242,8 @@
     UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
     INT nItemHeight;
 
+    TRACE("uView=%d\n", uView);
+
     if (uView == LVS_ICON)
 	nItemHeight = infoPtr->iconSpacing.cy;
     else
@@ -2288,7 +2294,10 @@
     TEXTMETRICW tm;
 
     if (GetTextMetricsW(hdc, &tm))
+    {
 	infoPtr->ntmHeight = tm.tmHeight;
+	infoPtr->ntmAveCharWidth = tm.tmAveCharWidth;
+    }
     SelectObject(hdc, hOldFont);
     ReleaseDC(infoPtr->hwndSelf, hdc);
     
@@ -6447,6 +6456,8 @@
     INT oldHeight = infoPtr->nItemHeight;
     HIMAGELIST himlOld = 0;
 
+    TRACE("(nType=%d, himl=%p\n", nType, himl);
+
     switch (nType)
     {
     case LVSIL_NORMAL:
@@ -7637,9 +7648,18 @@
 	    dx = cxy - (lpColumnInfo->rcHeader.right - lpColumnInfo->rcHeader.left);
 	    if (dx != 0)
 	    {
+		RECT rcCol = lpColumnInfo->rcHeader;
+
 		lpColumnInfo->rcHeader.right += dx;
 		LISTVIEW_ScrollColumns(infoPtr, lpnmh->iItem + 1, dx);
-		if (uView == LVS_REPORT) LISTVIEW_InvalidateColumn(infoPtr, lpnmh->iItem);
+		if (uView == LVS_REPORT && is_redrawing(infoPtr))
+		{
+		    rcCol.right = min (rcCol.right, lpColumnInfo->rcHeader.right);
+		    rcCol.left = max (rcCol.left, rcCol.right - 3 * infoPtr->ntmAveCharWidth);
+		    rcCol.top = infoPtr->rcList.top;
+		    rcCol.bottom = infoPtr->rcList.bottom;
+		    LISTVIEW_InvalidateRect(infoPtr, &rcCol);
+		}
 	    }
 	}
 	break;


-- 
Dimi.




More information about the wine-patches mailing list