From 60935ec3e93fba02e6d8b5c30bdc2b7848a82c7d Mon Sep 17 00:00:00 2001 From: Pascal Lessard Date: Thu, 25 Mar 1999 16:42:27 +0000 Subject: [PATCH] Change the AddBitmap function. Implement flat toolbar. Change CreateToolbarEx. Implement partially the hot buttons for toolbar. --- dlls/comctl32/commctrl.c | 29 +++++------- dlls/comctl32/imagelist.c | 2 +- dlls/comctl32/toolbar.c | 115 +++++++++++++++++++++++++++++++++++----------- include/commctrl.h | 2 +- include/toolbar.h | 5 +- 5 files changed, 105 insertions(+), 48 deletions(-) diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index 06ec7973024..f02a9c4329b 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -629,34 +629,29 @@ CreateToolbarEx (HWND hwnd, DWORD style, UINT wID, INT nBitmaps, (WPARAM)uStructSize, 0); /* set bitmap and button size */ - if (hBMInst == HINST_COMMCTRL) { - if (wBMID & 1) { - SendMessageA (hwndTB, TB_SETBITMAPSIZE, 0, - MAKELPARAM(26, 25)); - SendMessageA (hwndTB, TB_SETBUTTONSIZE, 0, - MAKELPARAM(33, 32)); - } - else { - SendMessageA (hwndTB, TB_SETBITMAPSIZE, 0, - MAKELPARAM(16, 15)); - SendMessageA (hwndTB, TB_SETBUTTONSIZE, 0, - MAKELPARAM(23, 22)); - } - } - else { + /*If CreateToolbarEx receive 0, windows set default values*/ + if (dyBitmap < 0) + dyBitmap = 16; + if (dxBitmap < 0) + dxBitmap = 16; + SendMessageA (hwndTB, TB_SETBITMAPSIZE, 0, MAKELPARAM((WORD)dyBitmap, (WORD)dxBitmap)); SendMessageA (hwndTB, TB_SETBUTTONSIZE, 0, MAKELPARAM((WORD)dyButton, (WORD)dxButton)); - } + /* add bitmaps */ + if (nBitmaps > 0) + { tbab.hInst = hBMInst; tbab.nID = wBMID; + SendMessageA (hwndTB, TB_ADDBITMAP, (WPARAM)nBitmaps, (LPARAM)&tbab); - + } /* add buttons */ + if(iNumButtons > 0) SendMessageA (hwndTB, TB_ADDBUTTONSA, (WPARAM)iNumButtons, (LPARAM)lpButtons); } diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c index f0280ec9533..3e93f809e14 100644 --- a/dlls/comctl32/imagelist.c +++ b/dlls/comctl32/imagelist.c @@ -2107,7 +2107,7 @@ ImageList_SetImageCount (HIMAGELIST himl, INT iImageCount) if (!himl) return FALSE; - if (himl->cCurImage <= iImageCount) + if (himl->cCurImage >= iImageCount) return FALSE; if (himl->cMaxImage > iImageCount) return TRUE; diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c index 013dc9b7795..893224c8ee0 100644 --- a/dlls/comctl32/toolbar.c +++ b/dlls/comctl32/toolbar.c @@ -1,3 +1,4 @@ + /* * Toolbar control * @@ -224,11 +225,17 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) TOOLBAR_DrawPattern (hdc, &rc); if (dwStyle & TBSTYLE_FLAT) + { + if (infoPtr->himlDef != NULL) ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc, rc.left+2, rc.top+2, ILD_NORMAL); else ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc, rc.left+2, rc.top+2, ILD_NORMAL); + } + else + ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc, + rc.left+2, rc.top+2, ILD_NORMAL); TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState); return; } @@ -244,16 +251,27 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) return; } + if (dwStyle & TBSTYLE_FLAT) + { + if(btnPtr->bHot) + DrawEdge (hdc, &rc, BDR_RAISEDINNER, + BF_RECT | BF_MIDDLE | BF_SOFT); + + if(infoPtr->himlDef != NULL) + ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc, + rc.left +2, rc.top +2, ILD_NORMAL); + else + ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc, + rc.left +2, rc.top +2, ILD_NORMAL); + } + else{ /* normal state */ DrawEdge (hdc, &rc, EDGE_RAISED, BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); - if (dwStyle & TBSTYLE_FLAT) - ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc, - rc.left+1, rc.top+1, ILD_NORMAL); - else ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc, rc.left+1, rc.top+1, ILD_NORMAL); + } TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState); } @@ -610,7 +628,10 @@ TOOLBAR_RelayEvent (HWND hwndTip, HWND hwndMsg, UINT uMsg, SendMessageA (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg); } - +/*********************************************************************** + * TOOLBAR_AddBitmap: Add the bitmaps to the default image list. + * + */ static LRESULT TOOLBAR_AddBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) { @@ -623,26 +644,42 @@ TOOLBAR_AddBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) TRACE (toolbar, "adding %d bitmaps!\n", wParam); - if (!(infoPtr->himlDef)) { - /* create new default image list */ - TRACE (toolbar, "creating default image list!\n"); + if (!(infoPtr->himlStd)) { + /* create new standard image list */ + + TRACE (toolbar, "creating standard image list!\n"); + + + /* Windows resize all the buttons to the size of a newly added STandard Image*/ + /* TODO: The resizing should be done each time a standard image is added*/ + if (lpAddBmp->hInst == HINST_COMMCTRL) + { + + if (lpAddBmp->nID & 1) + { + SendMessageA (hwnd, TB_SETBITMAPSIZE, 0, + MAKELPARAM((WORD)26, (WORD)26)); + SendMessageA (hwnd, TB_SETBUTTONSIZE, 0, + MAKELPARAM((WORD)33, (WORD)33)); + } + else + { + SendMessageA (hwnd, TB_SETBITMAPSIZE, 0, + MAKELPARAM((WORD)16, (WORD)16)); + + SendMessageA (hwnd, TB_SETBUTTONSIZE, 0, + MAKELPARAM((WORD)22, (WORD)22)); + } + + TOOLBAR_CalcToolbar (hwnd); + } + infoPtr->himlStd = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, ILC_COLOR | ILC_MASK, (INT)wParam, 2); } -#if 0 - if (!(infoPtr->himlDis)) { - /* create new disabled image list */ - TRACE (toolbar, "creating disabled image list!\n"); - infoPtr->himlDis = - ImageList_Create (infoPtr->nBitmapWidth, - infoPtr->nBitmapHeight, ILC_COLOR | ILC_MASK, - (INT)wParam, 2); - } -#endif - - /* Add bitmaps to the default image list */ + /* Add bitmaps to the standard image list */ if (lpAddBmp->hInst == (HINSTANCE)0) { nIndex = ImageList_AddMasked (infoPtr->himlStd, (HBITMAP)lpAddBmp->nID, @@ -650,23 +687,24 @@ TOOLBAR_AddBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) } else if (lpAddBmp->hInst == HINST_COMMCTRL) { /* add internal bitmaps */ + FIXME (toolbar, "internal bitmaps not supported!\n"); + /* TODO: Resize all the buttons when a new standard image is added */ /* Hack to "add" some reserved images within the image list to get the right image indices */ nIndex = ImageList_GetImageCount (infoPtr->himlStd); ImageList_SetImageCount (infoPtr->himlStd, nIndex + (INT)wParam); + } else { HBITMAP hBmp = LoadBitmapA (lpAddBmp->hInst, (LPSTR)lpAddBmp->nID); - nIndex = ImageList_AddMasked (infoPtr->himlStd, hBmp, CLR_DEFAULT); DeleteObject (hBmp); } - infoPtr->nNumBitmaps += (INT)wParam; return nIndex; @@ -711,6 +749,7 @@ TOOLBAR_AddButtonsA (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr->fsStyle = lpTbb[nCount].fsStyle; btnPtr->dwData = lpTbb[nCount].dwData; btnPtr->iString = lpTbb[nCount].iString; + btnPtr->bHot = FALSE; if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) { TTTOOLINFOA ti; @@ -2156,10 +2195,9 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->bUnicode = IsWindowUnicode (hwnd); infoPtr->nButtonDown = -1; infoPtr->nOldHit = -1; - + infoPtr->nHotItem = -2; // It has to be initially different from nOldHit infoPtr->hwndNotify = GetParent (hwnd); infoPtr->bTransparent = (dwStyle & TBSTYLE_FLAT); - infoPtr->nHotItem = -1; infoPtr->dwDTFlags = DT_CENTER; SystemParametersInfoA (SPI_GETICONTITLELOGFONT, 0, &logFont, 0); @@ -2390,8 +2428,8 @@ TOOLBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam) static LRESULT TOOLBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam) { + TBUTTON_INFO *btnPtr, *oldBtnPtr; TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - TBUTTON_INFO *btnPtr; POINT pt; INT nHit; HDC hdc; @@ -2402,10 +2440,34 @@ TOOLBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam) pt.x = (INT)LOWORD(lParam); pt.y = (INT)HIWORD(lParam); + nHit = TOOLBAR_InternalHitTest (hwnd, &pt); + if (infoPtr->nOldHit != nHit) + { + //Remove the effect of an old hot button + if(infoPtr->nOldHit == infoPtr->nHotItem) + { + oldBtnPtr = &infoPtr->buttons[infoPtr->nOldHit]; + oldBtnPtr->bHot = FALSE; + + InvalidateRect (hwnd, &oldBtnPtr->rect, TRUE); + } + + // It's not a separator or in nowhere. It's a hot button. + if (nHit >= 0) + { + btnPtr = &infoPtr->buttons[nHit]; + btnPtr->bHot = TRUE; + + hdc = GetDC (hwnd); + TOOLBAR_DrawButton (hwnd, btnPtr, hdc); + ReleaseDC (hwnd, hdc); + + infoPtr->nHotItem = nHit; + } + if (infoPtr->bCaptured) { - if (infoPtr->nOldHit != nHit) { btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; if (infoPtr->nOldHit == infoPtr->nButtonDown) { btnPtr->fsState &= ~TBSTATE_PRESSED; @@ -2422,7 +2484,6 @@ TOOLBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam) } infoPtr->nOldHit = nHit; } - return 0; } diff --git a/include/commctrl.h b/include/commctrl.h index ce6e65e72aa..029a449426e 100644 --- a/include/commctrl.h +++ b/include/commctrl.h @@ -752,7 +752,7 @@ typedef struct tagNMHDDISPINFOW /* Toolbar */ #define TOOLBARCLASSNAME16 "ToolbarWindow" -#define TOOLBARCLASSNAMEW L"ToolbarWindow32" +#define TOOLBARCLASSNAMEW "ToolbarWindow32" #define TOOLBARCLASSNAMEA "ToolbarWindow32" #define TOOLBARCLASSNAME WINELIB_NAME_AW(TOOLBARCLASSNAME) diff --git a/include/toolbar.h b/include/toolbar.h index 2c943c0ce15..968dab5db36 100644 --- a/include/toolbar.h +++ b/include/toolbar.h @@ -17,6 +17,7 @@ typedef struct tagTBUTTON_INFO DWORD dwData; INT iString; + BOOL bHot; INT nRow; RECT rect; } TBUTTON_INFO; @@ -45,8 +46,8 @@ typedef struct tagTOOLBAR_INFO INT nOldHit; INT nHotItem; /* index of the "hot" item */ HFONT hFont; /* text font */ - HIMAGELIST himlStd; /* standard image list */ - HIMAGELIST himlDef; /* default image list */ + HIMAGELIST himlStd; /* standard image list for TB_ADDBITMAP command*/ + HIMAGELIST himlDef; /* default image list for TB_SETIMAGELIST*/ HIMAGELIST himlHot; /* hot image list */ HIMAGELIST himlDis; /* disabled image list */ HWND hwndToolTip; /* handle to tool tip control */ -- 2.11.4.GIT