From 6737a5926a9ab294788e6fa499af12b4b3e222b5 Mon Sep 17 00:00:00 2001 From: "Guy L. Albertelli" Date: Tue, 23 Jul 2002 20:54:52 +0000 Subject: [PATCH] - Implement LVM_SCROLL and adjust scrolling for all formats. - Implement standard Comctl32 color handling. - Eliminate bogus ERR messages for application messages. --- dlls/comctl32/listview.c | 271 +++++++++++++++++++++++++++++++-------- 1 file changed, 218 insertions(+), 53 deletions(-) diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index cfed4111da..7bae9a1bbe 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -45,7 +45,6 @@ * LISTVIEW_SetColumnOrderArray : simple hack only * LISTVIEW_Arrange : empty stub * LISTVIEW_ApproximateViewRect : incomplete - * LISTVIEW_Scroll : not implemented * LISTVIEW_Update : not completed * * Known differences in message stream from native control (not known if @@ -72,6 +71,7 @@ #include "winnt.h" #include "heap.h" #include "commctrl.h" +#include "comctl32.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(listview); @@ -169,6 +169,12 @@ typedef struct tagLISTVIEW_INFO * constants */ +/* Internal interface to LISTVIEW_HScroll and LISTVIEW_VScroll */ +#define SB_INTERNAL_UP -1 +#define SB_INTERNAL_DOWN -2 +#define SB_INTERNAL_RIGHT -3 +#define SB_INTERNAL_LEFT -4 + /* maximum size of a label */ #define DISP_TEXT_SIZE 512 @@ -201,8 +207,8 @@ typedef struct tagLISTVIEW_INFO /* default column width for items in list display mode */ #define DEFAULT_COLUMN_WIDTH 128 -/* Increment size of the horizontal scroll bar */ -#define LISTVIEW_SCROLL_DIV_SIZE 10 +/* Size of "line" scroll for V & H scrolls */ +#define LISTVIEW_SCROLL_ICON_LINE_SIZE 37 /* Padding betwen image and label */ #define IMAGE_PADDING 2 @@ -279,6 +285,8 @@ static VOID LISTVIEW_RemoveSelectionRange(HWND hwnd, INT lItem, INT uItem); static void LISTVIEW_FillBackground(HWND hwnd, HDC hdc, LPRECT rc); static void ListView_UpdateLargeItemLabelRect (HWND hwnd, const LISTVIEW_INFO* infoPtr, int nItem, RECT *rect); static LRESULT LISTVIEW_GetColumnT(HWND, INT, LPLVCOLUMNW, BOOL); +static LRESULT LISTVIEW_VScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, HWND hScrollWnd); +static LRESULT LISTVIEW_HScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, HWND hScrollWnd); /******** Defines that LISTVIEW_ProcessLetterKeys uses ****************/ #define KEY_DELAY 450 @@ -819,8 +827,8 @@ static VOID LISTVIEW_UpdateHeaderSize(HWND hwnd, INT nNewScrollPos) point[1].y = winRect.bottom; MapWindowPoints(HWND_DESKTOP, hwnd, point, 2); - point[0].x = -(nNewScrollPos * LISTVIEW_SCROLL_DIV_SIZE); - point[1].x += (nNewScrollPos * LISTVIEW_SCROLL_DIV_SIZE); + point[0].x = -nNewScrollPos; + point[1].x += nNewScrollPos; SetWindowPos(infoPtr->hwndHeader,0, point[0].x,point[0].y,point[1].x,point[1].y, @@ -899,8 +907,8 @@ static VOID LISTVIEW_UpdateScroll(HWND hwnd) } scrollInfo.nMin = 0; scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE ; - scrollInfo.nPage = nListWidth / LISTVIEW_SCROLL_DIV_SIZE; - scrollInfo.nMax = max(infoPtr->nItemWidth / LISTVIEW_SCROLL_DIV_SIZE, 0)-1; + scrollInfo.nPage = nListWidth; + scrollInfo.nMax = max(infoPtr->nItemWidth, 0)-1; test = (scrollInfo.nMin >= scrollInfo.nMax - max((INT)scrollInfo.nPage - 1, 0)); TRACE("LVS_REPORT Horz. nMax=%d, nPage=%d, test=%d\n", scrollInfo.nMax, scrollInfo.nPage, test); @@ -929,9 +937,9 @@ static VOID LISTVIEW_UpdateScroll(HWND hwnd) { scrollInfo.nPos = 0; } - scrollInfo.nMax = max(nViewWidth / LISTVIEW_SCROLL_DIV_SIZE, 0)-1; + scrollInfo.nMax = max(nViewWidth, 0)-1; scrollInfo.nMin = 0; - scrollInfo.nPage = nListWidth / LISTVIEW_SCROLL_DIV_SIZE; + scrollInfo.nPage = nListWidth; scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE; TRACE("LVS_ICON/SMALLICON Horz.\n"); SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE); @@ -944,9 +952,9 @@ static VOID LISTVIEW_UpdateScroll(HWND hwnd) { scrollInfo.nPos = 0; } - scrollInfo.nMax = max(nViewHeight / LISTVIEW_SCROLL_DIV_SIZE,0)-1; + scrollInfo.nMax = max(nViewHeight,0)-1; scrollInfo.nMin = 0; - scrollInfo.nPage = nListHeight / LISTVIEW_SCROLL_DIV_SIZE; + scrollInfo.nPage = nListHeight; scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE; TRACE("LVS_ICON/SMALLICON Vert.\n"); SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE); @@ -3086,13 +3094,13 @@ static VOID LISTVIEW_DrawSubItem(HWND hwnd, HDC hdc, INT nItem, INT nSubItem, { if (infoPtr->bFocus) { - SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT)); - SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); + SetBkColor(hdc, comctl32_color.clrHighlight); + SetTextColor(hdc, comctl32_color.clrHighlightText); } else { - SetBkColor(hdc, GetSysColor(COLOR_3DFACE)); - SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT)); + SetBkColor(hdc, comctl32_color.clr3dFace); + SetTextColor(hdc, comctl32_color.clrBtnText); } } else @@ -3245,16 +3253,16 @@ static VOID LISTVIEW_DrawItem(HWND hwnd, HDC hdc, INT nItem, RECT rcItem, BOOL F if ((lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus != FALSE)) { /* set item colors */ - dwBkColor = SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT)); - dwTextColor = SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); + dwBkColor = SetBkColor(hdc, comctl32_color.clrHighlight); + dwTextColor = SetTextColor(hdc, comctl32_color.clrHighlightText); /* set raster mode */ nMixMode = SetROP2(hdc, R2_XORPEN); } else if ((GetWindowLongW(hwnd, GWL_STYLE) & LVS_SHOWSELALWAYS) && (lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus == FALSE)) { - dwBkColor = SetBkColor(hdc, GetSysColor(COLOR_3DFACE)); - dwTextColor = SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT)); + dwBkColor = SetBkColor(hdc, comctl32_color.clr3dFace); + dwTextColor = SetTextColor(hdc, comctl32_color.clrBtnText); /* set raster mode */ nMixMode = SetROP2(hdc, R2_COPYPEN); } @@ -3399,8 +3407,8 @@ static VOID LISTVIEW_DrawLargeItem(HWND hwnd, HDC hdc, INT nItem, RECT rcItem, if (lvItem.state & LVIS_SELECTED) { /* set item colors */ - SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT)); - SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); + SetBkColor(hdc, comctl32_color.clrHighlight); + SetTextColor(hdc, comctl32_color.clrHighlightText); SetBkMode (hdc, OPAQUE); /* set raster mode */ SetROP2(hdc, R2_XORPEN); @@ -3581,7 +3589,7 @@ static VOID LISTVIEW_RefreshReport(HWND hwnd, HDC hdc, DWORD cdmode) /* Get scroll bar info once before loop */ GetScrollInfo(hwnd, SB_HORZ, &scrollInfo); - scrollOffset = scrollInfo.nPos * LISTVIEW_SCROLL_DIV_SIZE; + scrollOffset = scrollInfo.nPos; for (; nItem < nLast; nItem++) { @@ -4635,7 +4643,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial) } else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON)) { - nScrollPosWidth = LISTVIEW_SCROLL_DIV_SIZE; + nScrollPosWidth = 1; rcItem.left += infoPtr->rcList.left; } @@ -4666,7 +4674,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial) else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON)) { rcItem.right -= infoPtr->rcList.right; - nScrollPosWidth = LISTVIEW_SCROLL_DIV_SIZE; + nScrollPosWidth = 1; } /* When in LVS_REPORT view, the scroll position should @@ -4696,7 +4704,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial) } else if ((uView == LVS_ICON) || (uView == LVS_SMALLICON)) { - nScrollPosHeight = LISTVIEW_SCROLL_DIV_SIZE; + nScrollPosHeight = 1; rcItem.top += infoPtr->rcList.top; } @@ -4721,7 +4729,7 @@ static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial) } else if ((uView == LVS_ICON) || (uView == LVS_SMALLICON)) { - nScrollPosHeight = LISTVIEW_SCROLL_DIV_SIZE; + nScrollPosHeight = 1; rcItem.bottom -= infoPtr->rcList.bottom; } @@ -5566,7 +5574,7 @@ static BOOL LISTVIEW_GetItemBoundBox(HWND hwnd, INT nItem, LPRECT lpRect) scrollInfo.cbSize = sizeof(SCROLLINFO); scrollInfo.fMask = SIF_POS; GetScrollInfo(hwnd, SB_HORZ, &scrollInfo); - lpRect->left -= scrollInfo.nPos * LISTVIEW_SCROLL_DIV_SIZE; + lpRect->left -= scrollInfo.nPos; } } else /* either LVS_ICON or LVS_SMALLICON */ @@ -6437,14 +6445,14 @@ static LRESULT LISTVIEW_GetOrigin(HWND hwnd, LPPOINT lpptOrigin) { scrollInfo.fMask = SIF_POS; if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE) - lpptOrigin->x = -scrollInfo.nPos * LISTVIEW_SCROLL_DIV_SIZE; + lpptOrigin->x = -scrollInfo.nPos; } if (lStyle & WS_VSCROLL) { scrollInfo.fMask = SIF_POS; if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE) - lpptOrigin->y = -scrollInfo.nPos * LISTVIEW_SCROLL_DIV_SIZE; + lpptOrigin->y = -scrollInfo.nPos; } bResult = TRUE; @@ -7101,7 +7109,92 @@ static LRESULT LISTVIEW_RedrawItems(HWND hwnd, INT nFirst, INT nLast) return bResult; } -/* LISTVIEW_Scroll */ +/*** + * DESCRIPTION: + * Scroll the content of a listview. + * + * PARAMETER(S): + * [I] HWND : window handle + * [I] INT : horizontal scroll amount in pixels + * [I] INT : vertical scroll amount in pixels + * + * RETURN: + * SUCCESS : TRUE + * FAILURE : FALSE + * + * COMMENTS: + * If the control is in report mode (LVS_REPORT) the control can + * be scrolled only in line increments. "dy" will be rounded to the + * nearest number of pixels that are a whole line. Ex: if line height + * is 16 and an 8 is passed, the list will be scrolled by 16. If a 7 + * is passed the the scroll will be 0. (per MSDN 7/2002) + * + * For: (per experimentaion with native control and CSpy ListView) + * LVS_ICON dy=1 = 1 pixel (vertical only) + * dx ignored + * LVS_SMALLICON dy=1 = 1 pixel (vertical only) + * dx ignored + * LVS_LIST dx=1 = 1 column (horizontal only) + * but will only scroll 1 column per message + * no matter what the value. + * dy must be 0 or FALSE returned. + * LVS_REPORT dx=1 = 1 pixel + * dy= see above + * + */ +static LRESULT LISTVIEW_Scroll(HWND hwnd, INT dx, INT dy) +{ + LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0); + LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE); + UINT uView = lStyle & LVS_TYPEMASK; + INT rows, mode, i; + + if (uView == LVS_REPORT) + { + rows = (abs(dy) + infoPtr->nItemHeight/2) / infoPtr->nItemHeight; + if (rows != 0) + { + mode = (dy>0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP; + for ( i=0; i0) ? SB_INTERNAL_RIGHT : SB_INTERNAL_LEFT; + for ( i=0; i0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP; + for(i=0; i0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP; + for(i=0; i0) ? SB_INTERNAL_RIGHT : SB_INTERNAL_LEFT; + LISTVIEW_HScroll(hwnd, mode, 0, hwnd); + return TRUE; + } + return FALSE; +} /*** * DESCRIPTION: @@ -8113,8 +8206,8 @@ static LRESULT LISTVIEW_Create(HWND hwnd, LPCREATESTRUCTW lpcs) (WPARAM)hwnd, (LPARAM)NF_QUERY); /* initialize color information */ - infoPtr->clrBk = GetSysColor(COLOR_WINDOW); - infoPtr->clrText = GetSysColor(COLOR_WINDOWTEXT); + infoPtr->clrBk = comctl32_color.clrWindow; + infoPtr->clrText = comctl32_color.clrWindowText; infoPtr->clrTextBk = CLR_DEFAULT; /* set default values */ @@ -8282,12 +8375,21 @@ static LRESULT LISTVIEW_GetFont(HWND hwnd) * * RETURN: * Zero + * + * NOTES: + * SB_LINEUP/SB_LINEDOWN: + * for LVS_ICON, LVS_SMALLICON is 37 by experiment + * for LVS_REPORT is 1 line --> infoPtr->nItemHeight + * for LVS_LIST cannot occur ??? (implemented as LVS_REPORT) + * */ static LRESULT LISTVIEW_VScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, HWND hScrollWnd) { LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0); + UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK; SCROLLINFO scrollInfo; + BOOL is_an_icon; TRACE("(hwnd=%x, nScrollCode=%d, nCurrentPos=%d, hScrollWnd=%x)\n", hwnd, nScrollCode, nCurrentPos, hScrollWnd); @@ -8298,19 +8400,33 @@ static LRESULT LISTVIEW_VScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, scrollInfo.cbSize = sizeof(SCROLLINFO); scrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; + is_an_icon = ((uView == LVS_ICON) || (uView == LVS_SMALLICON)); + if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE) { INT nOldScrollPos = scrollInfo.nPos; switch (nScrollCode) { + case SB_INTERNAL_UP: + if (scrollInfo.nPos > scrollInfo.nMin) + scrollInfo.nPos--; + break; + + case SB_INTERNAL_DOWN: + if (scrollInfo.nPos < scrollInfo.nMax) + scrollInfo.nPos++; + break; + case SB_LINEUP: if (scrollInfo.nPos > scrollInfo.nMin) - scrollInfo.nPos--; - break; + scrollInfo.nPos -= (is_an_icon) ? + LISTVIEW_SCROLL_ICON_LINE_SIZE : infoPtr->nItemHeight; + break; case SB_LINEDOWN: if (scrollInfo.nPos < scrollInfo.nMax) - scrollInfo.nPos++; + scrollInfo.nPos += (is_an_icon) ? + LISTVIEW_SCROLL_ICON_LINE_SIZE : infoPtr->nItemHeight; break; case SB_PAGEUP: @@ -8349,17 +8465,28 @@ static LRESULT LISTVIEW_VScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, { scrollInfo.fMask = SIF_POS; SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE); - if (IsWindowVisible(infoPtr->hwndHeader)) + + /* Get real position value, the value we set might have been changed + * by SetScrollInfo (especially if we went too far. + */ + scrollInfo.fMask = SIF_POS; + GetScrollInfo(hwnd, SB_VERT, &scrollInfo); + + /* only if the scroll position really changed, do we update screen */ + if (nOldScrollPos != scrollInfo.nPos) { - RECT rListview, rcHeader, rDest; - GetClientRect(hwnd, &rListview); - GetWindowRect(infoPtr->hwndHeader, &rcHeader); - MapWindowPoints((HWND) NULL, hwnd, (LPPOINT) &rcHeader, 2); - SubtractRect(&rDest, &rListview, &rcHeader); - InvalidateRect(hwnd, &rDest, TRUE); + if (IsWindowVisible(infoPtr->hwndHeader)) + { + RECT rListview, rcHeader, rDest; + GetClientRect(hwnd, &rListview); + GetWindowRect(infoPtr->hwndHeader, &rcHeader); + MapWindowPoints((HWND) NULL, hwnd, (LPPOINT) &rcHeader, 2); + SubtractRect(&rDest, &rListview, &rcHeader); + InvalidateRect(hwnd, &rDest, TRUE); + } + else + InvalidateRect(hwnd, NULL, TRUE); } - else - InvalidateRect(hwnd, NULL, TRUE); } } @@ -8379,12 +8506,22 @@ static LRESULT LISTVIEW_VScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, * * RETURN: * Zero + * + * NOTES: + * SB_LINELEFT/SB_LINERIGHT: + * for LVS_ICON, LVS_SMALLICON ??? (implemented as 1 pixel) + * for LVS_REPORT is 1 pixel + * for LVS_LIST is 1 column --> which is a 1 because the + * scroll is based on columns not pixels + * */ static LRESULT LISTVIEW_HScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, HWND hScrollWnd) { LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0); + UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK; SCROLLINFO scrollInfo; + BOOL is_a_list; TRACE("(hwnd=%x, nScrollCode=%d, nCurrentPos=%d, hScrollWnd=%x)\n", hwnd, nScrollCode, nCurrentPos, hScrollWnd); @@ -8395,20 +8532,32 @@ static LRESULT LISTVIEW_HScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, scrollInfo.cbSize = sizeof(SCROLLINFO); scrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; + is_a_list = (uView == LVS_LIST); + if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE) { INT nOldScrollPos = scrollInfo.nPos; switch (nScrollCode) { + case SB_INTERNAL_LEFT: + if (scrollInfo.nPos > scrollInfo.nMin) + scrollInfo.nPos--; + break; + + case SB_INTERNAL_RIGHT: + if (scrollInfo.nPos < scrollInfo.nMax) + scrollInfo.nPos++; + break; + case SB_LINELEFT: if (scrollInfo.nPos > scrollInfo.nMin) - scrollInfo.nPos--; + scrollInfo.nPos--; break; case SB_LINERIGHT: if (scrollInfo.nPos < scrollInfo.nMax) - scrollInfo.nPos++; + scrollInfo.nPos++; break; case SB_PAGELEFT: @@ -8448,13 +8597,20 @@ static LRESULT LISTVIEW_HScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK; scrollInfo.fMask = SIF_POS; SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE); + + /* Get real position value, the value we set might have been changed + * by SetScrollInfo (especially if we went too far. + */ + scrollInfo.fMask = SIF_POS; + GetScrollInfo(hwnd, SB_HORZ, &scrollInfo); if(uView == LVS_REPORT) { - scrollInfo.fMask = SIF_POS; - GetScrollInfo(hwnd, SB_HORZ, &scrollInfo); LISTVIEW_UpdateHeaderSize(hwnd, scrollInfo.nPos); } - InvalidateRect(hwnd, NULL, TRUE); + + /* only if the scroll position really changed, do we update screen */ + if (nOldScrollPos != scrollInfo.nPos) + InvalidateRect(hwnd, NULL, TRUE); } } @@ -8486,7 +8642,10 @@ static LRESULT LISTVIEW_MouseWheel(HWND hwnd, INT wheelDelta) * should be fixed in the future. */ if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE) - LISTVIEW_VScroll(hwnd, SB_THUMBPOSITION, scrollInfo.nPos + (gcWheelDelta < 0) ? 37 : -37, 0); + LISTVIEW_VScroll(hwnd, SB_THUMBPOSITION, + scrollInfo.nPos + (gcWheelDelta < 0) ? + LISTVIEW_SCROLL_ICON_LINE_SIZE : + -LISTVIEW_SCROLL_ICON_LINE_SIZE, 0); break; case LVS_REPORT: @@ -9684,8 +9843,8 @@ static LRESULT WINAPI LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, case LVM_REDRAWITEMS: return LISTVIEW_RedrawItems(hwnd, (INT)wParam, (INT)lParam); -/* case LVM_SCROLL: */ -/* return LISTVIEW_Scroll(hwnd, (INT)wParam, (INT)lParam); */ + case LVM_SCROLL: + return LISTVIEW_Scroll(hwnd, (INT)wParam, (INT)lParam); case LVM_SETBKCOLOR: return LISTVIEW_SetBkColor(hwnd, (COLORREF)lParam); @@ -9791,6 +9950,7 @@ static LRESULT WINAPI LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, return LISTVIEW_GetFont(hwnd); case WM_HSCROLL: + if (SLOWORD(wParam) < 0) return 0; /* validate not internal codes */ return LISTVIEW_HScroll(hwnd, (INT)LOWORD(wParam), (INT)HIWORD(wParam), (HWND)lParam); @@ -9858,9 +10018,14 @@ static LRESULT WINAPI LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, case WM_STYLECHANGED: return LISTVIEW_StyleChanged(hwnd, wParam, (LPSTYLESTRUCT)lParam); + case WM_SYSCOLORCHANGE: + COMCTL32_RefreshSysColors(); + return 0; + /* case WM_TIMER: */ case WM_VSCROLL: + if (SLOWORD(wParam) < 0) return 0; /* validate not internal codes */ return LISTVIEW_VScroll(hwnd, (INT)LOWORD(wParam), (INT)HIWORD(wParam), (HWND)lParam); @@ -9881,7 +10046,7 @@ static LRESULT WINAPI LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, /* case WM_WININICHANGE: */ default: - if (uMsg >= WM_USER) + if ((uMsg >= WM_USER) && (uMsg < WM_APP)) { ERR("unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam, lParam); -- 2.32.0.93.g670b81a890