comctl32: Fix listview column resize.
Draw a track line after a HDN_TRACK, resize the columns only after a
HDN_ITEMCHANGED.
Create the header with HDS_FULLDRAG.
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 5ee4b2b..23c5802 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -309,6 +309,7 @@
WCHAR szSearchParam[ MAX_PATH ];
BOOL bIsDrawing;
INT nMeasureItemHeight;
+ INT xTrackLine; /* The x coefficient of the track line or -1 if none */
} LISTVIEW_INFO;
/*
@@ -7521,6 +7522,40 @@
return TRUE;
}
+/***
+ * DESCRIPTION:
+ * Draw the track line at the place defined in the infoPtr structure.
+ * The line is drawn with a XOR pen so drawing the line for the second time
+ * in the same place erases the line.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ *
+ * RETURN:
+ * SUCCESS : TRUE
+ * FAILURE : FALSE
+ */
+static BOOL LISTVIEW_DrawTrackLine(LISTVIEW_INFO *infoPtr)
+{
+ HPEN hOldPen;
+ HDC hdc;
+ INT oldROP;
+
+ if (infoPtr->xTrackLine == -1)
+ return FALSE;
+
+ if (!(hdc = GetDC(infoPtr->hwndSelf)))
+ return FALSE;
+ hOldPen = SelectObject(hdc, GetStockObject(BLACK_PEN));
+ oldROP = SetROP2(hdc, R2_XORPEN);
+ MoveToEx(hdc, infoPtr->xTrackLine, infoPtr->rcList.top, NULL);
+ LineTo(hdc, infoPtr->xTrackLine, infoPtr->rcList.bottom);
+ SetROP2(hdc, oldROP);
+ SelectObject(hdc, hOldPen);
+ ReleaseDC(infoPtr->hwndSelf, hdc);
+ return TRUE;
+}
+
/***
* DESCRIPTION:
@@ -7573,6 +7608,7 @@
infoPtr->nEditLabelItem = -1;
infoPtr->dwHoverTime = -1; /* default system hover time */
infoPtr->nMeasureItemHeight = 0;
+ infoPtr->xTrackLine = -1; /* no track line */
/* get default font (icon title) */
SystemParametersInfoW(SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
@@ -7582,7 +7618,7 @@
/* create header */
infoPtr->hwndHeader = CreateWindowW(WC_HEADERW, NULL,
- WS_CHILD | HDS_HORZ | (DWORD)((LVS_NOSORTHEADER & lpcs->style)?0:HDS_BUTTONS),
+ WS_CHILD | HDS_HORZ | HDS_FULLDRAG | (DWORD)((LVS_NOSORTHEADER & lpcs->style)?0:HDS_BUTTONS),
0, 0, 0, 0, hwnd, NULL,
lpcs->hInstance, NULL);
if (!infoPtr->hwndHeader) goto fail;
@@ -8365,20 +8401,48 @@
switch (lpnmh->hdr.code)
{
- case HDN_ITEMCHANGINGW:
- case HDN_ITEMCHANGINGA:
- return notify_forward_header(infoPtr, lpnmh);
- case HDN_ITEMCHANGEDW:
- case HDN_ITEMCHANGEDA:
- notify_forward_header(infoPtr, lpnmh);
- if (!IsWindow(hwndSelf))
- break;
- /* Fall through */
case HDN_TRACKW:
case HDN_TRACKA:
{
COLUMN_INFO *lpColumnInfo;
+ POINT ptOrigin;
+ INT x;
+
+ if (!lpnmh->pitem || !(lpnmh->pitem->mask & HDI_WIDTH))
+ break;
+
+ /* remove the old line (if any) */
+ LISTVIEW_DrawTrackLine(infoPtr);
+
+ /* compute & draw the new line */
+ lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, lpnmh->iItem);
+ x = lpColumnInfo->rcHeader.left + lpnmh->pitem->cxy;
+ LISTVIEW_GetOrigin(infoPtr, &ptOrigin);
+ infoPtr->xTrackLine = x + ptOrigin.x;
+ LISTVIEW_DrawTrackLine(infoPtr);
+ break;
+ }
+
+ case HDN_ENDTRACKA:
+ case HDN_ENDTRACKW:
+ /* remove the track line (if any) */
+ LISTVIEW_DrawTrackLine(infoPtr);
+ infoPtr->xTrackLine = -1;
+ break;
+
+ case HDN_ITEMCHANGINGW:
+ case HDN_ITEMCHANGINGA:
+ return notify_forward_header(infoPtr, lpnmh);
+
+ case HDN_ITEMCHANGEDW:
+ case HDN_ITEMCHANGEDA:
+ {
+ COLUMN_INFO *lpColumnInfo;
INT dx, cxy;
+
+ notify_forward_header(infoPtr, lpnmh);
+ if (!IsWindow(hwndSelf))
+ break;
if (!lpnmh->pitem || !(lpnmh->pitem->mask & HDI_WIDTH))
{