- Use the new comctl32 color array for the colors. Provides better

support for the TB_SETCOLORSCHEME.
- Do some optimizations.
- Correct computation of nHeight and PGN_CALCSIZE.
- Implement the undocumented 045E message.
This commit is contained in:
Guy L. Albertelli 2002-04-05 21:15:06 +00:00 committed by Alexandre Julliard
parent 35d8e1ec0a
commit ffa48e0416

View file

@ -386,14 +386,16 @@ TOOLBAR_DrawFlatSeparator (LPRECT lpRect, HDC hdc, TOOLBAR_INFO *infoPtr)
myrect.top = lpRect->top + 2;
myrect.bottom = lpRect->bottom - 2;
newcolor = infoPtr->clrBtnShadow;
newcolor = (infoPtr->clrBtnShadow == CLR_DEFAULT) ?
comctl32_color.clrBtnShadow : infoPtr->clrBtnShadow;
oldcolor = SetBkColor (hdc, newcolor);
ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);
myrect.left = myrect.right;
myrect.right = myrect.left + 1;
newcolor = infoPtr->clrBtnHighlight;
newcolor = (infoPtr->clrBtnHighlight == CLR_DEFAULT) ?
comctl32_color.clrBtnHighlight : infoPtr->clrBtnHighlight;
SetBkColor (hdc, newcolor);
ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);
@ -428,14 +430,16 @@ TOOLBAR_DrawDDFlatSeparator (LPRECT lpRect, HDC hdc, TBUTTON_INFO *btnPtr, TOOLB
TRACE("rect=(%d,%d)-(%d,%d)\n",
myrect.left, myrect.top, myrect.right, myrect.bottom);
newcolor = infoPtr->clrBtnShadow;
newcolor = (infoPtr->clrBtnShadow == CLR_DEFAULT) ?
comctl32_color.clrBtnShadow : infoPtr->clrBtnShadow;
oldcolor = SetBkColor (hdc, newcolor);
ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);
myrect.top = myrect.bottom;
myrect.bottom = myrect.top + 1;
newcolor = infoPtr->clrBtnHighlight;
newcolor = (infoPtr->clrBtnHighlight == CLR_DEFAULT) ?
comctl32_color.clrBtnHighlight : infoPtr->clrBtnHighlight;
SetBkColor (hdc, newcolor);
ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);
@ -519,22 +523,32 @@ TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
hOldFont = SelectObject (hdc, infoPtr->hFont);
if (!(nState & TBSTATE_ENABLED)) {
clrOld = SetTextColor (hdc, GetSysColor (COLOR_3DHILIGHT));
clrOld = SetTextColor (hdc, comctl32_color.clr3dHilight);
OffsetRect (&rcText, 1, 1);
DrawTextW (hdc, lpText, -1, &rcText, infoPtr->dwDTFlags);
SetTextColor (hdc, GetSysColor (COLOR_3DSHADOW));
SetTextColor (hdc, comctl32_color.clr3dShadow);
OffsetRect (&rcText, -1, -1);
DrawTextW (hdc, lpText, -1, &rcText, infoPtr->dwDTFlags);
}
else if (nState & TBSTATE_INDETERMINATE) {
clrOld = SetTextColor (hdc, GetSysColor (COLOR_3DSHADOW));
DrawTextW (hdc, lpText, -1, &rcText, infoPtr->dwDTFlags);
clrOld = SetTextColor (hdc, comctl32_color.clr3dShadow);
}
#if 0
/*************************************************************
* we cannot do this till we implement NM_CUSTOMDRAW for *
* each item. Whether the "hot" item is drawn raised, or *
* drawn with a blue background and white text is determined *
* by the flags returned on the notification. Till then *
* this is commented out. *
*************************************************************/
else if (btnPtr->bHot)
clrOld = SetTextColor (hdc, comctl32_color.clrHighlightText);
}
#endif
else {
clrOld = SetTextColor (hdc, GetSysColor (COLOR_BTNTEXT));
DrawTextW (hdc, lpText, -1, &rcText, infoPtr->dwDTFlags);
clrOld = SetTextColor (hdc, comctl32_color.clrBtnText);
}
DrawTextW (hdc, lpText, -1, &rcText, infoPtr->dwDTFlags);
SetTextColor (hdc, clrOld);
SelectObject (hdc, hOldFont);
}
@ -748,9 +762,31 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc)
{
if (btnPtr->bHot)
{
DrawEdge (hdc, &rc, BDR_RAISEDINNER, BF_RECT);
if (hasDropDownArrow)
DrawEdge (hdc, &rcArrow, BDR_RAISEDINNER, BF_RECT);
#if 0
/*************************************************************
* we cannot do this till we implement NM_CUSTOMDRAW for *
* each item. Whether the "hot" item is drawn raised, or *
* drawn with a blue background and white text is determined *
* by the flags returned on the notification. Till then *
* this is commented out. *
*************************************************************/
if ( ???? )
{
COLORREF oldclr;
oldclr = SetBkColor(hdc, comctl32_color.clrHighlight);
ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, 0);
if (hasDropDownArrow)
ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rcArrow, NULL, 0, 0);
SetBkColor(hdc, oldclr);
}
else
#endif
{
DrawEdge (hdc, &rc, BDR_RAISEDINNER, BF_RECT);
if (hasDropDownArrow)
DrawEdge (hdc, &rcArrow, BDR_RAISEDINNER, BF_RECT);
}
}
#if 1
else /* The following code needs to be removed after
@ -1125,15 +1161,15 @@ TOOLBAR_CalcToolbar (HWND hwnd)
TOOLBAR_CalcStrings (hwnd, &sizeString);
for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++)
{
if (TOOLBAR_IsValidBitmapIndex(infoPtr,infoPtr->buttons[i].iBitmap))
usesBitmaps = TRUE;
}
if (dwStyle & TBSTYLE_LIST)
{
for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++)
{
if (infoPtr->buttons[i].iBitmap >= 0)
usesBitmaps = TRUE;
}
infoPtr->nButtonHeight = max((usesBitmaps) ? infoPtr->nBitmapHeight :
0, sizeString.cy) + 6;
0, sizeString.cy) + infoPtr->szPadding.cy;
infoPtr->nButtonWidth = ((usesBitmaps) ? infoPtr->nBitmapWidth :
0) + sizeString.cx + 6;
TRACE("LIST style, But w=%d h=%d, useBitmaps=%d, Bit w=%d h=%d\n",
@ -1142,12 +1178,6 @@ TOOLBAR_CalcToolbar (HWND hwnd)
TOOLBAR_DumpToolbar (infoPtr, __LINE__);
}
else {
for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++)
{
if (TOOLBAR_IsValidBitmapIndex(infoPtr,infoPtr->buttons[i].iBitmap))
usesBitmaps = TRUE;
}
if (sizeString.cy > 0)
{
if (usesBitmaps)
@ -1296,8 +1326,9 @@ TOOLBAR_CalcToolbar (HWND hwnd)
/* also considered as a row. */
btnPtr->nRow = nRows + nSepRows;
TRACE("button %d style=%x, bWrap=%d, nRows=%d, nSepRows=%d, btnrow=%d\n",
i, btnPtr->fsStyle, bWrap, nRows, nSepRows, btnPtr->nRow);
TRACE("button %d style=%x, bWrap=%d, nRows=%d, nSepRows=%d, btnrow=%d, (%d,%d)-(%d,%d)\n",
i, btnPtr->fsStyle, bWrap, nRows, nSepRows, btnPtr->nRow,
x, y, x+cx, y+cy);
if( bWrap )
{
@ -1332,12 +1363,26 @@ TOOLBAR_CalcToolbar (HWND hwnd)
/* infoPtr->nRows is the number of rows on the toolbar */
infoPtr->nRows = nRows + nSepRows + 1;
#if 0
/********************************************************************
* The following while interesting, does not match the values *
* created above for the button rectangles, nor the rcBound rect. *
* We will comment it out and remove it later. *
* *
* The problem showed up as heights in the pager control that was *
* wrong. *
********************************************************************/
/* nSepRows * (infoPtr->nBitmapHeight + 1) is the space following */
/* the last row. */
infoPtr->nHeight = TOP_BORDER + (nRows + 1) * infoPtr->nButtonHeight +
nSepRows * (SEPARATOR_WIDTH * 2 / 3) +
nSepRows * (infoPtr->nBitmapHeight + 1) +
BOTTOM_BORDER;
#endif
infoPtr->nHeight = infoPtr->rcBound.bottom - infoPtr->rcBound.top;
TRACE("toolbar height %d, button width %d\n", infoPtr->nHeight, infoPtr->nButtonWidth);
}
@ -1840,11 +1885,11 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
/* set colors and select objects */
oldBk = SetBkColor (lpdis->hDC, GetSysColor((lpdis->itemState & ODS_FOCUS)?COLOR_HIGHLIGHT:COLOR_WINDOW));
oldBk = SetBkColor (lpdis->hDC, (lpdis->itemState & ODS_FOCUS)?comctl32_color.clrHighlight:comctl32_color.clrWindow);
if (btnInfo->bVirtual)
oldText = SetTextColor (lpdis->hDC, GetSysColor(COLOR_GRAYTEXT));
oldText = SetTextColor (lpdis->hDC, comctl32_color.clrGrayText);
else
oldText = SetTextColor (lpdis->hDC, GetSysColor((lpdis->itemState & ODS_FOCUS)?COLOR_HIGHLIGHTTEXT:COLOR_WINDOWTEXT));
oldText = SetTextColor (lpdis->hDC, (lpdis->itemState & ODS_FOCUS)?comctl32_color.clrHighlightText:comctl32_color.clrWindowText);
hOldPen = SelectObject (lpdis->hDC, GetSysColorPen ((lpdis->itemState & ODS_SELECTED)?COLOR_HIGHLIGHT:COLOR_WINDOW));
hOldBrush = SelectObject (lpdis->hDC, GetSysColorBrush ((lpdis->itemState & ODS_FOCUS)?COLOR_HIGHLIGHT:COLOR_WINDOW));
@ -4113,8 +4158,11 @@ TOOLBAR_GetColorScheme (HWND hwnd, LPCOLORSCHEME lParam)
{
TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
lParam->clrBtnHighlight = infoPtr->clrBtnHighlight;
lParam->clrBtnShadow = infoPtr->clrBtnShadow;
lParam->clrBtnHighlight = (infoPtr->clrBtnHighlight == CLR_DEFAULT) ?
comctl32_color.clrBtnHighlight :
infoPtr->clrBtnHighlight;
lParam->clrBtnShadow = (infoPtr->clrBtnShadow == CLR_DEFAULT) ?
comctl32_color.clrBtnShadow : infoPtr->clrBtnShadow;
return 1;
}
@ -4146,6 +4194,60 @@ TOOLBAR_SetVersion (HWND hwnd, INT iVersion)
return iOldVersion;
}
/*********************************************************************/
/* */
/* This is undocumented and appears to be a "Super" TB_SETHOTITEM */
/* without the restriction of TBSTYLE_FLAT. This implementation is */
/* based on relay traces of the native control and IE 5.5 */
/* */
/*********************************************************************/
static LRESULT
TOOLBAR_Unkwn45E (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd);
INT nOldHotItem = infoPtr->nHotItem;
TBUTTON_INFO *btnPtr;
INT no_hi = 0;
NMTBHOTITEM nmhotitem;
if ((INT) wParam < 0 || (INT)wParam > infoPtr->nNumButtons)
wParam = -2;
infoPtr->nHotItem = (INT)wParam;
if (nOldHotItem != infoPtr->nHotItem) {
nmhotitem.dwFlags = (DWORD)lParam;
if ( !(nmhotitem.dwFlags & HICF_ENTERING) )
nmhotitem.idOld = (nOldHotItem >= 0) ?
infoPtr->buttons[nOldHotItem].idCommand : 0;
if ( !(nmhotitem.dwFlags & HICF_LEAVING) )
nmhotitem.idNew = (infoPtr->nHotItem >= 0) ?
infoPtr->buttons[infoPtr->nHotItem].idCommand : 0;
no_hi = TOOLBAR_SendNotify((NMHDR*)&nmhotitem, infoPtr, TBN_HOTITEMCHANGE);
}
if ((INT)wParam >=0) {
btnPtr = &infoPtr->buttons[(INT)wParam];
btnPtr->bHot = (no_hi) ? FALSE : TRUE;
InvalidateRect (hwnd, &btnPtr->rect,
TOOLBAR_HasText(infoPtr, btnPtr));
}
if (nOldHotItem>=0) {
btnPtr = &infoPtr->buttons[nOldHotItem];
btnPtr->bHot = FALSE;
InvalidateRect (hwnd, &btnPtr->rect,
TOOLBAR_HasText(infoPtr, btnPtr));
}
GetFocus();
TRACE("old item=%d, new item=%d, flags=%08lx, notify=%d\n",
nOldHotItem, infoPtr->nHotItem, (DWORD)lParam, no_hi);
if (nOldHotItem < 0)
return -1;
return (LRESULT)nOldHotItem;
}
static LRESULT
TOOLBAR_Unkwn463 (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
@ -4236,8 +4338,10 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
infoPtr->iVersion = 0;
infoPtr->hwndSelf = hwnd;
infoPtr->bDoRedraw = TRUE;
infoPtr->clrBtnHighlight = GetSysColor (COLOR_BTNHIGHLIGHT);
infoPtr->clrBtnShadow = GetSysColor (COLOR_BTNSHADOW);
infoPtr->clrBtnHighlight = CLR_DEFAULT;
infoPtr->clrBtnShadow = CLR_DEFAULT;
infoPtr->szPadding.cx = 7;
infoPtr->szPadding.cy = 6;
TOOLBAR_NotifyFormat(infoPtr, (WPARAM)hwnd, (LPARAM)NF_REQUERY);
SystemParametersInfoA (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
@ -4876,15 +4980,14 @@ TOOLBAR_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam)
LPNMPGCALCSIZE lppgc = (LPNMPGCALCSIZE)lParam;
if (lppgc->dwFlag == PGF_CALCWIDTH) {
lppgc->iWidth = infoPtr->nWidth;
lppgc->iWidth = infoPtr->rcBound.right - infoPtr->rcBound.left;
TRACE("processed PGN_CALCSIZE, returning horz size = %d\n",
infoPtr->nWidth);
lppgc->iWidth);
}
else {
lppgc->iHeight = infoPtr->nHeight;
lppgc->iHeight = infoPtr->rcBound.bottom - infoPtr->rcBound.top;
TRACE("processed PGN_CALCSIZE, returning vert size = %d or %d\n",
lppgc->iHeight, infoPtr->nHeight);
TRACE("processed PGN_CALCSIZE, returning vert size = %d\n",
lppgc->iHeight);
}
return 0;
}
@ -5116,6 +5219,15 @@ TOOLBAR_StyleChanged (HWND hwnd, INT nType, LPSTYLESTRUCT lpStyle)
}
static LRESULT
TOOLBAR_SysColorChange (HWND hwnd)
{
COMCTL32_RefreshSysColors();
return 0;
}
static LRESULT WINAPI
ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
@ -5373,6 +5485,9 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case TB_SETUNICODEFORMAT:
return TOOLBAR_SetUnicodeFormat (hwnd, wParam, lParam);
case TB_UNKWN45E:
return TOOLBAR_Unkwn45E (hwnd, wParam, lParam);
case TB_UNKWN463:
return TOOLBAR_Unkwn463 (hwnd, wParam, lParam);
@ -5459,7 +5574,8 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_STYLECHANGED:
return TOOLBAR_StyleChanged (hwnd, (INT)wParam, (LPSTYLESTRUCT)lParam);
/* case WM_SYSCOLORCHANGE: */
case WM_SYSCOLORCHANGE:
return TOOLBAR_SysColorChange (hwnd);
/* case WM_WININICHANGE: */