4 * Copyright 1998 Eric Kohl
7 * - A little bug in TOOLBAR_DrawMasked()
8 * - Button wrapping (under construction).
12 * - Tooltip support (almost complete).
14 * - Internal COMMCTL32 bitmaps.
15 * - Fix TOOLBAR_SetButtonInfo32A.
16 * - Fix TOOLBAR_Customize. (Customize dialog.)
19 * - Run tests using Waite Group Windows95 API Bible Volume 2.
20 * The second cdrom contains executables addstr.exe, btncount.exe,
21 * btnstate.exe, butstrsz.exe, chkbtn.exe, chngbmp.exe, customiz.exe,
22 * enablebtn.exe, getbmp.exe, getbtn.exe, getflags.exe, hidebtn.exe,
23 * indetbtn.exe, insbtn.exe, pressbtn.exe, setbtnsz.exe, setcmdid.exe,
24 * setparnt.exe, setrows.exe, toolwnd.exe.
25 * - Microsofts controlspy examples.
30 #include "sysmetrics.h"
36 /* #define __NEW_WRAP_CODE__ */
38 #define SEPARATOR_WIDTH 8
39 #define SEPARATOR_HEIGHT 5
41 #define BOTTOM_BORDER 2
45 #define TOOLBAR_GetInfoPtr(wndPtr) ((TOOLBAR_INFO *)wndPtr->wExtra[0])
49 TOOLBAR_DrawFlatSeparator (LPRECT32 lpRect, HDC32 hdc)
51 INT32 x = (lpRect->left + lpRect->right) / 2 - 1;
52 INT32 yBottom = lpRect->bottom - 3;
53 INT32 yTop = lpRect->top + 1;
55 SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DSHADOW));
56 MoveToEx32 (hdc, x, yBottom, NULL);
57 LineTo32 (hdc, x, yTop);
59 SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DHILIGHT));
60 MoveToEx32 (hdc, x, yBottom, NULL);
61 LineTo32 (hdc, x, yTop);
66 TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
67 HDC32 hdc, INT32 nState)
69 RECT32 rcText = btnPtr->rect;
75 if ((btnPtr->iString > -1) && (btnPtr->iString < infoPtr->nNumStrings)) {
76 InflateRect32 (&rcText, -3, -3);
77 rcText.top += infoPtr->nBitmapHeight;
78 if (nState & (TBSTATE_PRESSED | TBSTATE_CHECKED))
79 OffsetRect32 (&rcText, 1, 1);
81 hOldFont = SelectObject32 (hdc, infoPtr->hFont);
82 nOldBkMode = SetBkMode32 (hdc, TRANSPARENT);
83 if (!(nState & TBSTATE_ENABLED)) {
84 clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_3DHILIGHT));
85 OffsetRect32 (&rcText, 1, 1);
86 DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
87 &rcText, infoPtr->dwDTFlags);
88 SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
89 OffsetRect32 (&rcText, -1, -1);
90 DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
91 &rcText, infoPtr->dwDTFlags);
93 else if (nState & TBSTATE_INDETERMINATE) {
94 clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
95 DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
96 &rcText, infoPtr->dwDTFlags);
99 clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_BTNTEXT));
100 DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
101 &rcText, infoPtr->dwDTFlags);
104 SetTextColor32 (hdc, clrOld);
105 SelectObject32 (hdc, hOldFont);
106 if (nOldBkMode != TRANSPARENT)
107 SetBkMode32 (hdc, nOldBkMode);
113 TOOLBAR_DrawPattern (HDC32 hdc, LPRECT32 lpRect)
115 HBRUSH32 hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
116 INT32 cx = lpRect->right - lpRect->left;
117 INT32 cy = lpRect->bottom - lpRect->top;
118 PatBlt32 (hdc, lpRect->left, lpRect->top, cx, cy, 0x00FA0089);
119 SelectObject32 (hdc, hbr);
124 TOOLBAR_DrawMasked (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
125 HDC32 hdc, INT32 x, INT32 y)
127 /* FIXME: this function is a hack since it uses image list
128 internals directly */
130 HDC32 hdcImageList = CreateCompatibleDC32 (0);
131 HDC32 hdcMask = CreateCompatibleDC32 (0);
132 HIMAGELIST himl = infoPtr->himlStd;
135 /* create new bitmap */
136 hbmMask = CreateBitmap32 (himl->cx, himl->cy, 1, 1, NULL);
137 SelectObject32 (hdcMask, hbmMask);
139 /* copy the mask bitmap */
140 SelectObject32 (hdcImageList, himl->hbmMask);
141 SetBkColor32 (hdcImageList, RGB(255, 255, 255));
142 SetTextColor32 (hdcImageList, RGB(0, 0, 0));
143 BitBlt32 (hdcMask, 0, 0, himl->cx, himl->cy,
144 hdcImageList, himl->cx * btnPtr->iBitmap, 0, SRCCOPY);
147 /* add white mask from image */
148 SelectObject32 (hdcImageList, himl->hbmImage);
149 SetBkColor32 (hdcImageList, RGB(0, 0, 0));
150 BitBlt32 (hdcMask, 0, 0, himl->cx, himl->cy,
151 hdcImageList, himl->cx * btnPtr->iBitmap, 0, MERGEPAINT);
154 /* draw the new mask */
155 SelectObject32 (hdc, GetSysColorBrush32 (COLOR_3DHILIGHT));
156 BitBlt32 (hdc, x+1, y+1, himl->cx, himl->cy,
157 hdcMask, 0, 0, 0xB8074A);
159 SelectObject32 (hdc, GetSysColorBrush32 (COLOR_3DSHADOW));
160 BitBlt32 (hdc, x, y, himl->cx, himl->cy,
161 hdcMask, 0, 0, 0xB8074A);
163 DeleteObject32 (hbmMask);
164 DeleteDC32 (hdcMask);
165 DeleteDC32 (hdcImageList);
170 TOOLBAR_DrawButton (WND *wndPtr, TBUTTON_INFO *btnPtr, HDC32 hdc)
172 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
173 BOOL32 bFlat = (wndPtr->dwStyle & TBSTYLE_FLAT);
176 if (btnPtr->fsState & TBSTATE_HIDDEN) return;
179 if (btnPtr->fsStyle & TBSTYLE_SEP) {
180 if ((bFlat) && (btnPtr->idCommand == 0))
181 TOOLBAR_DrawFlatSeparator (&btnPtr->rect, hdc);
186 if (!(btnPtr->fsState & TBSTATE_ENABLED)) {
187 DrawEdge32 (hdc, &rc, EDGE_RAISED,
188 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
191 /* if (infoPtr->himlDis) */
192 ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
193 rc.left+1, rc.top+1, ILD_NORMAL);
195 /* TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1); */
198 TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1);
200 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
204 /* pressed TBSTYLE_BUTTON */
205 if (btnPtr->fsState & TBSTATE_PRESSED) {
206 DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
207 BF_RECT | BF_MIDDLE | BF_ADJUST);
208 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
209 rc.left+2, rc.top+2, ILD_NORMAL);
210 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
214 /* checked TBSTYLE_CHECK*/
215 if ((btnPtr->fsStyle & TBSTYLE_CHECK) &&
216 (btnPtr->fsState & TBSTATE_CHECKED)) {
218 DrawEdge32 (hdc, &rc, BDR_SUNKENOUTER,
219 BF_RECT | BF_MIDDLE | BF_ADJUST);
221 DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
222 BF_RECT | BF_MIDDLE | BF_ADJUST);
224 TOOLBAR_DrawPattern (hdc, &rc);
226 ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
227 rc.left+2, rc.top+2, ILD_NORMAL);
229 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
230 rc.left+2, rc.top+2, ILD_NORMAL);
231 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
236 if (btnPtr->fsState & TBSTATE_INDETERMINATE) {
237 DrawEdge32 (hdc, &rc, EDGE_RAISED,
238 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
240 TOOLBAR_DrawPattern (hdc, &rc);
241 TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1);
242 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
247 DrawEdge32 (hdc, &rc, EDGE_RAISED,
248 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
251 ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
252 rc.left+1, rc.top+1, ILD_NORMAL);
254 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
255 rc.left+1, rc.top+1, ILD_NORMAL);
257 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
262 TOOLBAR_Refresh (WND *wndPtr, HDC32 hdc)
264 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
265 TBUTTON_INFO *btnPtr;
269 btnPtr = infoPtr->buttons;
270 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++)
271 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
276 TOOLBAR_CalcStrings (WND *wndPtr, LPSIZE32 lpSize)
278 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
279 TBUTTON_INFO *btnPtr;
288 hOldFont = SelectObject32 (hdc, infoPtr->hFont);
290 btnPtr = infoPtr->buttons;
291 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
292 if (!(btnPtr->fsState & TBSTATE_HIDDEN) &&
293 (btnPtr->iString > -1) &&
294 (btnPtr->iString < infoPtr->nNumStrings)) {
295 LPWSTR lpText = infoPtr->strings[btnPtr->iString];
296 GetTextExtentPoint32W (hdc, lpText, lstrlen32W (lpText), &sz);
297 if (sz.cx > lpSize->cx)
299 if (sz.cy > lpSize->cy)
304 SelectObject32 (hdc, hOldFont);
305 ReleaseDC32 (0, hdc);
307 TRACE (toolbar, "string size %d x %d!\n", lpSize->cx, lpSize->cy);
312 TOOLBAR_CalcToolbar (WND *wndPtr)
314 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
315 TBUTTON_INFO *btnPtr, *grpPtr;
323 /* --- end new --- */
325 TOOLBAR_CalcStrings (wndPtr, &sizeString);
327 if (sizeString.cy > 0)
328 infoPtr->nButtonHeight = sizeString.cy + infoPtr->nBitmapHeight + 6;
329 else if (infoPtr->nButtonHeight < infoPtr->nBitmapHeight + 6)
330 infoPtr->nButtonHeight = infoPtr->nBitmapHeight + 6;
332 if (sizeString.cx > infoPtr->nBitmapWidth)
333 infoPtr->nButtonWidth = sizeString.cx + 6;
334 else if (infoPtr->nButtonWidth < infoPtr->nBitmapWidth + 6)
335 infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6;
337 x = infoPtr->nIndent;
339 cx = infoPtr->nButtonWidth;
340 cy = infoPtr->nButtonHeight;
343 /* calculate the size of each button according to it's style */
344 /* TOOLBAR_CalcButtons (wndPtr); */
346 infoPtr->rcBound.top = y;
347 infoPtr->rcBound.left = x;
348 infoPtr->rcBound.bottom = y + cy;
349 infoPtr->rcBound.right = x;
351 btnPtr = infoPtr->buttons;
352 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
355 if (btnPtr->fsState & TBSTATE_HIDDEN) {
356 SetRectEmpty32 (&btnPtr->rect);
360 #ifdef __NEW_WRAP_CODE__
362 if (btnPtr->fsStyle & TBSTYLE_SEP) {
363 /* UNDOCUMENTED: If a separator has a non zero bitmap index, */
364 /* it is the actual width of the separator. This is used for */
365 /* custom controls in toolbars. */
366 if ((wndPtr->dwStyle & TBSTYLE_WRAPABLE) &&
367 (btnPtr->fsState & TBSTATE_WRAP)) {
370 cx = infoPtr->nWidth;
371 cy = ((btnPtr->iBitmap > 0) ?
372 btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 / 3;
377 cx = (btnPtr->iBitmap > 0) ?
378 btnPtr->iBitmap : SEPARATOR_WIDTH;
381 /* this must be a button */
382 cx = infoPtr->nButtonWidth;
386 /* --- begin test --- */
387 if ((i >= nGrpCount) && (btnPtr->fsStyle & TBSTYLE_GROUP)) {
388 for (j = i, grpX = x, nGrpCount = 0; j < infoPtr->nNumButtons; j++) {
389 grpPtr = &infoPtr->buttons[j];
390 if (grpPtr->fsState & TBSTATE_HIDDEN)
395 if ((grpPtr->fsStyle & TBSTYLE_SEP) ||
396 !(grpPtr->fsStyle & TBSTYLE_GROUP) ||
397 (grpX > infoPtr->nWidth)) {
401 else if (grpX + x > infoPtr->nWidth) {
409 bWrap = ((bWrap || (x + cx > infoPtr->nWidth)) &&
410 (wndPtr->dwStyle & TBSTYLE_WRAPABLE));
414 x = infoPtr->nIndent;
418 SetRect32 (&btnPtr->rect, x, y, x + cx, y + cy);
420 btnPtr->nRow = nRows;
423 if (btnPtr->fsState & TBSTATE_WRAP) {
425 y += (cy + SEPARATOR_HEIGHT);
426 x = infoPtr->nIndent;
429 infoPtr->nRows = nRows + 1;
431 /* --- end test --- */
433 if (btnPtr->fsStyle & TBSTYLE_SEP) {
434 /* UNDOCUMENTED: If a separator has a non zero bitmap index, */
435 /* it is the actual width of the separator. This is used for */
436 /* custom controls in toolbars. */
437 if ((wndPtr->dwStyle & TBSTYLE_WRAPABLE) &&
438 (btnPtr->fsState & TBSTATE_WRAP)) {
441 cx = infoPtr->nWidth;
442 cy = ((btnPtr->iBitmap > 0) ?
443 btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 / 3;
448 cx = (btnPtr->iBitmap > 0) ?
449 btnPtr->iBitmap : SEPARATOR_WIDTH;
452 /* this must be a button */
453 cx = infoPtr->nButtonWidth;
456 btnPtr->rect.left = x;
457 btnPtr->rect.top = y;
458 btnPtr->rect.right = x + cx;
459 btnPtr->rect.bottom = y + cy;
461 if (infoPtr->rcBound.left > x)
462 infoPtr->rcBound.left = x;
463 if (infoPtr->rcBound.right < x + cx)
464 infoPtr->rcBound.right = x + cx;
465 if (infoPtr->rcBound.bottom < y + cy)
466 infoPtr->rcBound.bottom = y + cy;
468 if (infoPtr->hwndToolTip) {
471 ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
472 ti.cbSize = sizeof(TTTOOLINFO32A);
473 ti.hwnd = wndPtr->hwndSelf;
474 ti.uId = btnPtr->idCommand;
475 ti.rect = btnPtr->rect;
476 SendMessage32A (infoPtr->hwndToolTip, TTM_NEWTOOLRECT32A,
483 if (i < infoPtr->nNumButtons)
491 infoPtr->nHeight = y + cy + BOTTOM_BORDER;
492 TRACE (toolbar, "toolbar height %d\n", infoPtr->nHeight);
497 TOOLBAR_InternalHitTest (WND *wndPtr, LPPOINT32 lpPt)
499 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
500 TBUTTON_INFO *btnPtr;
503 btnPtr = infoPtr->buttons;
504 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
505 if (btnPtr->fsState & TBSTATE_HIDDEN)
508 if (btnPtr->fsStyle & TBSTYLE_SEP) {
509 if (PtInRect32 (&btnPtr->rect, *lpPt)) {
510 TRACE (toolbar, " ON SEPARATOR %d!\n", i);
515 if (PtInRect32 (&btnPtr->rect, *lpPt)) {
516 TRACE (toolbar, " ON BUTTON %d!\n", i);
522 TRACE (toolbar, " NOWHERE!\n");
528 TOOLBAR_GetButtonIndex (TOOLBAR_INFO *infoPtr, INT32 idCommand)
530 TBUTTON_INFO *btnPtr;
533 btnPtr = infoPtr->buttons;
534 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
535 if (btnPtr->idCommand == idCommand) {
536 TRACE (toolbar, "command=%d index=%d\n", idCommand, i);
540 TRACE (toolbar, "no index found for command=%d\n", idCommand);
546 TOOLBAR_GetCheckedGroupButtonIndex (TOOLBAR_INFO *infoPtr, INT32 nIndex)
548 TBUTTON_INFO *btnPtr;
551 if ((nIndex < 0) || (nIndex > infoPtr->nNumButtons))
554 /* check index button */
555 btnPtr = &infoPtr->buttons[nIndex];
556 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
557 if (btnPtr->fsState & TBSTATE_CHECKED)
561 /* check previous buttons */
562 nRunIndex = nIndex - 1;
563 while (nRunIndex >= 0) {
564 btnPtr = &infoPtr->buttons[nRunIndex];
565 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
566 if (btnPtr->fsState & TBSTATE_CHECKED)
574 /* check next buttons */
575 nRunIndex = nIndex + 1;
576 while (nRunIndex < infoPtr->nNumButtons) {
577 btnPtr = &infoPtr->buttons[nRunIndex];
578 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
579 if (btnPtr->fsState & TBSTATE_CHECKED)
592 TOOLBAR_RelayEvent (HWND32 hwndTip, HWND32 hwndMsg, UINT32 uMsg,
593 WPARAM32 wParam, LPARAM lParam)
601 msg.time = GetMessageTime ();
602 msg.pt.x = LOWORD(GetMessagePos ());
603 msg.pt.y = HIWORD(GetMessagePos ());
605 SendMessage32A (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
610 TOOLBAR_AddBitmap (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
612 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
613 LPTBADDBITMAP lpAddBmp = (LPTBADDBITMAP)lParam;
616 if ((!lpAddBmp) || ((INT32)wParam <= 0))
619 TRACE (toolbar, "adding %d bitmaps!\n", wParam);
621 if (!(infoPtr->himlDef)) {
622 /* create new default image list */
623 TRACE (toolbar, "creating default image list!\n");
625 ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight,
626 ILC_COLOR | ILC_MASK, (INT32)wParam, 2);
630 if (!(infoPtr->himlDis)) {
631 /* create new disabled image list */
632 TRACE (toolbar, "creating disabled image list!\n");
634 ImageList_Create (infoPtr->nBitmapWidth,
635 infoPtr->nBitmapHeight, ILC_COLOR | ILC_MASK,
640 /* Add bitmaps to the default image list */
641 if (lpAddBmp->hInst == (HINSTANCE32)0) {
643 ImageList_AddMasked (infoPtr->himlStd, (HBITMAP32)lpAddBmp->nID,
646 else if (lpAddBmp->hInst == HINST_COMMCTRL) {
647 /* add internal bitmaps */
648 FIXME (toolbar, "internal bitmaps not supported!\n");
650 /* Hack to "add" some reserved images within the image list
651 to get the right image indices */
652 nIndex = ImageList_GetImageCount (infoPtr->himlStd);
653 ImageList_SetImageCount (infoPtr->himlStd, nIndex + (INT32)wParam);
657 LoadBitmap32A (lpAddBmp->hInst, (LPSTR)lpAddBmp->nID);
659 nIndex = ImageList_AddMasked (infoPtr->himlStd, hBmp, CLR_DEFAULT);
661 DeleteObject32 (hBmp);
665 infoPtr->nNumBitmaps += (INT32)wParam;
672 TOOLBAR_AddButtons32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
674 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
675 LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
676 INT32 nOldButtons, nNewButtons, nAddButtons, nCount;
679 TRACE (toolbar, "adding %d buttons!\n", wParam);
681 nAddButtons = (UINT32)wParam;
682 nOldButtons = infoPtr->nNumButtons;
683 nNewButtons = nOldButtons + nAddButtons;
685 if (infoPtr->nNumButtons == 0) {
687 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);
690 TBUTTON_INFO *oldButtons = infoPtr->buttons;
692 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);
693 memcpy (&infoPtr->buttons[0], &oldButtons[0],
694 nOldButtons * sizeof(TBUTTON_INFO));
695 COMCTL32_Free (oldButtons);
698 infoPtr->nNumButtons = nNewButtons;
700 /* insert new button data */
701 for (nCount = 0; nCount < nAddButtons; nCount++) {
702 TBUTTON_INFO *btnPtr = &infoPtr->buttons[nOldButtons+nCount];
703 btnPtr->iBitmap = lpTbb[nCount].iBitmap;
704 btnPtr->idCommand = lpTbb[nCount].idCommand;
705 btnPtr->fsState = lpTbb[nCount].fsState;
706 btnPtr->fsStyle = lpTbb[nCount].fsStyle;
707 btnPtr->dwData = lpTbb[nCount].dwData;
708 btnPtr->iString = lpTbb[nCount].iString;
710 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) {
713 ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
714 ti.cbSize = sizeof (TTTOOLINFO32A);
715 ti.hwnd = wndPtr->hwndSelf;
716 ti.uId = btnPtr->idCommand;
718 ti.lpszText = LPSTR_TEXTCALLBACK32A;
720 SendMessage32A (infoPtr->hwndToolTip, TTM_ADDTOOL32A,
725 TOOLBAR_CalcToolbar (wndPtr);
727 hdc = GetDC32 (wndPtr->hwndSelf);
728 TOOLBAR_Refresh (wndPtr, hdc);
729 ReleaseDC32 (wndPtr->hwndSelf, hdc);
735 /* << TOOLBAR_AddButtons32W >> */
739 TOOLBAR_AddString32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
741 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
744 if ((wParam) && (HIWORD(lParam) == 0)) {
747 TRACE (toolbar, "adding string from resource!\n");
749 len = LoadString32A ((HINSTANCE32)wParam, (UINT32)lParam,
752 TRACE (toolbar, "len=%d \"%s\"\n", len, szString);
753 nIndex = infoPtr->nNumStrings;
754 if (infoPtr->nNumStrings == 0) {
756 COMCTL32_Alloc (sizeof(LPWSTR));
759 LPWSTR *oldStrings = infoPtr->strings;
761 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
762 memcpy (&infoPtr->strings[0], &oldStrings[0],
763 sizeof(LPWSTR) * infoPtr->nNumStrings);
764 COMCTL32_Free (oldStrings);
767 infoPtr->strings[infoPtr->nNumStrings] =
768 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
769 lstrcpyAtoW (infoPtr->strings[infoPtr->nNumStrings], szString);
770 infoPtr->nNumStrings++;
773 LPSTR p = (LPSTR)lParam;
778 TRACE (toolbar, "adding string(s) from array!\n");
779 nIndex = infoPtr->nNumStrings;
781 len = lstrlen32A (p);
782 TRACE (toolbar, "len=%d \"%s\"\n", len, p);
784 if (infoPtr->nNumStrings == 0) {
786 COMCTL32_Alloc (sizeof(LPWSTR));
789 LPWSTR *oldStrings = infoPtr->strings;
791 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
792 memcpy (&infoPtr->strings[0], &oldStrings[0],
793 sizeof(LPWSTR) * infoPtr->nNumStrings);
794 COMCTL32_Free (oldStrings);
797 infoPtr->strings[infoPtr->nNumStrings] =
798 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
799 lstrcpyAtoW (infoPtr->strings[infoPtr->nNumStrings], p);
800 infoPtr->nNumStrings++;
811 TOOLBAR_AddString32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
813 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
816 if ((wParam) && (HIWORD(lParam) == 0)) {
819 TRACE (toolbar, "adding string from resource!\n");
821 len = LoadString32W ((HINSTANCE32)wParam, (UINT32)lParam,
824 TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(szString));
825 nIndex = infoPtr->nNumStrings;
826 if (infoPtr->nNumStrings == 0) {
828 COMCTL32_Alloc (sizeof(LPWSTR));
831 LPWSTR *oldStrings = infoPtr->strings;
833 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
834 memcpy (&infoPtr->strings[0], &oldStrings[0],
835 sizeof(LPWSTR) * infoPtr->nNumStrings);
836 COMCTL32_Free (oldStrings);
839 infoPtr->strings[infoPtr->nNumStrings] =
840 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
841 lstrcpy32W (infoPtr->strings[infoPtr->nNumStrings], szString);
842 infoPtr->nNumStrings++;
845 LPWSTR p = (LPWSTR)lParam;
850 TRACE (toolbar, "adding string(s) from array!\n");
851 nIndex = infoPtr->nNumStrings;
853 len = lstrlen32W (p);
854 TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(p));
856 if (infoPtr->nNumStrings == 0) {
858 COMCTL32_Alloc (sizeof(LPWSTR));
861 LPWSTR *oldStrings = infoPtr->strings;
863 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
864 memcpy (&infoPtr->strings[0], &oldStrings[0],
865 sizeof(LPWSTR) * infoPtr->nNumStrings);
866 COMCTL32_Free (oldStrings);
869 infoPtr->strings[infoPtr->nNumStrings] =
870 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
871 lstrcpy32W (infoPtr->strings[infoPtr->nNumStrings], p);
872 infoPtr->nNumStrings++;
883 TOOLBAR_AutoSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
885 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
889 UINT32 uPosFlags = 0;
891 TRACE (toolbar, "resize forced!\n");
893 parent = GetParent32 (wndPtr->hwndSelf);
894 GetClientRect32(parent, &parent_rect);
896 if (wndPtr->dwStyle & CCS_NORESIZE) {
897 uPosFlags |= (SWP_NOSIZE | SWP_NOMOVE);
902 infoPtr->nWidth = parent_rect.right - parent_rect.left;
903 TOOLBAR_CalcToolbar (wndPtr);
904 cy = infoPtr->nHeight;
905 cx = infoPtr->nWidth;
908 if (wndPtr->dwStyle & CCS_NOPARENTALIGN)
909 uPosFlags |= SWP_NOMOVE;
911 if (!(wndPtr->dwStyle & CCS_NODIVIDER))
912 cy += sysMetrics[SM_CYEDGE];
914 infoPtr->bAutoSize = TRUE;
915 SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, parent_rect.left, parent_rect.top,
923 TOOLBAR_ButtonCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
925 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
927 return infoPtr->nNumButtons;
932 TOOLBAR_ButtonStructSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
934 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
936 if (infoPtr == NULL) {
937 ERR (toolbar, "(0x%08lx, 0x%08x, 0x%08lx)\n", (DWORD)wndPtr, wParam, lParam);
938 ERR (toolbar, "infoPtr == NULL!\n");
942 infoPtr->dwStructSize = (DWORD)wParam;
949 TOOLBAR_ChangeBitmap (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
951 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
952 TBUTTON_INFO *btnPtr;
956 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
960 btnPtr = &infoPtr->buttons[nIndex];
961 btnPtr->iBitmap = LOWORD(lParam);
963 hdc = GetDC32 (wndPtr->hwndSelf);
964 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
965 ReleaseDC32 (wndPtr->hwndSelf, hdc);
972 TOOLBAR_CheckButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
974 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
975 TBUTTON_INFO *btnPtr;
978 INT32 nOldIndex = -1;
980 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
984 btnPtr = &infoPtr->buttons[nIndex];
986 if (!(btnPtr->fsStyle & TBSTYLE_CHECK))
989 if (LOWORD(lParam) == FALSE)
990 btnPtr->fsState &= ~TBSTATE_CHECKED;
992 if (btnPtr->fsStyle & TBSTYLE_GROUP) {
994 TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, nIndex);
995 if (nOldIndex == nIndex)
998 infoPtr->buttons[nOldIndex].fsState &= ~TBSTATE_CHECKED;
1000 btnPtr->fsState |= TBSTATE_CHECKED;
1003 hdc = GetDC32 (wndPtr->hwndSelf);
1004 if (nOldIndex != -1)
1005 TOOLBAR_DrawButton (wndPtr, &infoPtr->buttons[nOldIndex], hdc);
1006 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
1007 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1009 /* FIXME: Send a WM_NOTIFY?? */
1016 TOOLBAR_CommandToIndex (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1018 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1020 return TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1025 TOOLBAR_Customize (WND *wndPtr)
1027 FIXME (toolbar, "customization not implemented!\n");
1034 TOOLBAR_DeleteButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1036 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1037 INT32 nIndex = (INT32)wParam;
1039 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1042 if ((infoPtr->hwndToolTip) &&
1043 !(infoPtr->buttons[nIndex].fsStyle & TBSTYLE_SEP)) {
1046 ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
1047 ti.cbSize = sizeof (TTTOOLINFO32A);
1048 ti.hwnd = wndPtr->hwndSelf;
1049 ti.uId = infoPtr->buttons[nIndex].idCommand;
1051 SendMessage32A (infoPtr->hwndToolTip, TTM_DELTOOL32A, 0, (LPARAM)&ti);
1054 if (infoPtr->nNumButtons == 1) {
1055 TRACE (toolbar, " simple delete!\n");
1056 COMCTL32_Free (infoPtr->buttons);
1057 infoPtr->buttons = NULL;
1058 infoPtr->nNumButtons = 0;
1061 TBUTTON_INFO *oldButtons = infoPtr->buttons;
1062 TRACE(toolbar, "complex delete! [nIndex=%d]\n", nIndex);
1064 infoPtr->nNumButtons--;
1065 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
1067 memcpy (&infoPtr->buttons[0], &oldButtons[0],
1068 nIndex * sizeof(TBUTTON_INFO));
1071 if (nIndex < infoPtr->nNumButtons) {
1072 memcpy (&infoPtr->buttons[nIndex], &oldButtons[nIndex+1],
1073 (infoPtr->nNumButtons - nIndex) * sizeof(TBUTTON_INFO));
1076 COMCTL32_Free (oldButtons);
1079 TOOLBAR_CalcToolbar (wndPtr);
1081 InvalidateRect32 (wndPtr->hwndSelf, NULL, TRUE);
1082 UpdateWindow32 (wndPtr->hwndSelf);
1089 TOOLBAR_EnableButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1091 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1092 TBUTTON_INFO *btnPtr;
1096 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1100 btnPtr = &infoPtr->buttons[nIndex];
1101 if (LOWORD(lParam) == FALSE)
1102 btnPtr->fsState &= ~(TBSTATE_ENABLED | TBSTATE_PRESSED);
1104 btnPtr->fsState |= TBSTATE_ENABLED;
1106 hdc = GetDC32 (wndPtr->hwndSelf);
1107 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
1108 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1114 /* << TOOLBAR_GetAnchorHighlight >> */
1118 TOOLBAR_GetBitmap (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1120 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1123 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1127 return infoPtr->buttons[nIndex].iBitmap;
1131 static __inline__ LRESULT
1132 TOOLBAR_GetBitmapFlags (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1134 return (GetDeviceCaps32 (0, LOGPIXELSX) >= 120) ? TBBF_LARGE : 0;
1139 TOOLBAR_GetButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1141 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1142 LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
1143 INT32 nIndex = (INT32)wParam;
1144 TBUTTON_INFO *btnPtr;
1146 if (infoPtr == NULL) return FALSE;
1147 if (lpTbb == NULL) return FALSE;
1149 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1152 btnPtr = &infoPtr->buttons[nIndex];
1153 lpTbb->iBitmap = btnPtr->iBitmap;
1154 lpTbb->idCommand = btnPtr->idCommand;
1155 lpTbb->fsState = btnPtr->fsState;
1156 lpTbb->fsStyle = btnPtr->fsStyle;
1157 lpTbb->dwData = btnPtr->dwData;
1158 lpTbb->iString = btnPtr->iString;
1165 TOOLBAR_GetButtonInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1167 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1168 LPTBBUTTONINFO32A lpTbInfo = (LPTBBUTTONINFO32A)lParam;
1169 TBUTTON_INFO *btnPtr;
1172 if (infoPtr == NULL) return -1;
1173 if (lpTbInfo == NULL) return -1;
1174 if (lpTbInfo->cbSize < sizeof(LPTBBUTTONINFO32A)) return -1;
1176 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1180 btnPtr = &infoPtr->buttons[nIndex];
1182 if (lpTbInfo->dwMask & TBIF_COMMAND)
1183 lpTbInfo->idCommand = btnPtr->idCommand;
1184 if (lpTbInfo->dwMask & TBIF_IMAGE)
1185 lpTbInfo->iImage = btnPtr->iBitmap;
1186 if (lpTbInfo->dwMask & TBIF_LPARAM)
1187 lpTbInfo->lParam = btnPtr->dwData;
1188 if (lpTbInfo->dwMask & TBIF_SIZE)
1189 lpTbInfo->cx = (WORD)(btnPtr->rect.right - btnPtr->rect.left);
1190 if (lpTbInfo->dwMask & TBIF_STATE)
1191 lpTbInfo->fsState = btnPtr->fsState;
1192 if (lpTbInfo->dwMask & TBIF_STYLE)
1193 lpTbInfo->fsStyle = btnPtr->fsStyle;
1194 if (lpTbInfo->dwMask & TBIF_TEXT) {
1195 if ((btnPtr->iString >= 0) || (btnPtr->iString < infoPtr->nNumStrings))
1196 lstrcpyn32A (lpTbInfo->pszText,
1197 (LPSTR)infoPtr->strings[btnPtr->iString],
1205 /* << TOOLBAR_GetButtonInfo32W >> */
1209 TOOLBAR_GetButtonSize (WND *wndPtr)
1211 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1213 return MAKELONG((WORD)infoPtr->nButtonWidth,
1214 (WORD)infoPtr->nButtonHeight);
1219 TOOLBAR_GetButtonText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1221 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1222 INT32 nIndex, nStringIndex;
1224 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1228 nStringIndex = infoPtr->buttons[nIndex].iString;
1230 TRACE (toolbar, "index=%d stringIndex=%d\n", nIndex, nStringIndex);
1232 if ((nStringIndex < 0) || (nStringIndex >= infoPtr->nNumStrings))
1235 if (lParam == 0) return -1;
1237 lstrcpy32A ((LPSTR)lParam, (LPSTR)infoPtr->strings[nStringIndex]);
1239 return lstrlen32A ((LPSTR)infoPtr->strings[nStringIndex]);
1243 /* << TOOLBAR_GetButtonText32W >> */
1244 /* << TOOLBAR_GetColorScheme >> */
1248 TOOLBAR_GetDisabledImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1250 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1252 if (wndPtr->dwStyle & TBSTYLE_FLAT)
1253 return (LRESULT)infoPtr->himlDis;
1259 __inline__ static LRESULT
1260 TOOLBAR_GetExtendedStyle (WND *wndPtr)
1262 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1264 return infoPtr->dwExStyle;
1269 TOOLBAR_GetHotImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1271 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1273 if (wndPtr->dwStyle & TBSTYLE_FLAT)
1274 return (LRESULT)infoPtr->himlHot;
1280 /* << TOOLBAR_GetHotItem >> */
1284 TOOLBAR_GetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1286 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1288 if (wndPtr->dwStyle & TBSTYLE_FLAT)
1289 return (LRESULT)infoPtr->himlDef;
1295 /* << TOOLBAR_GetInsertMark >> */
1296 /* << TOOLBAR_GetInsertMarkColor >> */
1300 TOOLBAR_GetItemRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1302 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1303 TBUTTON_INFO *btnPtr;
1307 if (infoPtr == NULL) return FALSE;
1308 nIndex = (INT32)wParam;
1309 btnPtr = &infoPtr->buttons[nIndex];
1310 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1312 lpRect = (LPRECT32)lParam;
1313 if (lpRect == NULL) return FALSE;
1314 if (btnPtr->fsState & TBSTATE_HIDDEN) return FALSE;
1316 lpRect->left = btnPtr->rect.left;
1317 lpRect->right = btnPtr->rect.right;
1318 lpRect->bottom = btnPtr->rect.bottom;
1319 lpRect->top = btnPtr->rect.top;
1326 TOOLBAR_GetMaxSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1328 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1329 LPSIZE32 lpSize = (LPSIZE32)lParam;
1334 lpSize->cx = infoPtr->rcBound.right - infoPtr->rcBound.left;
1335 lpSize->cy = infoPtr->rcBound.bottom - infoPtr->rcBound.top;
1337 TRACE (toolbar, "maximum size %d x %d\n",
1338 infoPtr->rcBound.right - infoPtr->rcBound.left,
1339 infoPtr->rcBound.bottom - infoPtr->rcBound.top);
1345 /* << TOOLBAR_GetObject >> */
1346 /* << TOOLBAR_GetPadding >> */
1350 TOOLBAR_GetRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1352 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1353 TBUTTON_INFO *btnPtr;
1357 if (infoPtr == NULL) return FALSE;
1358 nIndex = (INT32)wParam;
1359 btnPtr = &infoPtr->buttons[nIndex];
1360 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1362 lpRect = (LPRECT32)lParam;
1363 if (lpRect == NULL) return FALSE;
1365 lpRect->left = btnPtr->rect.left;
1366 lpRect->right = btnPtr->rect.right;
1367 lpRect->bottom = btnPtr->rect.bottom;
1368 lpRect->top = btnPtr->rect.top;
1375 TOOLBAR_GetRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1377 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1379 if (wndPtr->dwStyle & TBSTYLE_WRAPABLE)
1380 return infoPtr->nRows;
1387 TOOLBAR_GetState (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1389 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1392 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1393 if (nIndex == -1) return -1;
1395 return infoPtr->buttons[nIndex].fsState;
1400 TOOLBAR_GetStyle (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1402 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1405 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1406 if (nIndex == -1) return -1;
1408 return infoPtr->buttons[nIndex].fsStyle;
1413 TOOLBAR_GetTextRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1415 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1417 if (infoPtr == NULL)
1420 return infoPtr->nMaxTextRows;
1425 TOOLBAR_GetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1427 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1429 if (infoPtr == NULL) return 0;
1430 return infoPtr->hwndToolTip;
1435 TOOLBAR_GetUnicodeFormat (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1437 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1439 TRACE (toolbar, "%s hwnd=0x%04x stub!\n",
1440 infoPtr->bUnicode ? "TRUE" : "FALSE", wndPtr->hwndSelf);
1442 return infoPtr->bUnicode;
1447 TOOLBAR_HideButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1449 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1450 TBUTTON_INFO *btnPtr;
1453 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1457 btnPtr = &infoPtr->buttons[nIndex];
1458 if (LOWORD(lParam) == FALSE)
1459 btnPtr->fsState &= ~TBSTATE_HIDDEN;
1461 btnPtr->fsState |= TBSTATE_HIDDEN;
1463 TOOLBAR_CalcToolbar (wndPtr);
1465 InvalidateRect32 (wndPtr->hwndSelf, NULL, TRUE);
1466 UpdateWindow32 (wndPtr->hwndSelf);
1472 __inline__ static LRESULT
1473 TOOLBAR_HitTest (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1475 return TOOLBAR_InternalHitTest (wndPtr, (LPPOINT32)lParam);
1480 TOOLBAR_Indeterminate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1482 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1483 TBUTTON_INFO *btnPtr;
1487 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1491 btnPtr = &infoPtr->buttons[nIndex];
1492 if (LOWORD(lParam) == FALSE)
1493 btnPtr->fsState &= ~TBSTATE_INDETERMINATE;
1495 btnPtr->fsState |= TBSTATE_INDETERMINATE;
1497 hdc = GetDC32 (wndPtr->hwndSelf);
1498 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
1499 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1506 TOOLBAR_InsertButton32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1508 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1509 LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
1510 INT32 nIndex = (INT32)wParam;
1511 TBUTTON_INFO *oldButtons;
1514 if (lpTbb == NULL) return FALSE;
1515 if (nIndex < 0) return FALSE;
1517 TRACE (toolbar, "inserting button index=%d\n", nIndex);
1518 if (nIndex > infoPtr->nNumButtons) {
1519 nIndex = infoPtr->nNumButtons;
1520 TRACE (toolbar, "adjust index=%d\n", nIndex);
1523 oldButtons = infoPtr->buttons;
1524 infoPtr->nNumButtons++;
1525 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
1526 /* pre insert copy */
1528 memcpy (&infoPtr->buttons[0], &oldButtons[0],
1529 nIndex * sizeof(TBUTTON_INFO));
1532 /* insert new button */
1533 infoPtr->buttons[nIndex].iBitmap = lpTbb->iBitmap;
1534 infoPtr->buttons[nIndex].idCommand = lpTbb->idCommand;
1535 infoPtr->buttons[nIndex].fsState = lpTbb->fsState;
1536 infoPtr->buttons[nIndex].fsStyle = lpTbb->fsStyle;
1537 infoPtr->buttons[nIndex].dwData = lpTbb->dwData;
1538 infoPtr->buttons[nIndex].iString = lpTbb->iString;
1540 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) {
1543 ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
1544 ti.cbSize = sizeof (TTTOOLINFO32A);
1545 ti.hwnd = wndPtr->hwndSelf;
1546 ti.uId = lpTbb->idCommand;
1548 ti.lpszText = LPSTR_TEXTCALLBACK32A;
1550 SendMessage32A (infoPtr->hwndToolTip, TTM_ADDTOOL32A,
1554 /* post insert copy */
1555 if (nIndex < infoPtr->nNumButtons - 1) {
1556 memcpy (&infoPtr->buttons[nIndex+1], &oldButtons[nIndex],
1557 (infoPtr->nNumButtons - nIndex - 1) * sizeof(TBUTTON_INFO));
1560 COMCTL32_Free (oldButtons);
1562 TOOLBAR_CalcToolbar (wndPtr);
1564 hdc = GetDC32 (wndPtr->hwndSelf);
1565 TOOLBAR_Refresh (wndPtr, hdc);
1566 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1572 /* << TOOLBAR_InsertButton32W >> */
1573 /* << TOOLBAR_InsertMarkHitTest >> */
1577 TOOLBAR_IsButtonChecked (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1579 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1582 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1586 return (infoPtr->buttons[nIndex].fsState & TBSTATE_CHECKED);
1591 TOOLBAR_IsButtonEnabled (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1593 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1596 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1600 return (infoPtr->buttons[nIndex].fsState & TBSTATE_ENABLED);
1605 TOOLBAR_IsButtonHidden (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1607 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1610 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1614 return (infoPtr->buttons[nIndex].fsState & TBSTATE_HIDDEN);
1619 TOOLBAR_IsButtonHighlighted (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1621 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1624 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1628 return (infoPtr->buttons[nIndex].fsState & TBSTATE_MARKED);
1633 TOOLBAR_IsButtonIndeterminate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1635 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1638 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1642 return (infoPtr->buttons[nIndex].fsState & TBSTATE_INDETERMINATE);
1647 TOOLBAR_IsButtonPressed (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1649 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1652 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1656 return (infoPtr->buttons[nIndex].fsState & TBSTATE_PRESSED);
1660 /* << TOOLBAR_LoadImages >> */
1661 /* << TOOLBAR_MapAccelerator >> */
1662 /* << TOOLBAR_MarkButton >> */
1663 /* << TOOLBAR_MoveButton >> */
1667 TOOLBAR_PressButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1669 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1670 TBUTTON_INFO *btnPtr;
1674 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1678 btnPtr = &infoPtr->buttons[nIndex];
1679 if (LOWORD(lParam) == FALSE)
1680 btnPtr->fsState &= ~TBSTATE_PRESSED;
1682 btnPtr->fsState |= TBSTATE_PRESSED;
1684 hdc = GetDC32 (wndPtr->hwndSelf);
1685 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
1686 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1692 /* << TOOLBAR_ReplaceBitmap >> */
1696 TOOLBAR_SaveRestore32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1699 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1700 LPTBSAVEPARAMS32A lpSave = (LPTBSAVEPARAMS32A)lParam;
1702 if (lpSave == NULL) return 0;
1704 if ((BOOL32)wParam) {
1705 /* save toolbar information */
1706 FIXME (toolbar, "save to \"%s\" \"%s\"\n",
1707 lpSave->pszSubKey, lpSave->pszValueName);
1712 /* restore toolbar information */
1714 FIXME (toolbar, "restore from \"%s\" \"%s\"\n",
1715 lpSave->pszSubKey, lpSave->pszValueName);
1725 /* << TOOLBAR_SaveRestore32W >> */
1726 /* << TOOLBAR_SetAnchorHighlight >> */
1730 TOOLBAR_SetBitmapSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1732 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1734 if ((LOWORD(lParam) <= 0) || (HIWORD(lParam)<=0))
1737 infoPtr->nBitmapWidth = (INT32)LOWORD(lParam);
1738 infoPtr->nBitmapHeight = (INT32)HIWORD(lParam);
1745 TOOLBAR_SetButtonInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1747 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1748 LPTBBUTTONINFO32A lptbbi = (LPTBBUTTONINFO32A)lParam;
1749 TBUTTON_INFO *btnPtr;
1754 if (lptbbi->cbSize < sizeof(LPTBBUTTONINFO32A))
1757 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
1761 btnPtr = &infoPtr->buttons[nIndex];
1762 if (lptbbi->dwMask & TBIF_COMMAND)
1763 btnPtr->idCommand = lptbbi->idCommand;
1764 if (lptbbi->dwMask & TBIF_IMAGE)
1765 btnPtr->iBitmap = lptbbi->iImage;
1766 if (lptbbi->dwMask & TBIF_LPARAM)
1767 btnPtr->dwData = lptbbi->lParam;
1768 /* if (lptbbi->dwMask & TBIF_SIZE) */
1769 /* btnPtr->cx = lptbbi->cx; */
1770 if (lptbbi->dwMask & TBIF_STATE)
1771 btnPtr->fsState = lptbbi->fsState;
1772 if (lptbbi->dwMask & TBIF_STYLE)
1773 btnPtr->fsStyle = lptbbi->fsStyle;
1775 if (lptbbi->dwMask & TBIF_TEXT) {
1776 if ((btnPtr->iString >= 0) ||
1777 (btnPtr->iString < infoPtr->nNumStrings)) {
1779 CHAR **lpString = &infoPtr->strings[btnPtr->iString];
1780 INT32 len = lstrlen32A (lptbbi->pszText);
1781 *lpString = COMCTL32_ReAlloc (lpString, sizeof(char)*(len+1));
1784 /* this is the ultimate sollution */
1785 /* Str_SetPtrA (&infoPtr->strings[btnPtr->iString], lptbbi->pszText); */
1793 /* << TOOLBAR_SetButtonInfo32W >> */
1797 TOOLBAR_SetButtonSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1799 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1801 if ((LOWORD(lParam) <= 0) || (HIWORD(lParam)<=0))
1804 infoPtr->nButtonWidth = (INT32)LOWORD(lParam);
1805 infoPtr->nButtonHeight = (INT32)HIWORD(lParam);
1812 TOOLBAR_SetButtonWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1814 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1816 if (infoPtr == NULL)
1819 infoPtr->cxMin = (INT32)LOWORD(lParam);
1820 infoPtr->cxMax = (INT32)HIWORD(lParam);
1827 TOOLBAR_SetCmdId (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1829 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1830 INT32 nIndex = (INT32)wParam;
1832 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1835 infoPtr->buttons[nIndex].idCommand = (INT32)lParam;
1837 if (infoPtr->hwndToolTip) {
1839 FIXME (toolbar, "change tool tip!\n");
1847 /* << TOOLBAR_SetColorScheme >> */
1851 TOOLBAR_SetDisabledImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1853 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1854 HIMAGELIST himlTemp;
1856 if (!(wndPtr->dwStyle & TBSTYLE_FLAT))
1859 himlTemp = infoPtr->himlDis;
1860 infoPtr->himlDis = (HIMAGELIST)lParam;
1862 /* FIXME: redraw ? */
1864 return (LRESULT)himlTemp;
1869 TOOLBAR_SetDrawTextFlags (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1871 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1874 dwTemp = infoPtr->dwDTFlags;
1875 infoPtr->dwDTFlags =
1876 (infoPtr->dwDTFlags & (DWORD)wParam) | (DWORD)lParam;
1878 return (LRESULT)dwTemp;
1883 TOOLBAR_SetExtendedStyle (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1885 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1888 dwTemp = infoPtr->dwExStyle;
1889 infoPtr->dwExStyle = (DWORD)lParam;
1891 return (LRESULT)dwTemp;
1896 TOOLBAR_SetHotImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1898 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1899 HIMAGELIST himlTemp;
1901 if (!(wndPtr->dwStyle & TBSTYLE_FLAT))
1904 himlTemp = infoPtr->himlHot;
1905 infoPtr->himlHot = (HIMAGELIST)lParam;
1907 /* FIXME: redraw ? */
1909 return (LRESULT)himlTemp;
1913 /* << TOOLBAR_SetHotItem >> */
1917 TOOLBAR_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1919 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1920 HIMAGELIST himlTemp;
1922 if (!(wndPtr->dwStyle & TBSTYLE_FLAT))
1925 himlTemp = infoPtr->himlDef;
1926 infoPtr->himlDef = (HIMAGELIST)lParam;
1928 /* FIXME: redraw ? */
1930 return (LRESULT)himlTemp;
1935 TOOLBAR_SetIndent (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1937 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1940 infoPtr->nIndent = (INT32)wParam;
1941 TOOLBAR_CalcToolbar (wndPtr);
1942 hdc = GetDC32 (wndPtr->hwndSelf);
1943 TOOLBAR_Refresh (wndPtr, hdc);
1944 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1950 /* << TOOLBAR_SetInsertMark >> */
1954 TOOLBAR_SetInsertMarkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1956 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1958 infoPtr->clrInsertMark = (COLORREF)lParam;
1960 /* FIXME : redraw ??*/
1967 TOOLBAR_SetMaxTextRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1969 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1971 if (infoPtr == NULL)
1974 infoPtr->nMaxTextRows = (INT32)wParam;
1980 /* << TOOLBAR_SetPadding >> */
1984 TOOLBAR_SetParent (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1986 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
1987 HWND32 hwndOldNotify;
1989 if (infoPtr == NULL) return 0;
1990 hwndOldNotify = infoPtr->hwndNotify;
1991 infoPtr->hwndNotify = (HWND32)wParam;
1993 return hwndOldNotify;
1998 TOOLBAR_SetRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2000 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2001 LPRECT32 lprc = (LPRECT32)lParam;
2004 if (LOWORD(wParam) > 1) {
2006 FIXME (toolbar, "multiple rows not supported!\n");
2010 /* recalculate toolbar */
2011 TOOLBAR_CalcToolbar (wndPtr);
2013 /* return bounding rectangle */
2015 lprc->left = infoPtr->rcBound.left;
2016 lprc->right = infoPtr->rcBound.right;
2017 lprc->top = infoPtr->rcBound.top;
2018 lprc->bottom = infoPtr->rcBound.bottom;
2021 /* repaint toolbar */
2022 hdc = GetDC32 (wndPtr->hwndSelf);
2023 TOOLBAR_Refresh (wndPtr, hdc);
2024 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2031 TOOLBAR_SetState (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2033 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2034 TBUTTON_INFO *btnPtr;
2038 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
2042 btnPtr = &infoPtr->buttons[nIndex];
2043 btnPtr->fsState = LOWORD(lParam);
2045 hdc = GetDC32 (wndPtr->hwndSelf);
2046 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
2047 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2054 TOOLBAR_SetStyle (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2056 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2057 TBUTTON_INFO *btnPtr;
2061 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
2065 btnPtr = &infoPtr->buttons[nIndex];
2066 btnPtr->fsStyle = LOWORD(lParam);
2068 hdc = GetDC32 (wndPtr->hwndSelf);
2069 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
2070 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2072 if (infoPtr->hwndToolTip) {
2074 FIXME (toolbar, "change tool tip!\n");
2082 __inline__ static LRESULT
2083 TOOLBAR_SetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2085 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2087 if (infoPtr == NULL) return 0;
2088 infoPtr->hwndToolTip = (HWND32)wParam;
2094 TOOLBAR_SetUnicodeFormat (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2096 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2099 TRACE (toolbar, "%s hwnd=0x%04x stub!\n",
2100 ((BOOL32)wParam) ? "TRUE" : "FALSE", wndPtr->hwndSelf);
2102 bTemp = infoPtr->bUnicode;
2103 infoPtr->bUnicode = (BOOL32)wParam;
2110 TOOLBAR_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2112 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2115 /* initialize info structure */
2116 infoPtr->nButtonHeight = 22;
2117 infoPtr->nButtonWidth = 23;
2118 infoPtr->nBitmapHeight = 15;
2119 infoPtr->nBitmapWidth = 16;
2121 infoPtr->nHeight = infoPtr->nButtonHeight + TOP_BORDER + BOTTOM_BORDER;
2123 infoPtr->nMaxTextRows = 1;
2124 infoPtr->cxMin = -1;
2125 infoPtr->cxMax = -1;
2127 infoPtr->bCaptured = FALSE;
2128 infoPtr->bUnicode = IsWindowUnicode (wndPtr->hwndSelf);
2129 infoPtr->nButtonDown = -1;
2130 infoPtr->nOldHit = -1;
2132 infoPtr->hwndNotify = GetParent32 (wndPtr->hwndSelf);
2133 infoPtr->bTransparent = (wndPtr->dwStyle & TBSTYLE_FLAT);
2134 infoPtr->nHotItem = -1;
2135 infoPtr->dwDTFlags = DT_CENTER;
2137 SystemParametersInfo32A (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
2138 infoPtr->hFont = CreateFontIndirect32A (&logFont);
2140 if (wndPtr->dwStyle & TBSTYLE_TOOLTIPS) {
2141 /* Create tooltip control */
2142 infoPtr->hwndToolTip =
2143 CreateWindowEx32A (0, TOOLTIPS_CLASS32A, NULL, 0,
2144 CW_USEDEFAULT32, CW_USEDEFAULT32,
2145 CW_USEDEFAULT32, CW_USEDEFAULT32,
2146 wndPtr->hwndSelf, 0, 0, 0);
2148 /* Send NM_TOOLTIPSCREATED notification */
2149 if (infoPtr->hwndToolTip) {
2150 NMTOOLTIPSCREATED nmttc;
2152 nmttc.hdr.hwndFrom = wndPtr->hwndSelf;
2153 nmttc.hdr.idFrom = wndPtr->wIDmenu;
2154 nmttc.hdr.code = NM_TOOLTIPSCREATED;
2155 nmttc.hwndToolTips = infoPtr->hwndToolTip;
2157 SendMessage32A (infoPtr->hwndNotify, WM_NOTIFY,
2158 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmttc);
2167 TOOLBAR_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2169 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2171 /* delete tooltip control */
2172 if (infoPtr->hwndToolTip)
2173 DestroyWindow32 (infoPtr->hwndToolTip);
2175 /* delete button data */
2176 if (infoPtr->buttons)
2177 COMCTL32_Free (infoPtr->buttons);
2179 /* delete strings */
2180 if (infoPtr->strings) {
2182 for (i = 0; i < infoPtr->nNumStrings; i++)
2183 if (infoPtr->strings[i])
2184 COMCTL32_Free (infoPtr->strings[i]);
2186 COMCTL32_Free (infoPtr->strings);
2189 /* destroy default image list */
2190 if (infoPtr->himlDef)
2191 ImageList_Destroy (infoPtr->himlDef);
2193 /* destroy disabled image list */
2194 if (infoPtr->himlDis)
2195 ImageList_Destroy (infoPtr->himlDis);
2197 /* destroy hot image list */
2198 if (infoPtr->himlHot)
2199 ImageList_Destroy (infoPtr->himlHot);
2201 /* delete default font */
2203 DeleteObject32 (infoPtr->hFont);
2205 /* free toolbar info data */
2206 COMCTL32_Free (infoPtr);
2213 TOOLBAR_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2215 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2217 if (infoPtr->bTransparent)
2218 return SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_ERASEBKGND,
2221 return DefWindowProc32A (wndPtr->hwndSelf, WM_ERASEBKGND, wParam, lParam);
2226 TOOLBAR_LButtonDblClk (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2228 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2229 TBUTTON_INFO *btnPtr;
2234 pt.x = (INT32)LOWORD(lParam);
2235 pt.y = (INT32)HIWORD(lParam);
2236 nHit = TOOLBAR_InternalHitTest (wndPtr, &pt);
2239 btnPtr = &infoPtr->buttons[nHit];
2240 if (!(btnPtr->fsState & TBSTATE_ENABLED))
2242 SetCapture32 (wndPtr->hwndSelf);
2243 infoPtr->bCaptured = TRUE;
2244 infoPtr->nButtonDown = nHit;
2246 btnPtr->fsState |= TBSTATE_PRESSED;
2248 hdc = GetDC32 (wndPtr->hwndSelf);
2249 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
2250 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2252 else if (wndPtr->dwStyle & CCS_ADJUSTABLE)
2253 TOOLBAR_Customize (wndPtr);
2260 TOOLBAR_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2262 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2263 TBUTTON_INFO *btnPtr;
2268 if (infoPtr->hwndToolTip)
2269 TOOLBAR_RelayEvent (infoPtr->hwndToolTip, wndPtr->hwndSelf,
2270 WM_LBUTTONDOWN, wParam, lParam);
2272 pt.x = (INT32)LOWORD(lParam);
2273 pt.y = (INT32)HIWORD(lParam);
2274 nHit = TOOLBAR_InternalHitTest (wndPtr, &pt);
2277 btnPtr = &infoPtr->buttons[nHit];
2278 if (!(btnPtr->fsState & TBSTATE_ENABLED))
2281 SetCapture32 (wndPtr->hwndSelf);
2282 infoPtr->bCaptured = TRUE;
2283 infoPtr->nButtonDown = nHit;
2284 infoPtr->nOldHit = nHit;
2286 btnPtr->fsState |= TBSTATE_PRESSED;
2288 hdc = GetDC32 (wndPtr->hwndSelf);
2289 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
2290 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2298 TOOLBAR_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2300 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2301 TBUTTON_INFO *btnPtr;
2304 INT32 nOldIndex = -1;
2306 BOOL32 bSendMessage = TRUE;
2308 if (infoPtr->hwndToolTip)
2309 TOOLBAR_RelayEvent (infoPtr->hwndToolTip, wndPtr->hwndSelf,
2310 WM_LBUTTONUP, wParam, lParam);
2312 pt.x = (INT32)LOWORD(lParam);
2313 pt.y = (INT32)HIWORD(lParam);
2314 nHit = TOOLBAR_InternalHitTest (wndPtr, &pt);
2316 if ((infoPtr->bCaptured) && (infoPtr->nButtonDown >= 0)) {
2317 infoPtr->bCaptured = FALSE;
2319 btnPtr = &infoPtr->buttons[infoPtr->nButtonDown];
2320 btnPtr->fsState &= ~TBSTATE_PRESSED;
2322 if (nHit == infoPtr->nButtonDown) {
2323 if (btnPtr->fsStyle & TBSTYLE_CHECK) {
2324 if (btnPtr->fsStyle & TBSTYLE_GROUP) {
2325 nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr,
2326 infoPtr->nButtonDown);
2327 if (nOldIndex == infoPtr->nButtonDown)
2328 bSendMessage = FALSE;
2329 if ((nOldIndex != infoPtr->nButtonDown) &&
2331 infoPtr->buttons[nOldIndex].fsState &= ~TBSTATE_CHECKED;
2332 btnPtr->fsState |= TBSTATE_CHECKED;
2335 if (btnPtr->fsState & TBSTATE_CHECKED)
2336 btnPtr->fsState &= ~TBSTATE_CHECKED;
2338 btnPtr->fsState |= TBSTATE_CHECKED;
2343 bSendMessage = FALSE;
2345 hdc = GetDC32 (wndPtr->hwndSelf);
2346 if (nOldIndex != -1)
2347 TOOLBAR_DrawButton (wndPtr, &infoPtr->buttons[nOldIndex], hdc);
2348 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
2349 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2352 SendMessage32A (infoPtr->hwndNotify, WM_COMMAND,
2353 MAKEWPARAM(btnPtr->idCommand, 0),
2354 (LPARAM)wndPtr->hwndSelf);
2356 infoPtr->nButtonDown = -1;
2357 infoPtr->nOldHit = -1;
2365 TOOLBAR_MouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2367 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2368 TBUTTON_INFO *btnPtr;
2373 if (infoPtr->hwndToolTip)
2374 TOOLBAR_RelayEvent (infoPtr->hwndToolTip, wndPtr->hwndSelf,
2375 WM_MOUSEMOVE, wParam, lParam);
2377 pt.x = (INT32)LOWORD(lParam);
2378 pt.y = (INT32)HIWORD(lParam);
2379 nHit = TOOLBAR_InternalHitTest (wndPtr, &pt);
2381 if (infoPtr->bCaptured) {
2382 if (infoPtr->nOldHit != nHit) {
2383 btnPtr = &infoPtr->buttons[infoPtr->nButtonDown];
2384 if (infoPtr->nOldHit == infoPtr->nButtonDown) {
2385 btnPtr->fsState &= ~TBSTATE_PRESSED;
2386 hdc = GetDC32 (wndPtr->hwndSelf);
2387 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
2388 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2390 else if (nHit == infoPtr->nButtonDown) {
2391 btnPtr->fsState |= TBSTATE_PRESSED;
2392 hdc = GetDC32 (wndPtr->hwndSelf);
2393 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
2394 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2397 infoPtr->nOldHit = nHit;
2404 __inline__ static LRESULT
2405 TOOLBAR_NCActivate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2407 /* if (wndPtr->dwStyle & CCS_NODIVIDER) */
2408 return DefWindowProc32A (wndPtr->hwndSelf, WM_NCACTIVATE,
2411 /* return TOOLBAR_NCPaint (wndPtr, wParam, lParam); */
2415 __inline__ static LRESULT
2416 TOOLBAR_NCCalcSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2418 if (!(wndPtr->dwStyle & CCS_NODIVIDER))
2419 ((LPRECT32)lParam)->top += sysMetrics[SM_CYEDGE];
2421 return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCALCSIZE, wParam, lParam);
2426 TOOLBAR_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2428 TOOLBAR_INFO *infoPtr;
2430 /* allocate memory for info structure */
2431 infoPtr = (TOOLBAR_INFO *)COMCTL32_Alloc (sizeof(TOOLBAR_INFO));
2432 wndPtr->wExtra[0] = (DWORD)infoPtr;
2434 if (infoPtr == NULL) {
2435 ERR (toolbar, "could not allocate info memory!\n");
2439 if ((TOOLBAR_INFO*)wndPtr->wExtra[0] != infoPtr) {
2440 ERR (toolbar, "pointer assignment error!\n");
2445 infoPtr->dwStructSize = sizeof(TBBUTTON);
2447 /* fix instance handle, if the toolbar was created by CreateToolbarEx() */
2448 if (!wndPtr->hInstance)
2449 wndPtr->hInstance = wndPtr->parent->hInstance;
2451 return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
2456 TOOLBAR_NCPaint (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2458 HWND32 hwnd = wndPtr->hwndSelf;
2461 if ( wndPtr->dwStyle & WS_MINIMIZE ||
2462 !WIN_IsWindowDrawable( wndPtr, 0 )) return 0; /* Nothing to do */
2464 DefWindowProc32A (hwnd, WM_NCPAINT, wParam, lParam);
2466 if (!(hdc = GetDCEx32( hwnd, 0, DCX_USESTYLE | DCX_WINDOW ))) return 0;
2468 if (ExcludeVisRect( hdc, wndPtr->rectClient.left-wndPtr->rectWindow.left,
2469 wndPtr->rectClient.top-wndPtr->rectWindow.top,
2470 wndPtr->rectClient.right-wndPtr->rectWindow.left,
2471 wndPtr->rectClient.bottom-wndPtr->rectWindow.top )
2473 ReleaseDC32( hwnd, hdc );
2477 if (!(wndPtr->flags & WIN_MANAGED) && !(wndPtr->dwStyle & CCS_NODIVIDER))
2478 DrawEdge32 (hdc, &wndPtr->rectWindow, EDGE_ETCHED, BF_TOP);
2480 ReleaseDC32( hwnd, hdc );
2486 __inline__ static LRESULT
2487 TOOLBAR_Notify (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2489 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2490 LPNMHDR lpnmh = (LPNMHDR)lParam;
2492 TRACE (toolbar, "passing WM_NOTIFY!\n");
2494 if ((infoPtr->hwndToolTip) && (lpnmh->hwndFrom == infoPtr->hwndToolTip)) {
2495 SendMessage32A (infoPtr->hwndNotify, WM_NOTIFY, wParam, lParam);
2498 if (lpnmh->code == TTN_GETDISPINFO32A) {
2499 LPNMTTDISPINFO32A lpdi = (LPNMTTDISPINFO32A)lParam;
2501 FIXME (toolbar, "retrieving ASCII string\n");
2504 else if (lpnmh->code == TTN_GETDISPINFO32W) {
2505 LPNMTTDISPINFO32W lpdi = (LPNMTTDISPINFO32W)lParam;
2507 FIXME (toolbar, "retrieving UNICODE string\n");
2518 TOOLBAR_Paint (WND *wndPtr, WPARAM32 wParam)
2523 hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
2524 TOOLBAR_Refresh (wndPtr, hdc);
2526 EndPaint32 (wndPtr->hwndSelf, &ps);
2532 TOOLBAR_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2534 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
2539 UINT32 uPosFlags = 0;
2541 /* Resize deadlock check */
2542 if (infoPtr->bAutoSize) {
2543 infoPtr->bAutoSize = FALSE;
2547 flags = (INT32) wParam;
2549 /* FIXME for flags =
2550 * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED
2553 TRACE (toolbar, "sizing toolbar!\n");
2555 if (flags == SIZE_RESTORED) {
2556 /* width and height don't apply */
2557 parent = GetParent32 (wndPtr->hwndSelf);
2558 GetClientRect32(parent, &parent_rect);
2560 if (wndPtr->dwStyle & CCS_NORESIZE) {
2561 uPosFlags |= (SWP_NOSIZE | SWP_NOMOVE);
2564 /* infoPtr->nWidth = parent_rect.right - parent_rect.left; */
2565 cy = infoPtr->nHeight;
2566 cx = infoPtr->nWidth;
2567 TOOLBAR_CalcToolbar (wndPtr);
2568 infoPtr->nWidth = cx;
2569 infoPtr->nHeight = cy;
2572 infoPtr->nWidth = parent_rect.right - parent_rect.left;
2573 TOOLBAR_CalcToolbar (wndPtr);
2574 cy = infoPtr->nHeight;
2575 cx = infoPtr->nWidth;
2578 if (wndPtr->dwStyle & CCS_NOPARENTALIGN) {
2579 uPosFlags |= SWP_NOMOVE;
2580 cy = infoPtr->nHeight;
2581 cx = infoPtr->nWidth;
2584 if (!(wndPtr->dwStyle & CCS_NODIVIDER))
2585 cy += sysMetrics[SM_CYEDGE];
2587 SetWindowPos32 (wndPtr->hwndSelf, 0, parent_rect.left, parent_rect.top,
2588 cx, cy, uPosFlags | SWP_NOZORDER);
2595 TOOLBAR_StyleChanged (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2599 TOOLBAR_AutoSize (wndPtr, wParam, lParam);
2601 hdc = GetDC32 (wndPtr->hwndSelf);
2602 TOOLBAR_Refresh (wndPtr, hdc);
2603 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2611 ToolbarWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
2613 WND *wndPtr = WIN_FindWndPtr(hwnd);
2618 return TOOLBAR_AddBitmap (wndPtr, wParam, lParam);
2620 case TB_ADDBUTTONS32A:
2621 return TOOLBAR_AddButtons32A (wndPtr, wParam, lParam);
2623 /* case TB_ADDBUTTONS32W: */
2625 case TB_ADDSTRING32A:
2626 return TOOLBAR_AddString32A (wndPtr, wParam, lParam);
2628 case TB_ADDSTRING32W:
2629 return TOOLBAR_AddString32W (wndPtr, wParam, lParam);
2632 return TOOLBAR_AutoSize (wndPtr, wParam, lParam);
2634 case TB_BUTTONCOUNT:
2635 return TOOLBAR_ButtonCount (wndPtr, wParam, lParam);
2637 case TB_BUTTONSTRUCTSIZE:
2638 return TOOLBAR_ButtonStructSize (wndPtr, wParam, lParam);
2640 case TB_CHANGEBITMAP:
2641 return TOOLBAR_ChangeBitmap (wndPtr, wParam, lParam);
2643 case TB_CHECKBUTTON:
2644 return TOOLBAR_CheckButton (wndPtr, wParam, lParam);
2646 case TB_COMMANDTOINDEX:
2647 return TOOLBAR_CommandToIndex (wndPtr, wParam, lParam);
2650 return TOOLBAR_Customize (wndPtr);
2652 case TB_DELETEBUTTON:
2653 return TOOLBAR_DeleteButton (wndPtr, wParam, lParam);
2655 case TB_ENABLEBUTTON:
2656 return TOOLBAR_EnableButton (wndPtr, wParam, lParam);
2658 /* case TB_GETANCHORHIGHLIGHT: */ /* 4.71 */
2661 return TOOLBAR_GetBitmap (wndPtr, wParam, lParam);
2663 case TB_GETBITMAPFLAGS:
2664 return TOOLBAR_GetBitmapFlags (wndPtr, wParam, lParam);
2667 return TOOLBAR_GetButton (wndPtr, wParam, lParam);
2669 case TB_GETBUTTONINFO32A:
2670 return TOOLBAR_GetButtonInfo32A (wndPtr, wParam, lParam);
2672 /* case TB_GETBUTTONINFO32W: */ /* 4.71 */
2674 case TB_GETBUTTONSIZE:
2675 return TOOLBAR_GetButtonSize (wndPtr);
2677 case TB_GETBUTTONTEXT32A:
2678 return TOOLBAR_GetButtonText32A (wndPtr, wParam, lParam);
2680 /* case TB_GETBUTTONTEXT32W: */
2681 /* case TB_GETCOLORSCHEME: */ /* 4.71 */
2683 case TB_GETDISABLEDIMAGELIST:
2684 return TOOLBAR_GetDisabledImageList (wndPtr, wParam, lParam);
2686 case TB_GETEXTENDEDSTYLE:
2687 return TOOLBAR_GetExtendedStyle (wndPtr);
2689 case TB_GETHOTIMAGELIST:
2690 return TOOLBAR_GetHotImageList (wndPtr, wParam, lParam);
2692 /* case TB_GETHOTITEM: */ /* 4.71 */
2694 case TB_GETIMAGELIST:
2695 return TOOLBAR_GetImageList (wndPtr, wParam, lParam);
2697 /* case TB_GETINSERTMARK: */ /* 4.71 */
2698 /* case TB_GETINSERTMARKCOLOR: */ /* 4.71 */
2700 case TB_GETITEMRECT:
2701 return TOOLBAR_GetItemRect (wndPtr, wParam, lParam);
2704 return TOOLBAR_GetMaxSize (wndPtr, wParam, lParam);
2706 /* case TB_GETOBJECT: */ /* 4.71 */
2707 /* case TB_GETPADDING: */ /* 4.71 */
2710 return TOOLBAR_GetRect (wndPtr, wParam, lParam);
2713 return TOOLBAR_GetRows (wndPtr, wParam, lParam);
2716 return TOOLBAR_GetState (wndPtr, wParam, lParam);
2719 return TOOLBAR_GetStyle (wndPtr, wParam, lParam);
2721 case TB_GETTEXTROWS:
2722 return TOOLBAR_GetTextRows (wndPtr, wParam, lParam);
2724 case TB_GETTOOLTIPS:
2725 return TOOLBAR_GetToolTips (wndPtr, wParam, lParam);
2727 case TB_GETUNICODEFORMAT:
2728 return TOOLBAR_GetUnicodeFormat (wndPtr, wParam, lParam);
2731 return TOOLBAR_HideButton (wndPtr, wParam, lParam);
2734 return TOOLBAR_HitTest (wndPtr, wParam, lParam);
2736 case TB_INDETERMINATE:
2737 return TOOLBAR_Indeterminate (wndPtr, wParam, lParam);
2739 case TB_INSERTBUTTON32A:
2740 return TOOLBAR_InsertButton32A (wndPtr, wParam, lParam);
2742 /* case TB_INSERTBUTTON32W: */
2743 /* case TB_INSERTMARKHITTEST: */ /* 4.71 */
2745 case TB_ISBUTTONCHECKED:
2746 return TOOLBAR_IsButtonChecked (wndPtr, wParam, lParam);
2748 case TB_ISBUTTONENABLED:
2749 return TOOLBAR_IsButtonEnabled (wndPtr, wParam, lParam);
2751 case TB_ISBUTTONHIDDEN:
2752 return TOOLBAR_IsButtonHidden (wndPtr, wParam, lParam);
2754 case TB_ISBUTTONHIGHLIGHTED:
2755 return TOOLBAR_IsButtonHighlighted (wndPtr, wParam, lParam);
2757 case TB_ISBUTTONINDETERMINATE:
2758 return TOOLBAR_IsButtonIndeterminate (wndPtr, wParam, lParam);
2760 case TB_ISBUTTONPRESSED:
2761 return TOOLBAR_IsButtonPressed (wndPtr, wParam, lParam);
2763 /* case TB_LOADIMAGES: */ /* 4.70 */
2764 /* case TB_MAPACCELERATOR32A: */ /* 4.71 */
2765 /* case TB_MAPACCELERATOR32W: */ /* 4.71 */
2766 /* case TB_MARKBUTTON: */ /* 4.71 */
2767 /* case TB_MOVEBUTTON: */ /* 4.71 */
2769 case TB_PRESSBUTTON:
2770 return TOOLBAR_PressButton (wndPtr, wParam, lParam);
2772 /* case TB_REPLACEBITMAP: */
2774 case TB_SAVERESTORE32A:
2775 return TOOLBAR_SaveRestore32A (wndPtr, wParam, lParam);
2777 /* case TB_SAVERESTORE32W: */
2778 /* case TB_SETANCHORHIGHLIGHT: */ /* 4.71 */
2780 case TB_SETBITMAPSIZE:
2781 return TOOLBAR_SetBitmapSize (wndPtr, wParam, lParam);
2783 case TB_SETBUTTONINFO32A:
2784 return TOOLBAR_SetButtonInfo32A (wndPtr, wParam, lParam);
2786 /* case TB_SETBUTTONINFO32W: */ /* 4.71 */
2788 case TB_SETBUTTONSIZE:
2789 return TOOLBAR_SetButtonSize (wndPtr, wParam, lParam);
2791 case TB_SETBUTTONWIDTH:
2792 return TOOLBAR_SetButtonWidth (wndPtr, wParam, lParam);
2795 return TOOLBAR_SetCmdId (wndPtr, wParam, lParam);
2797 /* case TB_SETCOLORSCHEME: */ /* 4.71 */
2799 case TB_SETDISABLEDIMAGELIST:
2800 return TOOLBAR_SetDisabledImageList (wndPtr, wParam, lParam);
2802 case TB_SETDRAWTEXTFLAGS:
2803 return TOOLBAR_SetDrawTextFlags (wndPtr, wParam, lParam);
2805 case TB_SETEXTENDEDSTYLE:
2806 return TOOLBAR_SetExtendedStyle (wndPtr, wParam, lParam);
2808 case TB_SETHOTIMAGELIST:
2809 return TOOLBAR_SetHotImageList (wndPtr, wParam, lParam);
2811 /* case TB_SETHOTITEM: */ /* 4.71 */
2813 case TB_SETIMAGELIST:
2814 return TOOLBAR_SetImageList (wndPtr, wParam, lParam);
2817 return TOOLBAR_SetIndent (wndPtr, wParam, lParam);
2819 /* case TB_SETINSERTMARK: */ /* 4.71 */
2821 case TB_SETINSERTMARKCOLOR:
2822 return TOOLBAR_SetInsertMarkColor (wndPtr, wParam, lParam);
2824 case TB_SETMAXTEXTROWS:
2825 return TOOLBAR_SetMaxTextRows (wndPtr, wParam, lParam);
2827 /* case TB_SETPADDING: */ /* 4.71 */
2830 return TOOLBAR_SetParent (wndPtr, wParam, lParam);
2833 return TOOLBAR_SetRows (wndPtr, wParam, lParam);
2836 return TOOLBAR_SetState (wndPtr, wParam, lParam);
2839 return TOOLBAR_SetStyle (wndPtr, wParam, lParam);
2841 case TB_SETTOOLTIPS:
2842 return TOOLBAR_SetToolTips (wndPtr, wParam, lParam);
2844 case TB_SETUNICODEFORMAT:
2845 return TOOLBAR_SetUnicodeFormat (wndPtr, wParam, lParam);
2851 return TOOLBAR_Create (wndPtr, wParam, lParam);
2854 return TOOLBAR_Destroy (wndPtr, wParam, lParam);
2857 return TOOLBAR_EraseBackground (wndPtr, wParam, lParam);
2859 /* case WM_GETFONT: */
2860 /* case WM_KEYDOWN: */
2861 /* case WM_KILLFOCUS: */
2863 case WM_LBUTTONDBLCLK:
2864 return TOOLBAR_LButtonDblClk (wndPtr, wParam, lParam);
2866 case WM_LBUTTONDOWN:
2867 return TOOLBAR_LButtonDown (wndPtr, wParam, lParam);
2870 return TOOLBAR_LButtonUp (wndPtr, wParam, lParam);
2873 return TOOLBAR_MouseMove (wndPtr, wParam, lParam);
2876 return TOOLBAR_NCActivate (wndPtr, wParam, lParam);
2879 return TOOLBAR_NCCalcSize (wndPtr, wParam, lParam);
2882 return TOOLBAR_NCCreate (wndPtr, wParam, lParam);
2885 return TOOLBAR_NCPaint (wndPtr, wParam, lParam);
2888 return TOOLBAR_Notify (wndPtr, wParam, lParam);
2890 /* case WM_NOTIFYFORMAT: */
2893 return TOOLBAR_Paint (wndPtr, wParam);
2896 return TOOLBAR_Size (wndPtr, wParam, lParam);
2898 case WM_STYLECHANGED:
2899 return TOOLBAR_StyleChanged (wndPtr, wParam, lParam);
2901 /* case WM_SYSCOLORCHANGE: */
2903 /* case WM_WININICHANGE: */
2908 case WM_MEASUREITEM:
2910 return SendMessage32A (GetParent32 (hwnd), uMsg, wParam, lParam);
2913 if (uMsg >= WM_USER)
2914 ERR (toolbar, "unknown msg %04x wp=%08x lp=%08lx\n",
2915 uMsg, wParam, lParam);
2916 return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
2923 TOOLBAR_Register (VOID)
2925 WNDCLASS32A wndClass;
2927 if (GlobalFindAtom32A (TOOLBARCLASSNAME32A)) return;
2929 ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
2930 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;
2931 wndClass.lpfnWndProc = (WNDPROC32)ToolbarWindowProc;
2932 wndClass.cbClsExtra = 0;
2933 wndClass.cbWndExtra = sizeof(TOOLBAR_INFO *);
2934 wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A);
2935 wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
2936 wndClass.lpszClassName = TOOLBARCLASSNAME32A;
2938 RegisterClass32A (&wndClass);
2943 TOOLBAR_Unregister (VOID)
2945 if (GlobalFindAtom32A (TOOLBARCLASSNAME32A))
2946 UnregisterClass32A (TOOLBARCLASSNAME32A, (HINSTANCE32)NULL);