mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-05 18:01:34 +00:00
- Fix positioning of text in buttons.
- Fix nButtonHeight so that it is not zero in some cases - Support TBSTYLE_TRANSPARENT. - Fix handling in WM_ERASEBKGND so that the default erase occurs between notifies. - Fix WM_NCCREATE processing to issue proper WM_STYLECHANGING (via SetWindowLong) and document the issues.
This commit is contained in:
parent
2bbca90cd7
commit
f876b5df5a
1 changed files with 95 additions and 22 deletions
|
@ -104,6 +104,7 @@ typedef struct
|
|||
HWND hwndNotify; /* handle to the window that gets notifications */
|
||||
HWND hwndSelf; /* my own handle */
|
||||
BOOL bTransparent; /* background transparency flag */
|
||||
BOOL bBtnTranspnt; /* button transparency flag */
|
||||
BOOL bAutoSize; /* auto size deadlock indicator */
|
||||
BOOL bAnchor; /* anchor highlight enabled */
|
||||
BOOL bNtfUnicode; /* TRUE if NOTIFYs use {W} */
|
||||
|
@ -198,8 +199,6 @@ TOOLBAR_CheckStyle (HWND hwnd, DWORD dwStyle)
|
|||
FIXME("[%04x] TBSTYLE_ALTDRAG not implemented\n", hwnd);
|
||||
if (dwStyle & TBSTYLE_REGISTERDROP)
|
||||
FIXME("[%04x] TBSTYLE_REGISTERDROP not implemented\n", hwnd);
|
||||
if (dwStyle & TBSTYLE_TRANSPARENT)
|
||||
FIXME("[%04x] TBSTYLE_TRANSPARENT not implemented\n", hwnd);
|
||||
}
|
||||
|
||||
|
||||
|
@ -459,7 +458,7 @@ TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
|
|||
rcText.left += (infoPtr->nBitmapWidth + 2);
|
||||
}
|
||||
else {
|
||||
rcText.top += infoPtr->nBitmapHeight;
|
||||
rcText.top += infoPtr->nBitmapHeight + 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -572,7 +571,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc)
|
|||
CopyRect (&rcArrow, &rc);
|
||||
CopyRect(&rcBitmap, &rc);
|
||||
|
||||
if (!infoPtr->bTransparent)
|
||||
if (!infoPtr->bBtnTranspnt)
|
||||
FillRect( hdc, &rc, GetSysColorBrush(COLOR_BTNFACE));
|
||||
|
||||
if (hasDropDownArrow)
|
||||
|
@ -773,7 +772,7 @@ TOOLBAR_Refresh (HWND hwnd, HDC hdc, PAINTSTRUCT* ps)
|
|||
|
||||
TOOLBAR_DumpToolbar (infoPtr, __LINE__);
|
||||
|
||||
if (infoPtr->bTransparent)
|
||||
if (infoPtr->bBtnTranspnt)
|
||||
oldBKmode = SetBkMode (hdc, TRANSPARENT);
|
||||
|
||||
/* redraw necessary buttons */
|
||||
|
@ -784,7 +783,7 @@ TOOLBAR_Refresh (HWND hwnd, HDC hdc, PAINTSTRUCT* ps)
|
|||
TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
|
||||
}
|
||||
|
||||
if (infoPtr->bTransparent && (oldBKmode != TRANSPARENT))
|
||||
if (infoPtr->bBtnTranspnt && (oldBKmode != TRANSPARENT))
|
||||
SetBkMode (hdc, oldBKmode);
|
||||
}
|
||||
|
||||
|
@ -1078,8 +1077,19 @@ TOOLBAR_CalcToolbar (HWND hwnd)
|
|||
|
||||
if (dwStyle & TBSTYLE_LIST)
|
||||
{
|
||||
infoPtr->nButtonHeight = max(infoPtr->nBitmapHeight, sizeString.cy) + 6;
|
||||
infoPtr->nButtonWidth = infoPtr->nBitmapWidth + sizeString.cx + 6;
|
||||
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;
|
||||
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",
|
||||
infoPtr->nButtonWidth, infoPtr->nButtonHeight, usesBitmaps,
|
||||
infoPtr->nBitmapWidth, infoPtr->nBitmapHeight);
|
||||
TOOLBAR_DumpToolbar (infoPtr, __LINE__);
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++)
|
||||
|
@ -1091,7 +1101,8 @@ TOOLBAR_CalcToolbar (HWND hwnd)
|
|||
if (sizeString.cy > 0)
|
||||
{
|
||||
if (usesBitmaps)
|
||||
infoPtr->nButtonHeight = sizeString.cy +
|
||||
infoPtr->nButtonHeight = sizeString.cy +
|
||||
2 + /* this is the space to separate text from bitmap */
|
||||
infoPtr->nBitmapHeight + 6;
|
||||
else
|
||||
infoPtr->nButtonHeight = sizeString.cy + 6;
|
||||
|
@ -1107,13 +1118,13 @@ TOOLBAR_CalcToolbar (HWND hwnd)
|
|||
|
||||
if ( infoPtr->cxMin >= 0 && infoPtr->nButtonWidth < infoPtr->cxMin )
|
||||
infoPtr->nButtonWidth = infoPtr->cxMin;
|
||||
if ( infoPtr->cxMax >= 0 && infoPtr->nButtonWidth > infoPtr->cxMax )
|
||||
if ( infoPtr->cxMax > 0 && infoPtr->nButtonWidth > infoPtr->cxMax )
|
||||
infoPtr->nButtonWidth = infoPtr->cxMax;
|
||||
|
||||
TOOLBAR_WrapToolbar( hwnd, dwStyle );
|
||||
|
||||
x = infoPtr->nIndent;
|
||||
y = (dwStyle & TBSTYLE_FLAT) ? 0 : TOP_BORDER;
|
||||
y = 0;
|
||||
|
||||
/*
|
||||
* We will set the height below, and we set the width on entry
|
||||
|
@ -2759,8 +2770,11 @@ TOOLBAR_GetButtonSize (HWND hwnd)
|
|||
{
|
||||
TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
|
||||
|
||||
return MAKELONG((WORD)infoPtr->nButtonWidth,
|
||||
(WORD)infoPtr->nButtonHeight);
|
||||
if (infoPtr->nNumButtons > 0)
|
||||
return MAKELONG((WORD)infoPtr->nButtonWidth,
|
||||
(WORD)infoPtr->nButtonHeight);
|
||||
else
|
||||
return MAKELONG(8,7);
|
||||
}
|
||||
|
||||
|
||||
|
@ -4012,7 +4026,8 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
infoPtr->nOldHit = -1;
|
||||
infoPtr->nHotItem = -2; /* It has to be initially different from nOldHit */
|
||||
infoPtr->hwndNotify = GetParent (hwnd);
|
||||
infoPtr->bTransparent = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_TRANSPARENT));
|
||||
infoPtr->bTransparent = (dwStyle & TBSTYLE_TRANSPARENT);
|
||||
infoPtr->bBtnTranspnt = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_LIST));
|
||||
infoPtr->dwDTFlags = (dwStyle & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE : DT_CENTER;
|
||||
infoPtr->bAnchor = FALSE; /* no anchor highlighting */
|
||||
infoPtr->iVersion = 0;
|
||||
|
@ -4094,15 +4109,15 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
|
||||
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
|
||||
NMTBCUSTOMDRAW tbcd;
|
||||
INT ret;
|
||||
INT ret, ntfret;
|
||||
|
||||
if (dwStyle & TBSTYLE_CUSTOMERASE) {
|
||||
ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW));
|
||||
tbcd.nmcd.dwDrawStage = CDDS_PREERASE;
|
||||
tbcd.nmcd.hdc = (HDC)wParam;
|
||||
ret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW);
|
||||
ntfret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW);
|
||||
/* FIXME: in general the return flags *can* be or'ed together */
|
||||
switch (ret)
|
||||
switch (ntfret)
|
||||
{
|
||||
case CDRF_DODEFAULT:
|
||||
break;
|
||||
|
@ -4110,7 +4125,7 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
return TRUE;
|
||||
default:
|
||||
FIXME("[%04x] response %d not handled to NM_CUSTOMDRAW (CDDS_PREERASE)\n",
|
||||
hwnd, ret);
|
||||
hwnd, ntfret);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4131,13 +4146,14 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
SetWindowOrgEx (hdc, ptorig.x, ptorig.y, 0);
|
||||
return TRUE;
|
||||
}
|
||||
ret = DefWindowProcA (hwnd, WM_ERASEBKGND, wParam, lParam);
|
||||
|
||||
if (dwStyle & TBSTYLE_CUSTOMERASE) {
|
||||
ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW));
|
||||
tbcd.nmcd.dwDrawStage = CDDS_POSTERASE;
|
||||
tbcd.nmcd.hdc = (HDC)wParam;
|
||||
ret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW);
|
||||
switch (ret)
|
||||
ntfret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW);
|
||||
switch (ntfret)
|
||||
{
|
||||
case CDRF_DODEFAULT:
|
||||
break;
|
||||
|
@ -4145,10 +4161,10 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
return TRUE;
|
||||
default:
|
||||
FIXME("[%04x] response %d not handled to NM_CUSTOMDRAW (CDDS_PREERASE)\n",
|
||||
hwnd, ret);
|
||||
hwnd, ntfret);
|
||||
}
|
||||
}
|
||||
return DefWindowProcA (hwnd, WM_ERASEBKGND, wParam, lParam);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -4549,6 +4565,8 @@ static LRESULT
|
|||
TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
TOOLBAR_INFO *infoPtr;
|
||||
LPCREATESTRUCTA cs = (LPCREATESTRUCTA)lParam;
|
||||
DWORD styleadd = 0;
|
||||
|
||||
/* allocate memory for info structure */
|
||||
infoPtr = (TOOLBAR_INFO *)COMCTL32_Alloc (sizeof(TOOLBAR_INFO));
|
||||
|
@ -4563,6 +4581,58 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
SetWindowLongA (hwnd, GWL_HINSTANCE, (DWORD)hInst);
|
||||
}
|
||||
|
||||
/* native control does:
|
||||
* Get a lot of colors and brushes
|
||||
* WM_NOTIFYFORMAT
|
||||
* SystemParametersInfoA(0x1f, 0x3c, adr1, 0)
|
||||
* CreateFontIndirectA(adr1)
|
||||
* CreateBitmap(0x27, 0x24, 1, 1, 0)
|
||||
* hdc = GetDC(toolbar)
|
||||
* GetSystemMetrics(0x48)
|
||||
* fnt2=CreateFontA(0xe, 0, 0, 0, 0x190, 0, 0, 0, 0, 2,
|
||||
* 0, 0, 0, 0, "MARLETT")
|
||||
* oldfnt = SelectObject(hdc, fnt2)
|
||||
* GetCharWidthA(hdc, 0x36, 0x36, adr2)
|
||||
* GetTextMetricsA(hdc, adr3)
|
||||
* SelectObject(hdc, oldfnt)
|
||||
* DeleteObject(fnt2)
|
||||
* ReleaseDC(hdc)
|
||||
* InvalidateRect(toolbar, 0, 1)
|
||||
* SetWindowLongA(toolbar, 0, addr)
|
||||
* SetWindowLongA(toolbar, -16, xxx) **sometimes**
|
||||
* WM_STYLECHANGING
|
||||
* CallWinEx old new
|
||||
* ie 1 0x56000a4c 0x46000a4c 0x56008a4d
|
||||
* ie 2 0x4600094c 0x4600094c 0x4600894d
|
||||
* ie 3 0x56000b4c 0x46000b4c 0x56008b4d
|
||||
* rebar 0x50008844 0x40008844 0x50008845
|
||||
* pager 0x50000844 0x40000844 0x50008845
|
||||
* IC35mgr 0x5400084e **nochange**
|
||||
* on entry to _NCCREATE 0x5400084e
|
||||
* rowlist 0x5400004e **nochange**
|
||||
* on entry to _NCCREATE 0x5400004e
|
||||
*
|
||||
*/
|
||||
|
||||
/* I think the code below is a bug, but it is the way that the native
|
||||
* controls seem to work. The effect is that if the user of TBSTYLE_FLAT
|
||||
* forgets to specify TBSTYLE_TRANSPARENT but does specify either
|
||||
* CCS_TOP or CCS_BOTTOM (_NOMOVEY and _TOP), then the control
|
||||
* does *not* set TBSTYLE_TRANSPARENT even though it should!!!!
|
||||
* Some how, the only cases of this seem to be MFC programs.
|
||||
*
|
||||
* Note also that the addition of _TRANSPARENT occurs *only* here. It
|
||||
* does not occur in the WM_STYLECHANGING routine.
|
||||
* (Guy Albertelli 9/2001)
|
||||
*
|
||||
*/
|
||||
if ((cs->style & TBSTYLE_FLAT) && !(cs->style & TBSTYLE_TRANSPARENT))
|
||||
styleadd |= TBSTYLE_TRANSPARENT;
|
||||
if (!(cs->style & (CCS_TOP | CCS_NOMOVEY))) {
|
||||
styleadd |= CCS_TOP; /* default to top */
|
||||
SetWindowLongA (hwnd, GWL_STYLE, cs->style | styleadd);
|
||||
}
|
||||
|
||||
return DefWindowProcA (hwnd, WM_NCCREATE, wParam, lParam);
|
||||
}
|
||||
|
||||
|
@ -4767,6 +4837,9 @@ TOOLBAR_StyleChanged (HWND hwnd, INT nType, LPSTYLESTRUCT lpStyle)
|
|||
else {
|
||||
infoPtr->dwDTFlags = DT_CENTER;
|
||||
}
|
||||
infoPtr->bTransparent = (lpStyle->styleNew & TBSTYLE_TRANSPARENT);
|
||||
infoPtr->bBtnTranspnt = (lpStyle->styleNew &
|
||||
(TBSTYLE_FLAT | TBSTYLE_LIST));
|
||||
TOOLBAR_CheckStyle (hwnd, lpStyle->styleNew);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue