Filip Navara Implement TB_GETMETRICS and TB_SETMETRICS. Fix displaying of checked items on non-flat toolbars. Index: lib/comctl32/toolbar.c =================================================================== --- lib/comctl32/toolbar.c (revision 17929) +++ lib/comctl32/toolbar.c (working copy) @@ -33,11 +33,9 @@ * - TBSTYLE_REGISTERDROP * - TBSTYLE_EX_DOUBLEBUFFER * - Messages: - * - TB_GETMETRICS * - TB_GETOBJECT * - TB_INSERTMARKHITTEST * - TB_SAVERESTORE - * - TB_SETMETRICS * - WM_WININICHANGE * - Notifications: * - NM_CHAR @@ -144,6 +142,10 @@ DWORD dwItemCustDraw; /* CDRF_ response (w/o TBCDRF_) from ITEMPREP */ DWORD dwItemCDFlag; /* TBCDRF_ flags from last ITEMPREPAINT */ SIZE szPadding; /* padding values around button */ + INT cxBarPad; + INT cyBarPad; + INT cxButtonSpacing; /* horizontal spacing between adjacent buttons */ + INT cyButtonSpacing; /* vertical spacing between adjacent buttons */ INT iListGap; /* default gap between text and image for toolbar with list style */ HFONT hDefaultFont; HFONT hFont; /* text font */ @@ -972,25 +974,6 @@ (btnPtr->fsState & (TBSTATE_PRESSED | TBSTATE_CHECKED))) OffsetRect(&rcText, 1, 1); - if (!(tbcd.nmcd.uItemState & CDIS_HOT) && - ((tbcd.nmcd.uItemState & CDIS_CHECKED) || (tbcd.nmcd.uItemState & CDIS_INDETERMINATE))) - TOOLBAR_DrawPattern (&rc, &tbcd); - - if (((infoPtr->dwStyle & TBSTYLE_FLAT) || GetWindowTheme (infoPtr->hwndSelf)) - && (tbcd.nmcd.uItemState & CDIS_HOT)) - { - if ( infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK ) - { - COLORREF oldclr; - - oldclr = SetBkColor(hdc, tbcd.clrHighlightHotTrack); - ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, 0); - if (hasDropDownArrow) - ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rcArrow, NULL, 0, 0); - SetBkColor(hdc, oldclr); - } - } - if (theme) { int partId = drawSepDropDownArrow ? TP_SPLITBUTTON : TP_BUTTON; @@ -1011,6 +994,25 @@ else TOOLBAR_DrawFrame(infoPtr, &tbcd); + if ((!(tbcd.nmcd.uItemState & CDIS_HOT) || !(infoPtr->dwStyle & TBSTYLE_FLAT)) && + ((tbcd.nmcd.uItemState & CDIS_CHECKED) || (tbcd.nmcd.uItemState & CDIS_INDETERMINATE))) + TOOLBAR_DrawPattern (&rc, &tbcd); + + if (((infoPtr->dwStyle & TBSTYLE_FLAT) || GetWindowTheme (infoPtr->hwndSelf)) + && (tbcd.nmcd.uItemState & CDIS_HOT)) + { + if ( infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK ) + { + COLORREF oldclr; + + oldclr = SetBkColor(hdc, tbcd.clrHighlightHotTrack); + ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, 0); + if (hasDropDownArrow) + ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rcArrow, NULL, 0, 0); + SetBkColor(hdc, oldclr); + } + } + if (drawSepDropDownArrow) { if (theme) @@ -1417,7 +1419,7 @@ else { TRACE("wrap point 6 btn %d style %02x, x=%d, cx=%d\n", i, btnPtr[i].fsStyle, x, cx); - x += cx; + x += cx + infoPtr->cxButtonSpacing; } } } @@ -1624,6 +1626,7 @@ TOOLBAR_WrapToolbar( hwnd, dwStyle ); x = infoPtr->nIndent; + /* FIXME: the behaviour seems to differ here for COMCTL 6.0 */ if (infoPtr->dwStyle & TBSTYLE_FLAT) y = 0; else @@ -1713,6 +1716,9 @@ if (infoPtr->rcBound.bottom < y + cy) infoPtr->rcBound.bottom = y + cy; + cx += infoPtr->cxButtonSpacing; + cy += infoPtr->cyButtonSpacing; + /* Set the toolTip only for non-hidden, non-separator button */ if (infoPtr->hwndToolTip && !(btnPtr->fsStyle & BTNS_SEP )) { @@ -5613,6 +5619,10 @@ infoPtr->clrBtnShadow = CLR_DEFAULT; infoPtr->szPadding.cx = DEFPAD_CX; infoPtr->szPadding.cy = DEFPAD_CY; + infoPtr->cxBarPad = 0; + infoPtr->cyBarPad = 0; + infoPtr->cxButtonSpacing = 0; + infoPtr->cyButtonSpacing = 0; infoPtr->iListGap = DEFLISTGAP; infoPtr->dwStyle = dwStyle; infoPtr->tbim.iButton = -1; @@ -6759,6 +6769,58 @@ } +static LRESULT TOOLBAR_GetMetrics(HWND hwnd, LPTBMETRICS lpMetrics) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); + + if (lpMetrics->cbSize != sizeof(TBMETRICS)) + return 0; + + if (lpMetrics->dwMask & TBMF_PAD) + { + lpMetrics->cxPad = infoPtr->szPadding.cx; + lpMetrics->cyPad = infoPtr->szPadding.cy; + } + if (lpMetrics->dwMask & TBMF_BARPAD) + { + lpMetrics->cxBarPad = infoPtr->cxBarPad; + lpMetrics->cyBarPad = infoPtr->cyBarPad; + } + if (lpMetrics->dwMask & TBMF_BUTTONSPACING) + { + lpMetrics->cxButtonSpacing = infoPtr->cxButtonSpacing; + lpMetrics->cyButtonSpacing = infoPtr->cyButtonSpacing; + } + return 0; +} + + +static LRESULT TOOLBAR_SetMetrics(HWND hwnd, LPTBMETRICS lpMetrics) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); + + if (lpMetrics->cbSize != sizeof(TBMETRICS)) + return 0; + + if (lpMetrics->dwMask & TBMF_PAD) + { + infoPtr->szPadding.cx = lpMetrics->cxPad; + infoPtr->szPadding.cy = lpMetrics->cyPad; + } + if (lpMetrics->dwMask & TBMF_BARPAD) + { + infoPtr->cxBarPad = lpMetrics->cxBarPad; + infoPtr->cyBarPad = lpMetrics->cyBarPad; + } + if (lpMetrics->dwMask & TBMF_BUTTONSPACING) + { + infoPtr->cxButtonSpacing = lpMetrics->cxButtonSpacing; + infoPtr->cyButtonSpacing = lpMetrics->cyButtonSpacing; + } + return 0; +} + + /* update theme after a WM_THEMECHANGED message */ static LRESULT theme_changed (HWND hwnd) { @@ -6878,6 +6940,9 @@ case TB_GETMAXSIZE: return TOOLBAR_GetMaxSize (hwnd, wParam, lParam); + case TB_GETMETRICS: + return TOOLBAR_GetMetrics(hwnd, (LPTBMETRICS)lParam); + /* case TB_GETOBJECT: */ /* 4.71 */ case TB_GETPADDING: @@ -7021,6 +7086,9 @@ case TB_SETMAXTEXTROWS: return TOOLBAR_SetMaxTextRows (hwnd, wParam, lParam); + case TB_SETMETRICS: + return TOOLBAR_SetMetrics(hwnd, (LPTBMETRICS)lParam); + case TB_SETPADDING: return TOOLBAR_SetPadding (hwnd, wParam, lParam);