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.
29 #include "sysmetrics.h"
35 /* #define __NEW_WRAP_CODE__ */
37 #define SEPARATOR_WIDTH 8
38 #define SEPARATOR_HEIGHT 5
40 #define BOTTOM_BORDER 2
44 #define TOOLBAR_GetInfoPtr(wndPtr) ((TOOLBAR_INFO *)wndPtr->wExtra[0])
48 TOOLBAR_DrawFlatSeparator (LPRECT32 lpRect, HDC32 hdc)
50 INT32 x = (lpRect->left + lpRect->right) / 2 - 1;
51 INT32 yBottom = lpRect->bottom - 3;
52 INT32 yTop = lpRect->top + 1;
54 SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DSHADOW));
55 MoveToEx32 (hdc, x, yBottom, NULL);
56 LineTo32 (hdc, x, yTop);
58 SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DHILIGHT));
59 MoveToEx32 (hdc, x, yBottom, NULL);
60 LineTo32 (hdc, x, yTop);
65 TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
66 HDC32 hdc, INT32 nState)
68 RECT32 rcText = btnPtr->rect;
74 if ((btnPtr->iString > -1) && (btnPtr->iString < infoPtr->nNumStrings)) {
75 InflateRect32 (&rcText, -3, -3);
76 rcText.top += infoPtr->nBitmapHeight;
77 if (nState & (TBSTATE_PRESSED | TBSTATE_CHECKED))
78 OffsetRect32 (&rcText, 1, 1);
80 hOldFont = SelectObject32 (hdc, infoPtr->hFont);
81 nOldBkMode = SetBkMode32 (hdc, TRANSPARENT);
82 if (!(nState & TBSTATE_ENABLED)) {
83 clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_3DHILIGHT));
84 OffsetRect32 (&rcText, 1, 1);
85 DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
86 &rcText, infoPtr->dwDTFlags);
87 SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
88 OffsetRect32 (&rcText, -1, -1);
89 DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
90 &rcText, infoPtr->dwDTFlags);
92 else if (nState & TBSTATE_INDETERMINATE) {
93 clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
94 DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
95 &rcText, infoPtr->dwDTFlags);
98 clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_BTNTEXT));
99 DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
100 &rcText, infoPtr->dwDTFlags);
103 SetTextColor32 (hdc, clrOld);
104 SelectObject32 (hdc, hOldFont);
105 if (nOldBkMode != TRANSPARENT)
106 SetBkMode32 (hdc, nOldBkMode);
112 TOOLBAR_DrawPattern (HDC32 hdc, LPRECT32 lpRect)
114 HBRUSH32 hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
115 INT32 cx = lpRect->right - lpRect->left;
116 INT32 cy = lpRect->bottom - lpRect->top;
117 PatBlt32 (hdc, lpRect->left, lpRect->top, cx, cy, 0x00FA0089);
118 SelectObject32 (hdc, hbr);
123 TOOLBAR_DrawMasked (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
124 HDC32 hdc, INT32 x, INT32 y)
126 /* FIXME: this function is a hack since it uses image list
127 internals directly */
129 HDC32 hdcImageList = CreateCompatibleDC32 (0);
130 HDC32 hdcMask = CreateCompatibleDC32 (0);
131 HIMAGELIST himl = infoPtr->himlStd;
134 /* create new bitmap */
135 hbmMask = CreateBitmap32 (himl->cx, himl->cy, 1, 1, NULL);
136 SelectObject32 (hdcMask, hbmMask);
138 /* copy the mask bitmap */
139 SelectObject32 (hdcImageList, himl->hbmMask);
140 SetBkColor32 (hdcImageList, RGB(255, 255, 255));
141 SetTextColor32 (hdcImageList, RGB(0, 0, 0));
142 BitBlt32 (hdcMask, 0, 0, himl->cx, himl->cy,
143 hdcImageList, himl->cx * btnPtr->iBitmap, 0, SRCCOPY);
146 /* add white mask from image */
147 SelectObject32 (hdcImageList, himl->hbmImage);
148 SetBkColor32 (hdcImageList, RGB(0, 0, 0));
149 BitBlt32 (hdcMask, 0, 0, himl->cx, himl->cy,
150 hdcImageList, himl->cx * btnPtr->iBitmap, 0, MERGEPAINT);
153 /* draw the new mask */
154 SelectObject32 (hdc, GetSysColorBrush32 (COLOR_3DHILIGHT));
155 BitBlt32 (hdc, x+1, y+1, himl->cx, himl->cy,
156 hdcMask, 0, 0, 0xB8074A);
158 SelectObject32 (hdc, GetSysColorBrush32 (COLOR_3DSHADOW));
159 BitBlt32 (hdc, x, y, himl->cx, himl->cy,
160 hdcMask, 0, 0, 0xB8074A);
162 DeleteObject32 (hbmMask);
163 DeleteDC32 (hdcMask);
164 DeleteDC32 (hdcImageList);
169 TOOLBAR_DrawButton (WND *wndPtr, TBUTTON_INFO *btnPtr, HDC32 hdc)
171 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
172 BOOL32 bFlat = (wndPtr->dwStyle & TBSTYLE_FLAT);
175 if (btnPtr->fsState & TBSTATE_HIDDEN) return;
178 if (btnPtr->fsStyle & TBSTYLE_SEP) {
179 if ((bFlat) && (btnPtr->idCommand == 0))
180 TOOLBAR_DrawFlatSeparator (&btnPtr->rect, hdc);
185 if (!(btnPtr->fsState & TBSTATE_ENABLED)) {
186 DrawEdge32 (hdc, &rc, EDGE_RAISED,
187 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
190 /* if (infoPtr->himlDis) */
191 ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
192 rc.left+1, rc.top+1, ILD_NORMAL);
194 /* TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1); */
197 TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1);
199 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
203 /* pressed TBSTYLE_BUTTON */
204 if (btnPtr->fsState & TBSTATE_PRESSED) {
205 DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
206 BF_RECT | BF_MIDDLE | BF_ADJUST);
207 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
208 rc.left+2, rc.top+2, ILD_NORMAL);
209 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
213 /* checked TBSTYLE_CHECK*/
214 if ((btnPtr->fsStyle & TBSTYLE_CHECK) &&
215 (btnPtr->fsState & TBSTATE_CHECKED)) {
217 DrawEdge32 (hdc, &rc, BDR_SUNKENOUTER,
218 BF_RECT | BF_MIDDLE | BF_ADJUST);
220 DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
221 BF_RECT | BF_MIDDLE | BF_ADJUST);
223 TOOLBAR_DrawPattern (hdc, &rc);
225 ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
226 rc.left+2, rc.top+2, ILD_NORMAL);
228 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
229 rc.left+2, rc.top+2, ILD_NORMAL);
230 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
235 if (btnPtr->fsState & TBSTATE_INDETERMINATE) {
236 DrawEdge32 (hdc, &rc, EDGE_RAISED,
237 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
239 TOOLBAR_DrawPattern (hdc, &rc);
240 TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1);
241 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
246 DrawEdge32 (hdc, &rc, EDGE_RAISED,
247 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
250 ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
251 rc.left+1, rc.top+1, ILD_NORMAL);
253 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
254 rc.left+1, rc.top+1, ILD_NORMAL);
256 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
261 TOOLBAR_Refresh (WND *wndPtr, HDC32 hdc)
263 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
264 TBUTTON_INFO *btnPtr;
268 btnPtr = infoPtr->buttons;
269 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++)
270 TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
275 TOOLBAR_CalcStrings (WND *wndPtr, LPSIZE32 lpSize)
277 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
278 TBUTTON_INFO *btnPtr;
287 hOldFont = SelectObject32 (hdc, infoPtr->hFont);
289 btnPtr = infoPtr->buttons;
290 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
291 if (!(btnPtr->fsState & TBSTATE_HIDDEN) &&
292 (btnPtr->iString > -1) &&
293 (btnPtr->iString < infoPtr->nNumStrings)) {
294 LPWSTR lpText = infoPtr->strings[btnPtr->iString];
295 GetTextExtentPoint32W (hdc, lpText, lstrlen32W (lpText), &sz);
296 if (sz.cx > lpSize->cx)
298 if (sz.cy > lpSize->cy)
303 SelectObject32 (hdc, hOldFont);
304 ReleaseDC32 (0, hdc);
306 TRACE (toolbar, "string size %d x %d!\n", lpSize->cx, lpSize->cy);
311 TOOLBAR_CalcToolbar (WND *wndPtr)
313 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
314 TBUTTON_INFO *btnPtr, *grpPtr;
322 /* --- end new --- */
324 TOOLBAR_CalcStrings (wndPtr, &sizeString);
326 if (sizeString.cy > 0)
327 infoPtr->nButtonHeight = sizeString.cy + infoPtr->nBitmapHeight + 6;
328 else if (infoPtr->nButtonHeight < infoPtr->nBitmapHeight + 6)
329 infoPtr->nButtonHeight = infoPtr->nBitmapHeight + 6;
331 if (sizeString.cx > infoPtr->nBitmapWidth)
332 infoPtr->nButtonWidth = sizeString.cx + 6;
333 else if (infoPtr->nButtonWidth < infoPtr->nBitmapWidth + 6)
334 infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6;
336 x = infoPtr->nIndent;
338 cx = infoPtr->nButtonWidth;
339 cy = infoPtr->nButtonHeight;
342 /* calculate the size of each button according to it's style */
343 /* TOOLBAR_CalcButtons (wndPtr); */
345 infoPtr->rcBound.top = y;
346 infoPtr->rcBound.left = x;
347 infoPtr->rcBound.bottom = y + cy;
348 infoPtr->rcBound.right = x;
350 btnPtr = infoPtr->buttons;
351 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
354 if (btnPtr->fsState & TBSTATE_HIDDEN) {
355 SetRectEmpty32 (&btnPtr->rect);
359 #ifdef __NEW_WRAP_CODE__
361 if (btnPtr->fsStyle & TBSTYLE_SEP) {
362 /* UNDOCUMENTED: If a separator has a non zero bitmap index, */
363 /* it is the actual width of the separator. This is used for */
364 /* custom controls in toolbars. */
365 if ((wndPtr->dwStyle & TBSTYLE_WRAPABLE) &&
366 (btnPtr->fsState & TBSTATE_WRAP)) {
369 cx = infoPtr->nWidth;
370 cy = ((btnPtr->iBitmap > 0) ?
371 btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 / 3;
376 cx = (btnPtr->iBitmap > 0) ?
377 btnPtr->iBitmap : SEPARATOR_WIDTH;
380 /* this must be a button */
381 cx = infoPtr->nButtonWidth;
385 /* --- begin test --- */
386 if ((i >= nGrpCount) && (btnPtr->fsStyle & TBSTYLE_GROUP)) {
387 for (j = i, grpX = x, nGrpCount = 0; j < infoPtr->nNumButtons; j++) {
388 grpPtr = &infoPtr->buttons[j];
389 if (grpPtr->fsState & TBSTATE_HIDDEN)
394 if ((grpPtr->fsStyle & TBSTYLE_SEP) ||
395 !(grpPtr->fsStyle & TBSTYLE_GROUP) ||
396 (grpX > infoPtr->nWidth)) {
400 else if (grpX + x > infoPtr->nWidth) {
408 bWrap = ((bWrap || (x + cx > infoPtr->nWidth)) &&
409 (wndPtr->dwStyle & TBSTYLE_WRAPABLE));
413 x = infoPtr->nIndent;
417 SetRect32 (&btnPtr->rect, x, y, x + cx, y + cy);
419 btnPtr->nRow = nRows;
422 if (btnPtr->fsState & TBSTATE_WRAP) {
424 y += (cy + SEPARATOR_HEIGHT);
425 x = infoPtr->nIndent;
428 infoPtr->nRows = nRows + 1;
430 /* --- end test --- */
432 if (btnPtr->fsStyle & TBSTYLE_SEP) {
433 /* UNDOCUMENTED: If a separator has a non zero bitmap index, */
434 /* it is the actual width of the separator. This is used for */
435 /* custom controls in toolbars. */
436 if ((wndPtr->dwStyle & TBSTYLE_WRAPABLE) &&
437 (btnPtr->fsState & TBSTATE_WRAP)) {
440 cx = infoPtr->nWidth;
441 cy = ((btnPtr->iBitmap > 0) ?
442 btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 / 3;
447 cx = (btnPtr->iBitmap > 0) ?
448 btnPtr->iBitmap : SEPARATOR_WIDTH;
451 /* this must be a button */
452 cx = infoPtr->nButtonWidth;
455 btnPtr->rect.left = x;
456 btnPtr->rect.top = y;
457 btnPtr->rect.right = x + cx;
458 btnPtr->rect.bottom = y + cy;
460 if (infoPtr->rcBound.left > x)
461 infoPtr->rcBound.left = x;
462 if (infoPtr->rcBound.right < x + cx)
463 infoPtr->rcBound.right = x + cx;
464 if (infoPtr->rcBound.bottom < y + cy)
465 infoPtr->rcBound.bottom = y + cy;
467 if (infoPtr->hwndToolTip) {
470 ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
471 ti.cbSize = sizeof(TTTOOLINFO32A);
472 ti.hwnd = wndPtr->hwndSelf;
473 ti.uId = btnPtr->idCommand;
474 ti.rect = btnPtr->rect;
475 SendMessage32A (infoPtr->hwndToolTip, TTM_NEWTOOLRECT32A,
482 if (i < infoPtr->nNumButtons)
490 infoPtr->nHeight = y + cy + BOTTOM_BORDER;
491 TRACE (toolbar, "toolbar height %d\n", infoPtr->nHeight);
496 TOOLBAR_InternalHitTest (WND *wndPtr, LPPOINT32 lpPt)
498 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
499 TBUTTON_INFO *btnPtr;
502 btnPtr = infoPtr->buttons;
503 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
504 if (btnPtr->fsState & TBSTATE_HIDDEN)
507 if (btnPtr->fsStyle & TBSTYLE_SEP) {
508 if (PtInRect32 (&btnPtr->rect, *lpPt)) {
509 TRACE (toolbar, " ON SEPARATOR %d!\n", i);
514 if (PtInRect32 (&btnPtr->rect, *lpPt)) {
515 TRACE (toolbar, " ON BUTTON %d!\n", i);
521 TRACE (toolbar, " NOWHERE!\n");
527 TOOLBAR_GetButtonIndex (TOOLBAR_INFO *infoPtr, INT32 idCommand)
529 TBUTTON_INFO *btnPtr;
532 btnPtr = infoPtr->buttons;
533 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
534 if (btnPtr->idCommand == idCommand) {
535 TRACE (toolbar, "command=%d index=%d\n", idCommand, i);
539 TRACE (toolbar, "no index found for command=%d\n", idCommand);
545 TOOLBAR_GetCheckedGroupButtonIndex (TOOLBAR_INFO *infoPtr, INT32 nIndex)
547 TBUTTON_INFO *btnPtr;
550 if ((nIndex < 0) || (nIndex > infoPtr->nNumButtons))
553 /* check index button */
554 btnPtr = &infoPtr->buttons[nIndex];
555 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
556 if (btnPtr->fsState & TBSTATE_CHECKED)
560 /* check previous buttons */
561 nRunIndex = nIndex - 1;
562 while (nRunIndex >= 0) {
563 btnPtr = &infoPtr->buttons[nRunIndex];
564 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
565 if (btnPtr->fsState & TBSTATE_CHECKED)
573 /* check next buttons */
574 nRunIndex = nIndex + 1;
575 while (nRunIndex < infoPtr->nNumButtons) {
576 btnPtr = &infoPtr->buttons[nRunIndex];
577 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
578 if (btnPtr->fsState & TBSTATE_CHECKED)
591 TOOLBAR_RelayEvent (HWND32 hwndTip, HWND32 hwndMsg, UINT32 uMsg,
592 WPARAM32 wParam, LPARAM lParam)
600 msg.time = GetMessageTime ();
601 msg.pt.x = LOWORD(GetMessagePos ());
602 msg.pt.y = HIWORD(GetMessagePos ());
604 SendMessage32A (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
609 TOOLBAR_AddBitmap (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
611 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
612 LPTBADDBITMAP lpAddBmp = (LPTBADDBITMAP)lParam;
615 if ((!lpAddBmp) || ((INT32)wParam <= 0))
618 TRACE (toolbar, "adding %d bitmaps!\n", wParam);
620 if (!(infoPtr->himlDef)) {
621 /* create new default image list */
622 TRACE (toolbar, "creating default image list!\n");
624 ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight,
625 ILC_COLOR | ILC_MASK, (INT32)wParam, 2);
629 if (!(infoPtr->himlDis)) {
630 /* create new disabled image list */
631 TRACE (toolbar, "creating disabled image list!\n");
633 ImageList_Create (infoPtr->nBitmapWidth,
634 infoPtr->nBitmapHeight, ILC_COLOR | ILC_MASK,
639 /* Add bitmaps to the default image list */
640 if (lpAddBmp->hInst == (HINSTANCE32)0) {
642 ImageList_AddMasked (infoPtr->himlStd, (HBITMAP32)lpAddBmp->nID,
645 else if (lpAddBmp->hInst == HINST_COMMCTRL) {
646 /* add internal bitmaps */
647 FIXME (toolbar, "internal bitmaps not supported!\n");
649 /* Hack to "add" some reserved images within the image list
650 to get the right image indices */
651 nIndex = ImageList_GetImageCount (infoPtr->himlStd);
652 ImageList_SetImageCount (infoPtr->himlStd, nIndex + (INT32)wParam);
656 LoadBitmap32A (lpAddBmp->hInst, (LPSTR)lpAddBmp->nID);
658 nIndex = ImageList_AddMasked (infoPtr->himlStd, hBmp, CLR_DEFAULT);
660 DeleteObject32 (hBmp);
664 infoPtr->nNumBitmaps += (INT32)wParam;
671 TOOLBAR_AddButtons32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
673 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
674 LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
675 INT32 nOldButtons, nNewButtons, nAddButtons, nCount;
678 TRACE (toolbar, "adding %d buttons!\n", wParam);
680 nAddButtons = (UINT32)wParam;
681 nOldButtons = infoPtr->nNumButtons;
682 nNewButtons = nOldButtons + nAddButtons;
684 if (infoPtr->nNumButtons == 0) {
686 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);
689 TBUTTON_INFO *oldButtons = infoPtr->buttons;
691 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);
692 memcpy (&infoPtr->buttons[0], &oldButtons[0],
693 nOldButtons * sizeof(TBUTTON_INFO));
694 COMCTL32_Free (oldButtons);
697 infoPtr->nNumButtons = nNewButtons;
699 /* insert new button data */
700 for (nCount = 0; nCount < nAddButtons; nCount++) {
701 TBUTTON_INFO *btnPtr = &infoPtr->buttons[nOldButtons+nCount];
702 btnPtr->iBitmap = lpTbb[nCount].iBitmap;
703 btnPtr->idCommand = lpTbb[nCount].idCommand;
704 btnPtr->fsState = lpTbb[nCount].fsState;
705 btnPtr->fsStyle = lpTbb[nCount].fsStyle;
706 btnPtr->dwData = lpTbb[nCount].dwData;
707 btnPtr->iString = lpTbb[nCount].iString;
709 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) {
712 ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
713 ti.cbSize = sizeof (TTTOOLINFO32A);
714 ti.hwnd = wndPtr->hwndSelf;
715 ti.uId = btnPtr->idCommand;
717 ti.lpszText = LPSTR_TEXTCALLBACK32A;
719 SendMessage32A (infoPtr->hwndToolTip, TTM_ADDTOOL32A,
724 TOOLBAR_CalcToolbar (wndPtr);
726 hdc = GetDC32 (wndPtr->hwndSelf);
727 TOOLBAR_Refresh (wndPtr, hdc);
728 ReleaseDC32 (wndPtr->hwndSelf, hdc);
734 /* << TOOLBAR_AddButtons32W >> */
738 TOOLBAR_AddString32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
740 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
743 if ((wParam) && (HIWORD(lParam) == 0)) {
746 TRACE (toolbar, "adding string from resource!\n");
748 len = LoadString32A ((HINSTANCE32)wParam, (UINT32)lParam,
751 TRACE (toolbar, "len=%d \"%s\"\n", len, szString);
752 nIndex = infoPtr->nNumStrings;
753 if (infoPtr->nNumStrings == 0) {
755 COMCTL32_Alloc (sizeof(LPWSTR));
758 LPWSTR *oldStrings = infoPtr->strings;
760 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
761 memcpy (&infoPtr->strings[0], &oldStrings[0],
762 sizeof(LPWSTR) * infoPtr->nNumStrings);
763 COMCTL32_Free (oldStrings);
766 infoPtr->strings[infoPtr->nNumStrings] =
767 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
768 lstrcpyAtoW (infoPtr->strings[infoPtr->nNumStrings], szString);
769 infoPtr->nNumStrings++;
772 LPSTR p = (LPSTR)lParam;
777 TRACE (toolbar, "adding string(s) from array!\n");
778 nIndex = infoPtr->nNumStrings;
780 len = lstrlen32A (p);
781 TRACE (toolbar, "len=%d \"%s\"\n", len, p);
783 if (infoPtr->nNumStrings == 0) {
785 COMCTL32_Alloc (sizeof(LPWSTR));
788 LPWSTR *oldStrings = infoPtr->strings;
790 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
791 memcpy (&infoPtr->strings[0], &oldStrings[0],
792 sizeof(LPWSTR) * infoPtr->nNumStrings);
793 COMCTL32_Free (oldStrings);
796 infoPtr->strings[infoPtr->nNumStrings] =
797 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
798 lstrcpyAtoW (infoPtr->strings[infoPtr->nNumStrings], p);
799 infoPtr->nNumStrings++;
810 TOOLBAR_AddString32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
812 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
815 if ((wParam) && (HIWORD(lParam) == 0)) {
818 TRACE (toolbar, "adding string from resource!\n");
820 len = LoadString32W ((HINSTANCE32)wParam, (UINT32)lParam,
823 TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(szString));
824 nIndex = infoPtr->nNumStrings;
825 if (infoPtr->nNumStrings == 0) {
827 COMCTL32_Alloc (sizeof(LPWSTR));
830 LPWSTR *oldStrings = infoPtr->strings;
832 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
833 memcpy (&infoPtr->strings[0], &oldStrings[0],
834 sizeof(LPWSTR) * infoPtr->nNumStrings);
835 COMCTL32_Free (oldStrings);
838 infoPtr->strings[infoPtr->nNumStrings] =
839 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
840 lstrcpy32W (infoPtr->strings[infoPtr->nNumStrings], szString);
841 infoPtr->nNumStrings++;
844 LPWSTR p = (LPWSTR)lParam;
849 TRACE (toolbar, "adding string(s) from array!\n");
850 nIndex = infoPtr->nNumStrings;
852 len = lstrlen32W (p);
853 TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(p));
855 if (infoPtr->nNumStrings == 0) {
857 COMCTL32_Alloc (sizeof(LPWSTR));
860 LPWSTR *oldStrings = infoPtr->strings;
862 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
863 memcpy (&infoPtr->strings[0], &oldStrings[0],
864 sizeof(LPWSTR) * infoPtr->nNumStrings);
865 COMCTL32_Free (oldStrings);
868 infoPtr->strings[infoPtr->nNumStrings] =
869 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
870 lstrcpy32W (infoPtr->strings[infoPtr->nNumStrings], p);
871 infoPtr->nNumStrings++;
882 TOOLBAR_AutoSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
884 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);
2540 UINT32 uPosFlags = 0;
2542 /* Resize deadlock check */
2543 if (infoPtr->bAutoSize) {
2544 infoPtr->bAutoSize = FALSE;
2548 flags = (INT32) wParam;
2550 /* FIXME for flags =
2551 * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED
2554 TRACE (toolbar, "sizing toolbar!\n");
2556 if (flags == SIZE_RESTORED) {
2557 /* width and height don't apply */
2558 parent = GetParent32 (wndPtr->hwndSelf);
2559 GetClientRect32(parent, &parent_rect);
2561 if (wndPtr->dwStyle & CCS_NORESIZE) {
2562 uPosFlags |= (SWP_NOSIZE | SWP_NOMOVE);
2565 /* infoPtr->nWidth = parent_rect.right - parent_rect.left; */
2566 cy = infoPtr->nHeight;
2567 cx = infoPtr->nWidth;
2568 TOOLBAR_CalcToolbar (wndPtr);
2569 infoPtr->nWidth = cx;
2570 infoPtr->nHeight = cy;
2573 infoPtr->nWidth = parent_rect.right - parent_rect.left;
2574 TOOLBAR_CalcToolbar (wndPtr);
2575 cy = infoPtr->nHeight;
2576 cx = infoPtr->nWidth;
2579 if (wndPtr->dwStyle & CCS_NOPARENTALIGN) {
2580 uPosFlags |= SWP_NOMOVE;
2581 cy = infoPtr->nHeight;
2582 cx = infoPtr->nWidth;
2585 if (!(wndPtr->dwStyle & CCS_NODIVIDER))
2586 cy += sysMetrics[SM_CYEDGE];
2588 SetWindowPos32 (wndPtr->hwndSelf, 0, parent_rect.left, parent_rect.top,
2589 cx, cy, uPosFlags | SWP_NOZORDER);
2596 TOOLBAR_StyleChanged (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
2600 TOOLBAR_AutoSize (wndPtr, wParam, lParam);
2602 hdc = GetDC32 (wndPtr->hwndSelf);
2603 TOOLBAR_Refresh (wndPtr, hdc);
2604 ReleaseDC32 (wndPtr->hwndSelf, hdc);
2612 ToolbarWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
2614 WND *wndPtr = WIN_FindWndPtr(hwnd);
2619 return TOOLBAR_AddBitmap (wndPtr, wParam, lParam);
2621 case TB_ADDBUTTONS32A:
2622 return TOOLBAR_AddButtons32A (wndPtr, wParam, lParam);
2624 /* case TB_ADDBUTTONS32W: */
2626 case TB_ADDSTRING32A:
2627 return TOOLBAR_AddString32A (wndPtr, wParam, lParam);
2629 case TB_ADDSTRING32W:
2630 return TOOLBAR_AddString32W (wndPtr, wParam, lParam);
2633 return TOOLBAR_AutoSize (wndPtr, wParam, lParam);
2635 case TB_BUTTONCOUNT:
2636 return TOOLBAR_ButtonCount (wndPtr, wParam, lParam);
2638 case TB_BUTTONSTRUCTSIZE:
2639 return TOOLBAR_ButtonStructSize (wndPtr, wParam, lParam);
2641 case TB_CHANGEBITMAP:
2642 return TOOLBAR_ChangeBitmap (wndPtr, wParam, lParam);
2644 case TB_CHECKBUTTON:
2645 return TOOLBAR_CheckButton (wndPtr, wParam, lParam);
2647 case TB_COMMANDTOINDEX:
2648 return TOOLBAR_CommandToIndex (wndPtr, wParam, lParam);
2651 return TOOLBAR_Customize (wndPtr);
2653 case TB_DELETEBUTTON:
2654 return TOOLBAR_DeleteButton (wndPtr, wParam, lParam);
2656 case TB_ENABLEBUTTON:
2657 return TOOLBAR_EnableButton (wndPtr, wParam, lParam);
2659 /* case TB_GETANCHORHIGHLIGHT: */ /* 4.71 */
2662 return TOOLBAR_GetBitmap (wndPtr, wParam, lParam);
2664 case TB_GETBITMAPFLAGS:
2665 return TOOLBAR_GetBitmapFlags (wndPtr, wParam, lParam);
2668 return TOOLBAR_GetButton (wndPtr, wParam, lParam);
2670 case TB_GETBUTTONINFO32A:
2671 return TOOLBAR_GetButtonInfo32A (wndPtr, wParam, lParam);
2673 /* case TB_GETBUTTONINFO32W: */ /* 4.71 */
2675 case TB_GETBUTTONSIZE:
2676 return TOOLBAR_GetButtonSize (wndPtr);
2678 case TB_GETBUTTONTEXT32A:
2679 return TOOLBAR_GetButtonText32A (wndPtr, wParam, lParam);
2681 /* case TB_GETBUTTONTEXT32W: */
2682 /* case TB_GETCOLORSCHEME: */ /* 4.71 */
2684 case TB_GETDISABLEDIMAGELIST:
2685 return TOOLBAR_GetDisabledImageList (wndPtr, wParam, lParam);
2687 case TB_GETEXTENDEDSTYLE:
2688 return TOOLBAR_GetExtendedStyle (wndPtr);
2690 case TB_GETHOTIMAGELIST:
2691 return TOOLBAR_GetHotImageList (wndPtr, wParam, lParam);
2693 /* case TB_GETHOTITEM: */ /* 4.71 */
2695 case TB_GETIMAGELIST:
2696 return TOOLBAR_GetImageList (wndPtr, wParam, lParam);
2698 /* case TB_GETINSERTMARK: */ /* 4.71 */
2699 /* case TB_GETINSERTMARKCOLOR: */ /* 4.71 */
2701 case TB_GETITEMRECT:
2702 return TOOLBAR_GetItemRect (wndPtr, wParam, lParam);
2705 return TOOLBAR_GetMaxSize (wndPtr, wParam, lParam);
2707 /* case TB_GETOBJECT: */ /* 4.71 */
2708 /* case TB_GETPADDING: */ /* 4.71 */
2711 return TOOLBAR_GetRect (wndPtr, wParam, lParam);
2714 return TOOLBAR_GetRows (wndPtr, wParam, lParam);
2717 return TOOLBAR_GetState (wndPtr, wParam, lParam);
2720 return TOOLBAR_GetStyle (wndPtr, wParam, lParam);
2722 case TB_GETTEXTROWS:
2723 return TOOLBAR_GetTextRows (wndPtr, wParam, lParam);
2725 case TB_GETTOOLTIPS:
2726 return TOOLBAR_GetToolTips (wndPtr, wParam, lParam);
2728 case TB_GETUNICODEFORMAT:
2729 return TOOLBAR_GetUnicodeFormat (wndPtr, wParam, lParam);
2732 return TOOLBAR_HideButton (wndPtr, wParam, lParam);
2735 return TOOLBAR_HitTest (wndPtr, wParam, lParam);
2737 case TB_INDETERMINATE:
2738 return TOOLBAR_Indeterminate (wndPtr, wParam, lParam);
2740 case TB_INSERTBUTTON32A:
2741 return TOOLBAR_InsertButton32A (wndPtr, wParam, lParam);
2743 /* case TB_INSERTBUTTON32W: */
2744 /* case TB_INSERTMARKHITTEST: */ /* 4.71 */
2746 case TB_ISBUTTONCHECKED:
2747 return TOOLBAR_IsButtonChecked (wndPtr, wParam, lParam);
2749 case TB_ISBUTTONENABLED:
2750 return TOOLBAR_IsButtonEnabled (wndPtr, wParam, lParam);
2752 case TB_ISBUTTONHIDDEN:
2753 return TOOLBAR_IsButtonHidden (wndPtr, wParam, lParam);
2755 case TB_ISBUTTONHIGHLIGHTED:
2756 return TOOLBAR_IsButtonHighlighted (wndPtr, wParam, lParam);
2758 case TB_ISBUTTONINDETERMINATE:
2759 return TOOLBAR_IsButtonIndeterminate (wndPtr, wParam, lParam);
2761 case TB_ISBUTTONPRESSED:
2762 return TOOLBAR_IsButtonPressed (wndPtr, wParam, lParam);
2764 /* case TB_LOADIMAGES: */ /* 4.70 */
2765 /* case TB_MAPACCELERATOR32A: */ /* 4.71 */
2766 /* case TB_MAPACCELERATOR32W: */ /* 4.71 */
2767 /* case TB_MARKBUTTON: */ /* 4.71 */
2768 /* case TB_MOVEBUTTON: */ /* 4.71 */
2770 case TB_PRESSBUTTON:
2771 return TOOLBAR_PressButton (wndPtr, wParam, lParam);
2773 /* case TB_REPLACEBITMAP: */
2775 case TB_SAVERESTORE32A:
2776 return TOOLBAR_SaveRestore32A (wndPtr, wParam, lParam);
2778 /* case TB_SAVERESTORE32W: */
2779 /* case TB_SETANCHORHIGHLIGHT: */ /* 4.71 */
2781 case TB_SETBITMAPSIZE:
2782 return TOOLBAR_SetBitmapSize (wndPtr, wParam, lParam);
2784 case TB_SETBUTTONINFO32A:
2785 return TOOLBAR_SetButtonInfo32A (wndPtr, wParam, lParam);
2787 /* case TB_SETBUTTONINFO32W: */ /* 4.71 */
2789 case TB_SETBUTTONSIZE:
2790 return TOOLBAR_SetButtonSize (wndPtr, wParam, lParam);
2792 case TB_SETBUTTONWIDTH:
2793 return TOOLBAR_SetButtonWidth (wndPtr, wParam, lParam);
2796 return TOOLBAR_SetCmdId (wndPtr, wParam, lParam);
2798 /* case TB_SETCOLORSCHEME: */ /* 4.71 */
2800 case TB_SETDISABLEDIMAGELIST:
2801 return TOOLBAR_SetDisabledImageList (wndPtr, wParam, lParam);
2803 case TB_SETDRAWTEXTFLAGS:
2804 return TOOLBAR_SetDrawTextFlags (wndPtr, wParam, lParam);
2806 case TB_SETEXTENDEDSTYLE:
2807 return TOOLBAR_SetExtendedStyle (wndPtr, wParam, lParam);
2809 case TB_SETHOTIMAGELIST:
2810 return TOOLBAR_SetHotImageList (wndPtr, wParam, lParam);
2812 /* case TB_SETHOTITEM: */ /* 4.71 */
2814 case TB_SETIMAGELIST:
2815 return TOOLBAR_SetImageList (wndPtr, wParam, lParam);
2818 return TOOLBAR_SetIndent (wndPtr, wParam, lParam);
2820 /* case TB_SETINSERTMARK: */ /* 4.71 */
2822 case TB_SETINSERTMARKCOLOR:
2823 return TOOLBAR_SetInsertMarkColor (wndPtr, wParam, lParam);
2825 case TB_SETMAXTEXTROWS:
2826 return TOOLBAR_SetMaxTextRows (wndPtr, wParam, lParam);
2828 /* case TB_SETPADDING: */ /* 4.71 */
2831 return TOOLBAR_SetParent (wndPtr, wParam, lParam);
2834 return TOOLBAR_SetRows (wndPtr, wParam, lParam);
2837 return TOOLBAR_SetState (wndPtr, wParam, lParam);
2840 return TOOLBAR_SetStyle (wndPtr, wParam, lParam);
2842 case TB_SETTOOLTIPS:
2843 return TOOLBAR_SetToolTips (wndPtr, wParam, lParam);
2845 case TB_SETUNICODEFORMAT:
2846 return TOOLBAR_SetUnicodeFormat (wndPtr, wParam, lParam);
2852 return TOOLBAR_Create (wndPtr, wParam, lParam);
2855 return TOOLBAR_Destroy (wndPtr, wParam, lParam);
2858 return TOOLBAR_EraseBackground (wndPtr, wParam, lParam);
2860 /* case WM_GETFONT: */
2861 /* case WM_KEYDOWN: */
2862 /* case WM_KILLFOCUS: */
2864 case WM_LBUTTONDBLCLK:
2865 return TOOLBAR_LButtonDblClk (wndPtr, wParam, lParam);
2867 case WM_LBUTTONDOWN:
2868 return TOOLBAR_LButtonDown (wndPtr, wParam, lParam);
2871 return TOOLBAR_LButtonUp (wndPtr, wParam, lParam);
2874 return TOOLBAR_MouseMove (wndPtr, wParam, lParam);
2877 return TOOLBAR_NCActivate (wndPtr, wParam, lParam);
2880 return TOOLBAR_NCCalcSize (wndPtr, wParam, lParam);
2883 return TOOLBAR_NCCreate (wndPtr, wParam, lParam);
2886 return TOOLBAR_NCPaint (wndPtr, wParam, lParam);
2889 return TOOLBAR_Notify (wndPtr, wParam, lParam);
2891 /* case WM_NOTIFYFORMAT: */
2894 return TOOLBAR_Paint (wndPtr, wParam);
2897 return TOOLBAR_Size (wndPtr, wParam, lParam);
2899 case WM_STYLECHANGED:
2900 return TOOLBAR_StyleChanged (wndPtr, wParam, lParam);
2902 /* case WM_SYSCOLORCHANGE: */
2904 /* case WM_WININICHANGE: */
2909 case WM_MEASUREITEM:
2911 return SendMessage32A (GetParent32 (hwnd), uMsg, wParam, lParam);
2914 if (uMsg >= WM_USER)
2915 ERR (toolbar, "unknown msg %04x wp=%08x lp=%08lx\n",
2916 uMsg, wParam, lParam);
2917 return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
2924 TOOLBAR_Register (VOID)
2926 WNDCLASS32A wndClass;
2928 if (GlobalFindAtom32A (TOOLBARCLASSNAME32A)) return;
2930 ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
2931 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;
2932 wndClass.lpfnWndProc = (WNDPROC32)ToolbarWindowProc;
2933 wndClass.cbClsExtra = 0;
2934 wndClass.cbWndExtra = sizeof(TOOLBAR_INFO *);
2935 wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A);
2936 wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
2937 wndClass.lpszClassName = TOOLBARCLASSNAME32A;
2939 RegisterClass32A (&wndClass);
2944 TOOLBAR_Unregister (VOID)
2946 if (GlobalFindAtom32A (TOOLBARCLASSNAME32A))
2947 UnregisterClass32A (TOOLBARCLASSNAME32A, (HINSTANCE32)NULL);