- Timestamp:
- Mar 17, 2004, 5:59:41 PM (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/toolbar.c
r10535 r10538 19 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 20 * 21 * NOTES22 *23 21 * Differences between MSDN and actual native control operation: 24 22 * 1. MSDN says: "TBSTYLE_LIST: Creates a flat toolbar with button text … … 30 28 * *not* imply TBSTYLE_FLAT as documented. (GA 8/2001) 31 29 * 32 * This code was audited for completeness against the documented features 33 * of Comctl32.dll version 6.0 on Mar. 14, 2004, by Robert Shearman. 34 * 35 * Unless otherwise noted, we believe this code to be complete, as per 36 * the specification mentioned above. 37 * If you discover missing features or bugs please note them below. 38 * 30 * 39 31 * TODO: 40 32 * - Button wrapping (under construction). 41 * - Messages: 42 * - TB_GETINSERTMARK 43 * - TB_GETINSERTMARKCOLOR 44 * - TB_GETMETRICS 45 * - TB_GETOBJECT 46 * - TB_INSERTMARKHITTEST 47 * - TB_MOVEBUTTON 48 * - TB_SETINSERTMARK 49 * - TB_SETMETRICS 50 * - Notifications: 51 * - NM_CHAR 52 * - NM_KEYDOWN 53 * - NM_LDOWN 54 * - NM_RCLICK 55 * - NM_RDBLCLICK 56 * - TBN_DELETINGBUTTON 57 * - TBN_DRAGOUT 58 * - TBN_GETOBJECT 59 * - TBN_RESTORE 60 * - TBN_SAVE 61 * - TBN_TOOLBARCHANGE 33 * - Messages. 34 * - Notifications (under construction). 62 35 * - Fix TB_SETROWS. 36 * - Tooltip support (almost complete). 37 * - Unicode suppport (under construction). 63 38 * - Fix TOOLBAR_SetButtonInfo32A/W. 64 * - iListGap custom draw support. 39 * - TBSTYLE_AUTOSIZE for toolbar and buttons. 40 * - I_IMAGECALLBACK support. 41 * - iString of -1 is undocumented 65 42 * - Customization dialog: 43 * - Add flat look. 66 44 * - Minor buglet in 'available buttons' list: 67 * Buttons are not listed in M S-like order. MSseems to use a single45 * Buttons are not listed in M$-like order. M$ seems to use a single 68 46 * internal list to store the button information of both listboxes. 69 47 * - Drag list support. 48 * - Help and Reset button support. 70 49 * 71 50 * Testing: … … 80 59 */ 81 60 82 #include <stdarg.h>83 61 #include <string.h> 84 62 63 #include "winbase.h" 85 64 #include "windef.h" 86 #include "winbase.h"87 65 #include "wingdi.h" 88 66 #include "winuser.h" 89 67 #include "wine/unicode.h" 90 #include "winnls.h"91 68 #include "commctrl.h" 92 69 #include "imagelist.h" … … 128 105 INT nHeight; /* height of the toolbar */ 129 106 INT nWidth; /* width of the toolbar */ 130 RECT client_rect;131 107 INT nButtonHeight; 132 108 INT nButtonWidth; … … 151 127 DWORD dwItemCDFlag; /* TBCDRF_ flags from last ITEMPREPAINT */ 152 128 SIZE szPadding; /* padding values around button */ 153 INT iListGap; /* default gap between text and image for toolbar with list style */154 129 HFONT hDefaultFont; 155 130 HFONT hFont; /* text font */ … … 178 153 RECT rcBound; /* bounding rectangle */ 179 154 INT iVersion; 180 LPWSTR pszTooltipText; /* temporary store for a string > 80 characters 181 * for TTN_GETDISPINFOW notification */ 155 182 156 TBUTTON_INFO *buttons; /* pointer to button array */ 183 157 LPWSTR *strings; /* pointer to string array */ … … 201 175 } CUSTOMBUTTON, *PCUSTOMBUTTON; 202 176 203 typedef enum204 {205 IMAGE_LIST_DEFAULT,206 IMAGE_LIST_HOT,207 IMAGE_LIST_DISABLED208 } IMAGE_LIST_TYPE;209 177 210 178 #define SEPARATOR_WIDTH 8 … … 212 180 #define BOTTOM_BORDER 2 213 181 #define DDARROW_WIDTH 11 214 #define ARROW_HEIGHT 3215 216 /* gap between border of button and text/image */217 #define OFFSET_X 1218 #define OFFSET_Y 1219 /* how wide to treat the bitmap if it isn't present */220 #define LIST_IMAGE_ABSENT_WIDTH 2221 182 222 183 #define TOOLBAR_GetInfoPtr(hwnd) ((TOOLBAR_INFO *)GetWindowLongA(hwnd,0)) 223 184 #define TOOLBAR_HasText(x, y) (TOOLBAR_GetText(x, y) ? TRUE : FALSE) 224 185 #define TOOLBAR_HasDropDownArrows(exStyle) ((exStyle & TBSTYLE_EX_DRAWDDARROWS) ? TRUE : FALSE) 225 226 #ifdef __WIN32OS2__227 static inline const char *wine_dbgstr_rect( const RECT *rect )228 {229 return "rect (null)";230 }231 #endif232 233 static inline int TOOLBAR_GetListTextOffset(TOOLBAR_INFO *infoPtr, INT iListGap)234 {235 return GetSystemMetrics(SM_CXEDGE) + iListGap - infoPtr->szPadding.cx/2;236 }237 186 238 187 /* Used to find undocumented extended styles */ … … 406 355 407 356 /*********************************************************************** 408 * TOOLBAR_ GetImageListForDrawing357 * TOOLBAR_DrawImageList 409 358 * 410 359 * This function validates the bitmap index (including I_IMAGECALLBACK 411 * functionality) and returns the corresponding image list. 412 */ 413 static HIMAGELIST 414 TOOLBAR_GetImageListForDrawing (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, IMAGE_LIST_TYPE imagelist, INT * index) 415 { 416 HIMAGELIST himl; 417 418 if (!TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) { 419 if (btnPtr->iBitmap == I_IMAGENONE) return NULL; 420 ERR("index %d,%d is not valid, max %d\n", 421 HIWORD(btnPtr->iBitmap), LOWORD(btnPtr->iBitmap), infoPtr->nNumBitmaps); 422 return NULL; 423 } 424 425 if ((*index = TOOLBAR_GetBitmapIndex(infoPtr, btnPtr)) < 0) { 426 if ((*index == I_IMAGECALLBACK) || 427 (*index == I_IMAGENONE)) return NULL; 428 ERR("TBN_GETDISPINFO returned invalid index %d\n", 429 *index); 430 return NULL; 431 } 432 433 switch(imagelist) 434 { 435 case IMAGE_LIST_DEFAULT: 436 himl = GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr, btnPtr->iBitmap)); 437 break; 438 case IMAGE_LIST_HOT: 439 himl = GETHOTIMAGELIST(infoPtr, GETHIMLID(infoPtr, btnPtr->iBitmap)); 440 break; 441 case IMAGE_LIST_DISABLED: 442 himl = GETDISIMAGELIST(infoPtr, GETHIMLID(infoPtr, btnPtr->iBitmap)); 443 break; 444 default: 445 himl = NULL; 446 FIXME("Shouldn't reach here\n"); 447 } 448 449 if (!himl) 450 TRACE("no image list\n"); 451 452 return himl; 453 } 454 455 456 /*********************************************************************** 457 * TOOLBAR_TestImageExist 458 * 459 * This function is similar to TOOLBAR_GetImageListForDrawing, except it does not 460 * return the image list. The I_IMAGECALLBACK functionality is implemented. 360 * functionality). It then draws the image via the ImageList_Draw 361 * function. It returns TRUE if the image was drawn, FALSE otherwise. 461 362 */ 462 363 static BOOL 463 TOOLBAR_TestImageExist (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HIMAGELIST himl) 364 TOOLBAR_DrawImageList (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HIMAGELIST himl, 365 HDC hdc, UINT left, UINT top, UINT draw_flags) 464 366 { 465 367 INT index; … … 481 383 return FALSE; 482 384 } 385 TRACE("drawing index=%d, himl=%p, left=%d, top=%d, flags=%08x\n", 386 index, himl, left, top, draw_flags); 387 388 ImageList_Draw (himl, index, hdc, left, top, draw_flags); 389 return TRUE; 390 } 391 392 393 /*********************************************************************** 394 * TOOLBAR_TestImageExist 395 * 396 * This function is similar to TOOLBAR_DrawImageList, except it does not 397 * draw the image. The I_IMAGECALLBACK functionality is implemented. 398 */ 399 static BOOL 400 TOOLBAR_TestImageExist (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HIMAGELIST himl) 401 { 402 INT index; 403 404 if (!himl) return FALSE; 405 406 if (!TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) { 407 if (btnPtr->iBitmap == I_IMAGENONE) return FALSE; 408 ERR("index %d is not valid, max %d\n", 409 btnPtr->iBitmap, infoPtr->nNumBitmaps); 410 return FALSE; 411 } 412 413 if ((index = TOOLBAR_GetBitmapIndex(infoPtr, btnPtr)) < 0) { 414 if ((index == I_IMAGECALLBACK) || 415 (index == I_IMAGENONE)) return FALSE; 416 ERR("TBN_GETDISPINFO returned invalid index %d\n", 417 index); 418 return FALSE; 419 } 483 420 return TRUE; 484 421 } … … 516 453 * TOOLBAR_DrawDDFlatSeparator 517 454 * 518 * This function draws the separator that was flag ged as BTNS_DROPDOWN.455 * This function draws the separator that was flaged as TBSTYLE_DROPDOWN. 519 456 * In this case, the separator is a pixel high line of COLOR_BTNSHADOW, 520 457 * followed by a pixel high line of COLOR_BTNHIGHLIGHT. These separators … … 558 495 559 496 static void 560 TOOLBAR_DrawArrow (HDC hdc, INT left, INT top, COLORREF clr)497 TOOLBAR_DrawArrow (HDC hdc, INT left, INT top, INT colorRef) 561 498 { 562 499 INT x, y; 563 500 HPEN hPen, hOldPen; 564 501 565 if (!(hPen = CreatePen( PS_SOLID, 1, clr))) return;502 if (!(hPen = CreatePen( PS_SOLID, 1, GetSysColor( colorRef )))) return; 566 503 hOldPen = SelectObject ( hdc, hPen ); 567 504 x = left + 2; 568 y = top ;505 y = top + 8; 569 506 MoveToEx (hdc, x, y, NULL); 570 507 LineTo (hdc, x+5, y++); x++; … … 584 521 */ 585 522 static void 586 TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, RECT *rcText, LPWSTR lpText,587 NMTBCUSTOMDRAW *tbcd) 588 { 589 HDC hdc = tbcd->nmcd.hdc; 523 TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, 524 HDC hdc, INT nState, DWORD dwStyle, 525 RECT *rcText, LPWSTR lpText, NMTBCUSTOMDRAW *tbcd) 526 { 590 527 HFONT hOldFont = 0; 591 528 COLORREF clrOld = 0; 592 COLORREF clrOldBk = 0;593 int oldBkMode = 0;594 UINT state = tbcd->nmcd.uItemState;595 529 596 530 /* draw text */ 597 531 if (lpText) { 598 TRACE("string =%s rect=(%ld,%ld)-(%ld,%ld)\n", debugstr_w(lpText),532 TRACE("string rect=(%ld,%ld)-(%ld,%ld)\n", 599 533 rcText->left, rcText->top, rcText->right, rcText->bottom); 600 534 601 535 hOldFont = SelectObject (hdc, infoPtr->hFont); 602 if ((state & CDIS_HOT) && (infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK )) { 603 clrOld = SetTextColor (hdc, tbcd->clrTextHighlight); 604 } 605 else if (state & CDIS_DISABLED) { 536 if (!(nState & TBSTATE_ENABLED)) { 606 537 clrOld = SetTextColor (hdc, tbcd->clrBtnHighlight); 607 538 OffsetRect (rcText, 1, 1); … … 610 541 OffsetRect (rcText, -1, -1); 611 542 } 612 else if ( state & CDIS_INDETERMINATE) {543 else if (nState & TBSTATE_INDETERMINATE) { 613 544 clrOld = SetTextColor (hdc, comctl32_color.clr3dShadow); 614 545 } 615 else if ( (state & CDIS_MARKED) && !(infoPtr->dwItemCDFlag & TBCDRF_NOMARK)) {546 else if (btnPtr->bHot && (infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK )) { 616 547 clrOld = SetTextColor (hdc, tbcd->clrTextHighlight); 617 clrOldBk = SetBkColor (hdc, tbcd->clrMark);618 oldBkMode = SetBkMode (hdc, OPAQUE); /* FIXME: should this be in the NMTBCUSTOMDRAW structure? */619 548 } 620 549 else { … … 624 553 DrawTextW (hdc, lpText, -1, rcText, infoPtr->dwDTFlags); 625 554 SetTextColor (hdc, clrOld); 626 if ((state & CDIS_MARKED) && !(infoPtr->dwItemCDFlag & TBCDRF_NOMARK))627 {628 SetBkColor (hdc, clrOldBk);629 SetBkMode (hdc, oldBkMode);630 }631 555 SelectObject (hdc, hOldFont); 632 556 } … … 635 559 636 560 static void 637 TOOLBAR_DrawPattern (LPRECT lpRect, NMTBCUSTOMDRAW *tbcd) 638 { 639 HDC hdc = tbcd->nmcd.hdc; 640 HBRUSH hbr = SelectObject (hdc, tbcd->hbrMonoDither); 641 COLORREF clrTextOld; 642 COLORREF clrBkOld; 561 TOOLBAR_DrawPattern (HDC hdc, LPRECT lpRect) 562 { 563 HBRUSH hbr = SelectObject (hdc, COMCTL32_hPattern55AABrush); 643 564 INT cx = lpRect->right - lpRect->left; 644 565 INT cy = lpRect->bottom - lpRect->top; 645 clrTextOld = SetTextColor(hdc, tbcd->clrBtnHighlight); 646 clrBkOld = SetBkColor(hdc, tbcd->clrBtnFace); 647 PatBlt (hdc, lpRect->left, lpRect->top, cx, cy, PATCOPY); 648 SetBkColor(hdc, clrBkOld); 649 SetTextColor(hdc, clrTextOld); 566 PatBlt (hdc, lpRect->left, lpRect->top, cx, cy, 0x00FA0089); 650 567 SelectObject (hdc, hbr); 651 568 } 652 569 653 570 654 static void TOOLBAR_DrawMasked(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, 655 HDC hdc, INT x, INT y) 571 static void 572 TOOLBAR_DrawMasked (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, 573 HDC hdc, INT x, INT y) 656 574 { 657 575 HIMAGELIST himl = GETDEFIMAGELIST(infoPtr, 0); 658 659 if (himl) 660 { 661 INT cx, cy; 662 HBITMAP hbmMask, hbmImage; 663 HDC hdcMask, hdcImage; 664 665 ImageList_GetIconSize(himl, &cx, &cy); 666 667 /* Create src image */ 668 hdcImage = CreateCompatibleDC(hdc); 669 hbmImage = CreateBitmap(cx, cy, GetDeviceCaps(hdc,PLANES), 670 GetDeviceCaps(hdc,BITSPIXEL), NULL); 671 SelectObject(hdcImage, hbmImage); 672 ImageList_DrawEx(himl, btnPtr->iBitmap, hdcImage, 0, 0, cx, cy, 673 RGB(0xff, 0xff, 0xff), RGB(0,0,0), ILD_NORMAL); 674 675 /* Create Mask */ 676 hdcMask = CreateCompatibleDC(0); 677 hbmMask = CreateBitmap(cx, cy, 1, 1, NULL); 678 SelectObject(hdcMask, hbmMask); 679 680 /* Remove the background and all white pixels */ 681 SetBkColor(hdcImage, ImageList_GetBkColor(himl)); 682 BitBlt(hdcMask, 0, 0, cx, cy, hdcImage, 0, 0, SRCCOPY); 683 SetBkColor(hdcImage, RGB(0xff, 0xff, 0xff)); 684 BitBlt(hdcMask, 0, 0, cx, cy, hdcImage, 0, 0, NOTSRCERASE); 685 686 /* draw the new mask 'etched' to hdc */ 687 SetBkColor(hdc, RGB(255, 255, 255)); 688 SelectObject(hdc, GetSysColorBrush(COLOR_3DHILIGHT)); 689 BitBlt(hdc, x + 1, y + 1, cx, cy, hdcMask, 0, 0, 0xE20746); 690 SelectObject(hdc, GetSysColorBrush(COLOR_3DSHADOW)); 691 BitBlt(hdc, x, y, cx, cy, hdcMask, 0, 0, 0xE20746); 692 693 /* Cleanup */ 694 DeleteObject(hbmImage); 695 DeleteDC(hdcImage); 696 DeleteObject (hbmMask); 697 DeleteDC(hdcMask); 698 } 576 INT cx, cy; 577 HBITMAP hbmMask; 578 HDC hdcMask; 579 580 if (!himl) 581 return; 582 583 ImageList_GetIconSize(himl, &cx, &cy); 584 585 /* create new dc's */ 586 hdcMask = CreateCompatibleDC (0); 587 588 /* create new bitmap */ 589 hbmMask = CreateBitmap (cx, cy, 1, 1, NULL); 590 SelectObject (hdcMask, hbmMask); 591 592 /* copy the mask bitmap */ 593 ImageList_DrawEx(himl, btnPtr->iBitmap, hdcMask, 0, 0, 0, 0, RGB(255, 255, 255), RGB(0, 0, 0), ILD_MASK); 594 595 /* draw the new mask */ 596 SelectObject (hdc, GetSysColorBrush (COLOR_3DHILIGHT)); 597 BitBlt (hdc, x+1, y+1, cx, cy, hdcMask, 0, 0, 0xB8074A); 598 599 SelectObject (hdc, GetSysColorBrush (COLOR_3DSHADOW)); 600 BitBlt (hdc, x, y, cx, cy, hdcMask, 0, 0, 0xB8074A); 601 602 DeleteObject (hbmMask); 603 DeleteDC (hdcMask); 699 604 } 700 605 … … 716 621 } 717 622 718 /* draws the image on a toolbar button */ 719 static void 720 TOOLBAR_DrawImage(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, INT left, INT top, const NMTBCUSTOMDRAW *tbcd) 721 { 722 HIMAGELIST himl = NULL; 723 BOOL draw_masked = FALSE; 724 INT index; 725 INT offset = 0; 726 UINT draw_flags = ILD_NORMAL; 727 728 if (tbcd->nmcd.uItemState & (CDIS_DISABLED | CDIS_INDETERMINATE)) 729 { 730 himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DISABLED, &index); 731 if (!himl) 732 draw_masked = TRUE; 733 } 734 else if ((tbcd->nmcd.uItemState & CDIS_HOT) && (GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & TBSTYLE_FLAT)) 735 { 736 /* if hot, attempt to draw with hot image list, if fails, 737 use default image list */ 738 himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_HOT, &index); 739 if (!himl) 740 himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index); 741 } 742 else 743 himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index); 744 745 if (!(infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) && 746 (tbcd->nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED))) 747 offset = 1; 748 749 if (!(infoPtr->dwItemCDFlag & TBCDRF_NOMARK) && 750 (tbcd->nmcd.uItemState & CDIS_MARKED)) 751 draw_flags |= ILD_BLEND50; 752 753 TRACE("drawing index=%d, himl=%p, left=%d, top=%d, offset=%d\n", 754 index, himl, left, top, offset); 755 756 if (draw_masked) 757 TOOLBAR_DrawMasked (infoPtr, btnPtr, tbcd->nmcd.hdc, left + offset, top + offset); 758 else if (himl) 759 ImageList_Draw (himl, index, tbcd->nmcd.hdc, left + offset, top + offset, draw_flags); 760 } 761 762 /* draws a blank frame for a toolbar button */ 763 static void 764 TOOLBAR_DrawFrame(const TOOLBAR_INFO *infoPtr, BOOL flat, const NMTBCUSTOMDRAW *tbcd) 765 { 766 HDC hdc = tbcd->nmcd.hdc; 767 RECT rc = tbcd->nmcd.rc; 768 /* if the state is disabled or indeterminate then the button 769 * cannot have an interactive look like pressed or hot */ 770 BOOL non_interactive_state = (tbcd->nmcd.uItemState & CDIS_DISABLED) || 771 (tbcd->nmcd.uItemState & CDIS_INDETERMINATE); 772 BOOL pressed_look = !non_interactive_state && 773 ((tbcd->nmcd.uItemState & CDIS_SELECTED) || 774 (tbcd->nmcd.uItemState & CDIS_CHECKED)); 775 776 /* app don't want us to draw any edges */ 777 if (infoPtr->dwItemCDFlag & TBCDRF_NOEDGES) 778 return; 779 780 if (flat) 781 { 782 if (pressed_look) 783 DrawEdge (hdc, &rc, BDR_SUNKENOUTER, BF_RECT); 784 else if ((tbcd->nmcd.uItemState & CDIS_HOT) && !non_interactive_state) 785 DrawEdge (hdc, &rc, BDR_RAISEDINNER, BF_RECT); 786 } 787 else 788 { 789 if (pressed_look) 790 DrawEdge (hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_MIDDLE); 791 else 792 DrawEdge (hdc, &rc, EDGE_RAISED, 793 BF_SOFT | BF_RECT | BF_MIDDLE); 794 } 795 } 796 797 static void 798 TOOLBAR_DrawSepDDArrow(const TOOLBAR_INFO *infoPtr, BOOL flat, const NMTBCUSTOMDRAW *tbcd, RECT *rcArrow) 799 { 800 HDC hdc = tbcd->nmcd.hdc; 801 int offset = 0; 802 803 if (flat) 804 { 805 if ((tbcd->nmcd.uItemState & CDIS_SELECTED) || (tbcd->nmcd.uItemState & CDIS_CHECKED)) 806 DrawEdge (hdc, rcArrow, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST); 807 else if ( (tbcd->nmcd.uItemState & CDIS_HOT) && 808 !(tbcd->nmcd.uItemState & CDIS_DISABLED) && 809 !(tbcd->nmcd.uItemState & CDIS_INDETERMINATE)) 810 DrawEdge (hdc, rcArrow, BDR_RAISEDINNER, BF_RECT); 811 } 812 else 813 { 814 if ((tbcd->nmcd.uItemState & CDIS_SELECTED) || (tbcd->nmcd.uItemState & CDIS_CHECKED)) 815 DrawEdge (hdc, rcArrow, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST); 816 else 817 DrawEdge (hdc, rcArrow, EDGE_RAISED, 818 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); 819 } 820 821 if (tbcd->nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED)) 822 offset = (infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1; 823 824 if (tbcd->nmcd.uItemState & (CDIS_DISABLED | CDIS_INDETERMINATE)) 825 { 826 TOOLBAR_DrawArrow(hdc, rcArrow->left+1, rcArrow->top+1 + (rcArrow->bottom - rcArrow->top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnHighlight); 827 TOOLBAR_DrawArrow(hdc, rcArrow->left, rcArrow->top + (rcArrow->bottom - rcArrow->top - ARROW_HEIGHT) / 2, comctl32_color.clr3dShadow); 828 } 829 else 830 TOOLBAR_DrawArrow(hdc, rcArrow->left + offset, rcArrow->top + offset + (rcArrow->bottom - rcArrow->top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnText); 831 } 832 833 /* draws a complete toolbar button */ 623 834 624 static void 835 625 TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) … … 837 627 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 838 628 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); 839 BOOL hasDropDownArrow = (TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && 840 (btnPtr->fsStyle & BTNS_DROPDOWN)) || 841 (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN); 842 BOOL drawSepDropDownArrow = hasDropDownArrow && 843 (~btnPtr->fsStyle & BTNS_WHOLEDROPDOWN); 844 RECT rc, rcArrow, rcBitmap, rcText; 629 BOOL hasDropDownArrow = TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && 630 (btnPtr->fsStyle & TBSTYLE_DROPDOWN); 631 RECT rc, rcArrow, rcBitmap, rcText, rcFill; 845 632 LPWSTR lpText = NULL; 846 633 NMTBCUSTOMDRAW tbcd; 847 634 DWORD ntfret; 848 635 INT offset; 636 HIMAGELIST himlDef; 637 638 if (btnPtr->fsState & TBSTATE_HIDDEN) 639 return; 849 640 850 641 rc = btnPtr->rect; 642 CopyRect (&rcFill, &rc); 851 643 CopyRect (&rcArrow, &rc); 852 644 CopyRect(&rcBitmap, &rc); 645 CopyRect(&rcText, &rc); 853 646 854 647 /* get a pointer to the text */ … … 857 650 if (hasDropDownArrow) 858 651 { 859 int right; 860 861 if (dwStyle & TBSTYLE_FLAT) 862 right = max(rc.left, rc.right - DDARROW_WIDTH); 863 else 864 right = max(rc.left, rc.right - DDARROW_WIDTH - 2); 865 866 if (drawSepDropDownArrow) 867 rc.right = right; 868 869 rcArrow.left = right; 870 } 871 872 /* copy text rect after adjusting for drop-down arrow 873 * so that text is centred in the rectangle not containing 874 * the arrow */ 875 CopyRect(&rcText, &rc); 652 if (dwStyle & TBSTYLE_FLAT) 653 rc.right = max(rc.left, rc.right - DDARROW_WIDTH); 654 else 655 rc.right = max(rc.left, rc.right - DDARROW_WIDTH - 2); 656 rcArrow.left = rc.right; 657 } 876 658 877 659 /* Center the bitmap horizontally and vertically */ 878 660 if (dwStyle & TBSTYLE_LIST) 879 rcBitmap.left += GetSystemMetrics(SM_CXEDGE) + OFFSET_X;661 rcBitmap.left += 3; 880 662 else 881 663 rcBitmap.left+=(infoPtr->nButtonWidth - infoPtr->nBitmapWidth) / 2; 882 664 883 665 if(lpText) 884 rcBitmap.top+= GetSystemMetrics(SM_CYEDGE) + OFFSET_Y;666 rcBitmap.top+=2; /* this looks to be the correct value from vmware comparison - cmm */ 885 667 else 886 668 rcBitmap.top+=(infoPtr->nButtonHeight - infoPtr->nBitmapHeight) / 2; 887 669 888 670 TRACE("iBitmap: %d, start=(%ld,%ld) w=%d, h=%d\n", 889 890 671 btnPtr->iBitmap, rcBitmap.left, rcBitmap.top, 672 infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); 891 673 TRACE ("iString: %x\n", btnPtr->iString); 892 674 TRACE ("Stringtext: %s\n", debugstr_w(lpText)); … … 894 676 /* draw text */ 895 677 if (lpText) { 896 rcText.left += GetSystemMetrics(SM_CXEDGE) + OFFSET_X; 897 rcText.right -= GetSystemMetrics(SM_CXEDGE) + OFFSET_X; 898 if (GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr,btnPtr->iBitmap)) && 899 TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) 900 { 901 if (dwStyle & TBSTYLE_LIST) 902 rcText.left += infoPtr->nBitmapWidth + TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap); 903 else 904 rcText.top += GetSystemMetrics(SM_CYEDGE) + OFFSET_Y + infoPtr->nBitmapHeight + infoPtr->szPadding.cy/2; 905 } 906 else 907 if (dwStyle & TBSTYLE_LIST) 908 rcText.left += LIST_IMAGE_ABSENT_WIDTH + TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap); 909 910 if (btnPtr->fsState & (TBSTATE_PRESSED | TBSTATE_CHECKED)) 911 OffsetRect (&rcText, 1, 1); 912 } 913 914 /* Initialize fields in all cases, because we use these later 915 * NOTE: applications can and do alter these to customize their 916 * toolbars */ 678 679 InflateRect (&rcText, -3, -3); 680 681 if (GETDEFIMAGELIST(infoPtr, 0) && 682 TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) { 683 /* The following test looked like this before 684 * I changed it. IE4 "Links" toolbar would not 685 * draw correctly with the original code. - GA 8/01 686 * ((dwStyle & TBSTYLE_LIST) && 687 * ((btnPtr->fsStyle & TBSTYLE_AUTOSIZE) == 0) && 688 * (btnPtr->iBitmap != I_IMAGENONE)) 689 */ 690 if (dwStyle & TBSTYLE_LIST) { 691 /* LIST style w/ ICON offset is by matching native. */ 692 /* Matches IE4 "Links" bar. - GA 8/01 */ 693 rcText.left += (infoPtr->nBitmapWidth + 2); 694 } 695 else { 696 rcText.top += infoPtr->nBitmapHeight + 1; 697 } 698 } 699 else { 700 if (dwStyle & TBSTYLE_LIST) { 701 /* LIST style w/o ICON offset is by matching native. */ 702 /* Matches IE4 "menu" bar. - GA 8/01 */ 703 rcText.left += 4; 704 } 705 } 706 707 if (btnPtr->fsState & (TBSTATE_PRESSED | TBSTATE_CHECKED)) 708 OffsetRect (&rcText, 1, 1); 709 } 710 711 /* Initialize fields in all cases, because we use these later */ 917 712 ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW)); 918 713 tbcd.clrText = comctl32_color.clrBtnText; … … 924 719 tbcd.nStringBkMode = (infoPtr->bBtnTranspnt) ? TRANSPARENT : OPAQUE; 925 720 tbcd.nHLStringBkMode = (infoPtr->bBtnTranspnt) ? TRANSPARENT : OPAQUE; 926 /* MSDN says that this is the text rectangle. 927 * But (why always a but) tracing of v5.7 of native shows928 * that this is really a *relative* rectangle based on the929 * the nmcd.rc. Also the left and top are always 0 ignoring930 * any bitmap that might be present.*/721 /* MSDN says that this is the text rectangle. */ 722 /* But (why always a but) tracing of v5.7 of native shows */ 723 /* that this is really a *relative* rectangle based on the */ 724 /* the nmcd.rc. Also the left and top are always 0 ignoring*/ 725 /* any bitmap that might be present. */ 931 726 tbcd.rcText.left = 0; 932 727 tbcd.rcText.top = 0; 933 728 tbcd.rcText.right = rcText.right - rc.left; 934 729 tbcd.rcText.bottom = rcText.bottom - rc.top; 935 tbcd.nmcd.uItemState = TOOLBAR_TranslateState(btnPtr); 936 tbcd.nmcd.hdc = hdc; 937 tbcd.nmcd.rc = rc; 938 tbcd.hbrMonoDither = COMCTL32_hPattern55AABrush; 939 940 /* FIXME: what are these used for? */ 730 731 /* FIXME: what should these be set to ????? */ 732 tbcd.hbrMonoDither = 0; 941 733 tbcd.hbrLines = 0; 942 734 tbcd.hpenLines = 0; … … 948 740 { 949 741 tbcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT; 742 tbcd.nmcd.hdc = hdc; 743 tbcd.nmcd.rc = rc; 950 744 tbcd.nmcd.dwItemSpec = btnPtr->idCommand; 745 tbcd.nmcd.uItemState = TOOLBAR_TranslateState(btnPtr); 951 746 tbcd.nmcd.lItemlParam = btnPtr->dwData; 952 747 ntfret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW); 953 /* reset these fields so the user can't alter the behaviour like native */954 tbcd.nmcd.hdc = hdc;955 tbcd.nmcd.rc = rc;956 957 748 infoPtr->dwItemCustDraw = ntfret & 0xffff; 958 749 infoPtr->dwItemCDFlag = ntfret & 0xffff0000; … … 964 755 } 965 756 757 if (!infoPtr->bBtnTranspnt) 758 FillRect( hdc, &rcFill, GetSysColorBrush(COLOR_BTNFACE)); 759 966 760 /* separator */ 967 if (btnPtr->fsStyle & BTNS_SEP) {761 if (btnPtr->fsStyle & TBSTYLE_SEP) { 968 762 /* with the FLAT style, iBitmap is the width and has already */ 969 763 /* been taken into consideration in calculating the width */ … … 972 766 /* when drawing the vertical bar... */ 973 767 if ((dwStyle & TBSTYLE_FLAT) /* && (btnPtr->iBitmap == 0) */) { 974 if (btnPtr->fsStyle & BTNS_DROPDOWN)768 if (btnPtr->fsStyle & TBSTYLE_DROPDOWN) 975 769 TOOLBAR_DrawDDFlatSeparator (&rc, hdc, btnPtr, infoPtr); 976 770 else 977 771 TOOLBAR_DrawFlatSeparator (&rc, hdc, infoPtr); 978 772 } 979 else if (btnPtr->fsStyle != BTNS_SEP) {773 else if (btnPtr->fsStyle != TBSTYLE_SEP) { 980 774 FIXME("Draw some kind of separator: fsStyle=%x\n", 981 775 btnPtr->fsStyle); … … 984 778 } 985 779 986 if (!(tbcd.nmcd.uItemState & CDIS_HOT) && 987 ((tbcd.nmcd.uItemState & CDIS_CHECKED) || (tbcd.nmcd.uItemState & CDIS_INDETERMINATE))) 988 TOOLBAR_DrawPattern (&rc, &tbcd); 989 990 if ((dwStyle & TBSTYLE_FLAT) && (tbcd.nmcd.uItemState & CDIS_HOT)) 780 /* Determine index of image list */ 781 himlDef = GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr, btnPtr->iBitmap)); 782 783 /* disabled */ 784 if (!(btnPtr->fsState & TBSTATE_ENABLED)) { 785 HIMAGELIST himlDis = GETDISIMAGELIST(infoPtr, GETHIMLID(infoPtr, btnPtr->iBitmap)); 786 if (!(dwStyle & TBSTYLE_FLAT) && !(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) 787 { 788 DrawEdge (hdc, &rc, EDGE_RAISED, 789 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); 790 if (hasDropDownArrow) 791 DrawEdge (hdc, &rcArrow, EDGE_RAISED, 792 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); 793 } 794 795 if (hasDropDownArrow) 796 { 797 TOOLBAR_DrawArrow(hdc, rcArrow.left+1, rcArrow.top+1, COLOR_3DHIGHLIGHT); 798 TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top, COLOR_3DSHADOW); 799 } 800 801 if (!TOOLBAR_DrawImageList (infoPtr, btnPtr, himlDis, 802 hdc, rcBitmap.left, rcBitmap.top, 803 ILD_NORMAL)) 804 TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rcBitmap.left, rcBitmap.top); 805 806 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState, dwStyle, &rcText, lpText, &tbcd); 807 goto FINALNOTIFY; 808 } 809 810 /* pressed TBSTYLE_BUTTON */ 811 if (btnPtr->fsState & TBSTATE_PRESSED) { 812 offset = (infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1; 813 if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) 814 { 815 if (dwStyle & TBSTYLE_FLAT) 816 { 817 DrawEdge (hdc, &rc, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST); 818 if (hasDropDownArrow) 819 DrawEdge (hdc, &rcArrow, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST); 820 } 821 else 822 { 823 DrawEdge (hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST); 824 if (hasDropDownArrow) 825 DrawEdge (hdc, &rcArrow, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST); 826 } 827 } 828 829 if (hasDropDownArrow) 830 TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top, COLOR_WINDOWFRAME); 831 832 TOOLBAR_DrawImageList (infoPtr, btnPtr, himlDef, 833 hdc, rcBitmap.left+offset, rcBitmap.top+offset, 834 ILD_NORMAL); 835 836 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState, dwStyle, &rcText, lpText, &tbcd); 837 goto FINALNOTIFY; 838 } 839 840 /* checked TBSTYLE_CHECK */ 841 if ((btnPtr->fsStyle & TBSTYLE_CHECK) && 842 (btnPtr->fsState & TBSTATE_CHECKED)) { 843 if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) 844 { 845 if (dwStyle & TBSTYLE_FLAT) 846 DrawEdge (hdc, &rc, BDR_SUNKENOUTER, 847 BF_RECT | BF_ADJUST); 848 else 849 DrawEdge (hdc, &rc, EDGE_SUNKEN, 850 BF_RECT | BF_MIDDLE | BF_ADJUST); 851 } 852 853 TOOLBAR_DrawPattern (hdc, &rc); 854 855 TOOLBAR_DrawImageList (infoPtr, btnPtr, himlDef, 856 hdc, rcBitmap.left+1, rcBitmap.top+1, 857 ILD_NORMAL); 858 859 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState, dwStyle, &rcText, lpText, &tbcd); 860 goto FINALNOTIFY; 861 } 862 863 /* indeterminate */ 864 if (btnPtr->fsState & TBSTATE_INDETERMINATE) { 865 if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) 866 DrawEdge (hdc, &rc, EDGE_RAISED, 867 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); 868 869 TOOLBAR_DrawPattern (hdc, &rc); 870 TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rcBitmap.left, rcBitmap.top); 871 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState, dwStyle, &rcText, lpText, &tbcd); 872 goto FINALNOTIFY; 873 } 874 875 /* normal state */ 876 if (dwStyle & TBSTYLE_FLAT) 991 877 { 992 if ( infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK ) 993 { 994 COLORREF oldclr; 995 996 oldclr = SetBkColor(hdc, tbcd.clrHighlightHotTrack); 997 ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, 0); 878 if (btnPtr->bHot) 879 { 880 if ( infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK ) 881 { 882 COLORREF oldclr; 883 884 oldclr = SetBkColor(hdc, tbcd.clrHighlightHotTrack); 885 ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, 0); 886 if (hasDropDownArrow) 887 ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rcArrow, NULL, 0, 0); 888 SetBkColor(hdc, oldclr); 889 } 890 else 891 { 892 if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) 893 { 894 DrawEdge (hdc, &rc, BDR_RAISEDINNER, BF_RECT); 895 if (hasDropDownArrow) 896 DrawEdge (hdc, &rcArrow, BDR_RAISEDINNER, BF_RECT); 897 } 898 } 899 } 900 #if 1 901 else /* The following code needs to be removed after 902 * "hot item" support has been implemented for the 903 * case where it is being de-selected. 904 */ 905 { 906 FrameRect(hdc, &rc, GetSysColorBrush(COLOR_BTNFACE)); 998 907 if (hasDropDownArrow) 999 ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rcArrow, NULL, 0, 0); 1000 SetBkColor(hdc, oldclr); 1001 } 1002 } 1003 1004 TOOLBAR_DrawFrame(infoPtr, dwStyle & TBSTYLE_FLAT, &tbcd); 1005 1006 if (drawSepDropDownArrow) 1007 TOOLBAR_DrawSepDDArrow(infoPtr, dwStyle & TBSTYLE_FLAT, &tbcd, &rcArrow); 1008 1009 if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) 1010 TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); 1011 1012 TOOLBAR_DrawImage(infoPtr, btnPtr, rcBitmap.left, rcBitmap.top, &tbcd); 1013 1014 if (hasDropDownArrow && !drawSepDropDownArrow) 908 FrameRect(hdc, &rcArrow, GetSysColorBrush(COLOR_BTNFACE)); 909 } 910 #endif 911 912 if (hasDropDownArrow) 913 TOOLBAR_DrawArrow(hdc, rcArrow.left+1, rcArrow.top, COLOR_WINDOWFRAME); 914 915 if (btnPtr->bHot) { 916 HIMAGELIST himlHot = GETHOTIMAGELIST(infoPtr, 917 GETHIMLID(infoPtr, btnPtr->iBitmap)); 918 /* if hot, attempt to draw with himlHot, if fails, use himlDef */ 919 if (!TOOLBAR_DrawImageList (infoPtr, btnPtr, 920 himlHot, 921 hdc, rcBitmap.left, 922 rcBitmap.top, ILD_NORMAL)) 923 TOOLBAR_DrawImageList (infoPtr, btnPtr, himlDef, 924 hdc, rcBitmap.left, rcBitmap.top, 925 ILD_NORMAL); 926 } 927 else 928 TOOLBAR_DrawImageList (infoPtr, btnPtr, himlDef, 929 hdc, rcBitmap.left, rcBitmap.top, 930 ILD_NORMAL); 931 } 932 else 1015 933 { 1016 if (tbcd.nmcd.uItemState & (CDIS_DISABLED | CDIS_INDETERMINATE)) 1017 { 1018 TOOLBAR_DrawArrow(hdc, rcArrow.left+1, rcArrow.top+1 + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnHighlight); 1019 TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clr3dShadow); 1020 } 1021 else if (tbcd.nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED)) 1022 { 1023 offset = (infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1; 1024 TOOLBAR_DrawArrow(hdc, rcArrow.left + offset, rcArrow.top + offset + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnText); 1025 } 1026 else 1027 TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnText); 1028 } 1029 1030 FINALNOTIFY: 934 if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) 935 DrawEdge (hdc, &rc, EDGE_RAISED, 936 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); 937 938 if (hasDropDownArrow) 939 { 940 if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) 941 DrawEdge (hdc, &rcArrow, EDGE_RAISED, 942 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); 943 TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top, COLOR_WINDOWFRAME); 944 } 945 946 TOOLBAR_DrawImageList (infoPtr, btnPtr, himlDef, 947 hdc, rcBitmap.left, rcBitmap.top, 948 ILD_NORMAL);} 949 950 951 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState, dwStyle, &rcText, lpText, &tbcd); 952 953 FINALNOTIFY: 1031 954 if (infoPtr->dwItemCustDraw & CDRF_NOTIFYPOSTPAINT) 1032 955 { … … 1052 975 TBUTTON_INFO *btnPtr; 1053 976 INT i, oldBKmode = 0; 1054 RECT rcTemp , rcClient;977 RECT rcTemp; 1055 978 NMTBCUSTOMDRAW tbcd; 1056 979 DWORD ntfret; 1057 1058 /* the app has told us not to redraw the toolbar */1059 if (!infoPtr->bDoRedraw)1060 return;1061 980 1062 981 /* if imagelist belongs to the app, it can be changed … … 1082 1001 oldBKmode = SetBkMode (hdc, TRANSPARENT); 1083 1002 1084 GetClientRect(hwnd, &rcClient);1085 1086 1003 /* redraw necessary buttons */ 1087 1004 btnPtr = infoPtr->buttons; 1088 1005 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) 1089 1006 { 1090 BOOL bDraw; 1091 if (infoPtr->dwExStyle & TBSTYLE_EX_HIDECLIPPEDBUTTONS) 1092 { 1093 IntersectRect(&rcTemp, &rcClient, &btnPtr->rect); 1094 bDraw = EqualRect(&rcTemp, &btnPtr->rect); 1095 } 1096 else 1097 bDraw = TRUE; 1098 bDraw &= IntersectRect(&rcTemp, &(ps->rcPaint), &(btnPtr->rect)); 1099 bDraw = (btnPtr->fsState & TBSTATE_HIDDEN) ? FALSE : bDraw; 1100 if (bDraw) 1007 if(IntersectRect(&rcTemp, &(ps->rcPaint), &(btnPtr->rect))) 1101 1008 TOOLBAR_DrawButton (hwnd, btnPtr, hdc); 1102 1009 } … … 1125 1032 * indicates where the underline goes, except for the string "&&" which 1126 1033 * is reduced to a single "&". GetTextExtentPoint does not process these 1127 * only DrawText does. Note that the BTNS_NOPREFIX is handled here.1034 * only DrawText does. Note that the TBSTYLE_NOPREFIX is handled here. 1128 1035 */ 1129 1036 static void … … 1136 1043 lpSize->cy = 0; 1137 1044 1138 if (infoPtr->nMaxTextRows > 0 && 1139 !(btnPtr->fsState & TBSTATE_HIDDEN) && 1140 (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || 1141 (btnPtr->fsStyle & BTNS_SHOWTEXT)) ) 1045 if (!(btnPtr->fsState & TBSTATE_HIDDEN) ) 1142 1046 { 1143 1047 LPWSTR lpText = TOOLBAR_GetText(infoPtr, btnPtr); … … 1154 1058 /* Use DrawText to get true size as drawn (less pesky "&") */ 1155 1059 DrawTextW (hdc, lpText, -1, &myrect, DT_VCENTER | DT_SINGLELINE | 1156 DT_CALCRECT | ((btnPtr->fsStyle & BTNS_NOPREFIX) ?1060 DT_CALCRECT | ((btnPtr->fsStyle & TBSTYLE_NOPREFIX) ? 1157 1061 DT_NOPREFIX : 0)); 1158 1062 … … 1184 1088 lpSize->cx = 0; 1185 1089 lpSize->cy = 0; 1186 1187 if(infoPtr->nMaxTextRows == 0)1188 return;1189 1090 1190 1091 hdc = GetDC (hwnd); … … 1212 1113 * TOOLBAR_WrapToolbar 1213 1114 * 1214 * This function walks through the buttons and sep arators in the1115 * This function walks through the buttons and seperators in the 1215 1116 * toolbar, and sets the TBSTATE_WRAP flag only on those items where 1216 1117 * wrapping should occur based on the width of the toolbar window. … … 1266 1167 /* custom controls in toolbars. */ 1267 1168 /* */ 1268 /* BTNS_DROPDOWN separators are treated as buttons for */1169 /* TBSTYLE_DROPDOWN separators are treated as buttons for */ 1269 1170 /* width. - GA 8/01 */ 1270 if ((btnPtr[i].fsStyle & BTNS_SEP) &&1271 !(btnPtr[i].fsStyle & BTNS_DROPDOWN))1171 if ((btnPtr[i].fsStyle & TBSTYLE_SEP) && 1172 !(btnPtr[i].fsStyle & TBSTYLE_DROPDOWN)) 1272 1173 cx = (btnPtr[i].iBitmap > 0) ? 1273 1174 btnPtr[i].iBitmap : SEPARATOR_WIDTH; … … 1279 1180 /* next row if the previous wrapping is on a button. */ 1280 1181 if( bButtonWrap && 1281 (btnPtr[i].fsStyle & BTNS_SEP) &&1182 (btnPtr[i].fsStyle & TBSTYLE_SEP) && 1282 1183 (i + 1 < infoPtr->nNumButtons ) && 1283 (btnPtr[i + 1].fsStyle & BTNS_SEP) )1184 (btnPtr[i + 1].fsStyle & TBSTYLE_SEP) ) 1284 1185 { 1285 1186 TRACE("wrap point 1 btn %d style %02x\n", i, btnPtr[i].fsStyle); … … 1303 1204 /* go to the next until it reaches a non separator. */ 1304 1205 /* Wrap the last separator if it is before a button. */ 1305 while( ( ((btnPtr[i].fsStyle & BTNS_SEP) &&1306 !(btnPtr[i].fsStyle & BTNS_DROPDOWN)) ||1206 while( ( ((btnPtr[i].fsStyle & TBSTYLE_SEP) && 1207 !(btnPtr[i].fsStyle & TBSTYLE_DROPDOWN)) || 1307 1208 (btnPtr[i].fsState & TBSTATE_HIDDEN) ) && 1308 1209 i < infoPtr->nNumButtons ) … … 1329 1230 for ( j = i - 1; j >= 0 && !(btnPtr[j].fsState & TBSTATE_WRAP); j--) 1330 1231 { 1331 if ((btnPtr[j].fsStyle & BTNS_SEP) &&1232 if ((btnPtr[j].fsStyle & TBSTYLE_SEP) && 1332 1233 !(btnPtr[j].fsState & TBSTATE_HIDDEN)) 1333 1234 { … … 1372 1273 bFound = TRUE; 1373 1274 x = infoPtr->nIndent; 1374 if (btnPtr[i].fsStyle & BTNS_SEP )1275 if (btnPtr[i].fsStyle & TBSTYLE_SEP ) 1375 1276 bButtonWrap = FALSE; 1376 1277 else … … 1413 1314 TOOLBAR_CalcStrings (hwnd, &sizeString); 1414 1315 1415 TOOLBAR_DumpToolbar (infoPtr, __LINE__);1416 1417 1316 for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++) 1418 1317 { … … 1425 1324 0, sizeString.cy) + infoPtr->szPadding.cy; 1426 1325 infoPtr->nButtonWidth = ((usesBitmaps) ? infoPtr->nBitmapWidth : 1427 LIST_IMAGE_ABSENT_WIDTH) + sizeString.cx + infoPtr->szPadding.cx; 1428 if (sizeString.cx > 0) 1429 infoPtr->nButtonWidth += TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap) + infoPtr->szPadding.cx/2; 1326 0) + sizeString.cx + 6; 1430 1327 TRACE("LIST style, But w=%d h=%d, useBitmaps=%d, Bit w=%d h=%d\n", 1431 1328 infoPtr->nButtonWidth, infoPtr->nButtonHeight, usesBitmaps, 1432 1329 infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); 1330 TOOLBAR_DumpToolbar (infoPtr, __LINE__); 1433 1331 } 1434 1332 else { … … 1437 1335 if (usesBitmaps) 1438 1336 infoPtr->nButtonHeight = sizeString.cy + 1439 infoPtr->szPadding.cy/2 + /* this is the space to separate text from bitmap */1440 infoPtr->nBitmapHeight + infoPtr->szPadding.cy;1337 2 + /* this is the space to separate text from bitmap */ 1338 infoPtr->nBitmapHeight + 6; 1441 1339 else 1442 infoPtr->nButtonHeight = sizeString.cy + infoPtr->szPadding.cy;1340 infoPtr->nButtonHeight = sizeString.cy + 6; 1443 1341 } 1444 else 1445 infoPtr->nButtonHeight = infoPtr->nBitmapHeight + infoPtr->szPadding.cy;1342 else if (infoPtr->nButtonHeight < infoPtr->nBitmapHeight + 6) 1343 infoPtr->nButtonHeight = infoPtr->nBitmapHeight + 6; 1446 1344 1447 1345 if (sizeString.cx > infoPtr->nBitmapWidth) 1448 infoPtr->nButtonWidth = sizeString.cx + infoPtr->szPadding.cx;1449 else 1450 infoPtr->nButtonWidth = infoPtr->nBitmapWidth + infoPtr->szPadding.cx;1346 infoPtr->nButtonWidth = sizeString.cx + 6; 1347 else if (infoPtr->nButtonWidth < infoPtr->nBitmapWidth + 6) 1348 infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6; 1451 1349 } 1452 1350 … … 1461 1359 y = 0; 1462 1360 1361 /* 1362 * We will set the height below, and we set the width on entry 1363 * so we do not reset them here.. 1364 */ 1365 #if 0 1366 GetClientRect( hwnd, &rc ); 1367 /* get initial values for toolbar */ 1368 infoPtr->nWidth = rc.right - rc.left; 1369 infoPtr->nHeight = rc.bottom - rc.top; 1370 #endif 1371 1463 1372 /* from above, minimum is a button, and possible text */ 1464 1373 cx = infoPtr->nButtonWidth; … … 1478 1387 1479 1388 btnPtr = infoPtr->buttons; 1389 1390 /* do not base height/width on parent, if the parent is a */ 1391 /* rebar control it could have multiple rows of toolbars */ 1392 /* GetClientRect( GetParent(hwnd), &rc ); */ 1393 /* cx = rc.right - rc.left; */ 1394 /* cy = rc.bottom - rc.top; */ 1480 1395 1481 1396 TRACE("cy=%d\n", cy); … … 1495 1410 /* it is the actual width of the separator. This is used for */ 1496 1411 /* custom controls in toolbars. */ 1497 if (btnPtr->fsStyle & BTNS_SEP) {1498 if (btnPtr->fsStyle & BTNS_DROPDOWN) {1412 if (btnPtr->fsStyle & TBSTYLE_SEP) { 1413 if (btnPtr->fsStyle & TBSTYLE_DROPDOWN) { 1499 1414 cy = (btnPtr->iBitmap > 0) ? 1500 1415 btnPtr->iBitmap : SEPARATOR_WIDTH; … … 1507 1422 else 1508 1423 { 1509 if ((infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || 1510 (btnPtr->fsStyle & BTNS_AUTOSIZE)) 1424 if (btnPtr->fsStyle & TBSTYLE_AUTOSIZE) 1511 1425 { 1512 1426 SIZE sz; … … 1522 1436 ReleaseDC (hwnd, hdc); 1523 1437 1524 /* add space on for button frame, etc */ 1525 cx = sz.cx + infoPtr->szPadding.cx; 1526 1527 /* add list padding */ 1528 if ((dwStyle & TBSTYLE_LIST) && sz.cx > 0) 1529 cx += TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap) + infoPtr->szPadding.cx/2; 1530 1531 if (TOOLBAR_TestImageExist (infoPtr, btnPtr, GETDEFIMAGELIST(infoPtr,0))) 1532 { 1533 if (dwStyle & TBSTYLE_LIST) 1534 cx += infoPtr->nBitmapWidth; 1535 else if (cx < (infoPtr->nBitmapWidth+infoPtr->szPadding.cx)) 1536 cx = infoPtr->nBitmapWidth+infoPtr->szPadding.cx; 1537 } 1538 else if (dwStyle & TBSTYLE_LIST) 1539 cx += LIST_IMAGE_ABSENT_WIDTH; 1438 /* Fudge amount measured against IE4 "menu" and "Links" */ 1439 /* toolbars with native control (v4.71). - GA 8/01 */ 1440 cx = sz.cx + 6 + 5 + 5; 1441 if ((dwStyle & TBSTYLE_LIST) && 1442 (TOOLBAR_TestImageExist (infoPtr, btnPtr, GETDEFIMAGELIST(infoPtr,0)))) 1443 cx += infoPtr->nBitmapWidth; 1540 1444 } 1541 1445 else 1542 1446 cx = infoPtr->nButtonWidth; 1543 1447 1544 if ( (hasDropDownArrows && (btnPtr->fsStyle & BTNS_DROPDOWN)) || (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN))1448 if (hasDropDownArrows && (btnPtr->fsStyle & TBSTYLE_DROPDOWN)) 1545 1449 cx += DDARROW_WIDTH; 1546 1450 } … … 1558 1462 1559 1463 /* Set the toolTip only for non-hidden, non-separator button */ 1560 if (infoPtr->hwndToolTip && !(btnPtr->fsStyle & BTNS_SEP ))1464 if (infoPtr->hwndToolTip && !(btnPtr->fsStyle & TBSTYLE_SEP )) 1561 1465 { 1562 1466 TTTOOLINFOA ti; … … 1581 1485 if( bWrap ) 1582 1486 { 1583 if ( !(btnPtr->fsStyle & BTNS_SEP) )1487 if ( !(btnPtr->fsStyle & TBSTYLE_SEP) ) 1584 1488 y += cy; 1585 1489 else … … 1588 1492 /* it is the actual width of the separator. This is used for */ 1589 1493 /* custom controls in toolbars. */ 1590 if ( !(btnPtr->fsStyle & BTNS_DROPDOWN))1494 if ( !(btnPtr->fsStyle & TBSTYLE_DROPDOWN)) 1591 1495 y += cy + ( (btnPtr->iBitmap > 0 ) ? 1592 1496 btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 /3; … … 1648 1552 continue; 1649 1553 1650 if (btnPtr->fsStyle & BTNS_SEP) {1554 if (btnPtr->fsStyle & TBSTYLE_SEP) { 1651 1555 if (PtInRect (&btnPtr->rect, *lpPt)) { 1652 1556 TRACE(" ON SEPARATOR %d!\n", i); … … 1701 1605 /* check index button */ 1702 1606 btnPtr = &infoPtr->buttons[nIndex]; 1703 if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) {1607 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) { 1704 1608 if (btnPtr->fsState & TBSTATE_CHECKED) 1705 1609 return nIndex; … … 1710 1614 while (nRunIndex >= 0) { 1711 1615 btnPtr = &infoPtr->buttons[nRunIndex]; 1712 if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) {1616 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) { 1713 1617 if (btnPtr->fsState & TBSTATE_CHECKED) 1714 1618 return nRunIndex; … … 1723 1627 while (nRunIndex < infoPtr->nNumButtons) { 1724 1628 btnPtr = &infoPtr->buttons[nRunIndex]; 1725 if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) {1629 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) { 1726 1630 if (btnPtr->fsState & TBSTATE_CHECKED) 1727 1631 return nRunIndex; … … 1786 1690 return FALSE; 1787 1691 1788 /* UNDOCUMENTED: dialog hwnd immediately follows NMHDR */1789 nmtb.iItem = (int)hwnd;1790 1692 /* Send TBN_INITCUSTOMIZE notification */ 1791 1693 if (TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, TBN_INITCUSTOMIZE) == 1792 1694 TBNRF_HIDEHELP) 1793 1695 { 1794 TRACE("TBNRF_HIDEHELP requested\n"); 1795 ShowWindow(GetDlgItem(hwnd, IDC_HELP_BTN), SW_HIDE); 1696 FIXME("TBNRF_HIDEHELP not supported\n"); 1796 1697 } 1797 1698 … … 1799 1700 for (i = 0; i < custInfo->tbInfo->nNumButtons; i++) 1800 1701 { 1801 btnInfo = (PCUSTOMBUTTON) Alloc(sizeof(CUSTOMBUTTON));1702 btnInfo = (PCUSTOMBUTTON)COMCTL32_Alloc(sizeof(CUSTOMBUTTON)); 1802 1703 memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); 1803 btnInfo->btn.fsStyle = BTNS_SEP;1704 btnInfo->btn.fsStyle = TBSTYLE_SEP; 1804 1705 btnInfo->bVirtual = FALSE; 1805 1706 LoadStringW (COMCTL32_hModule, IDS_SEPARATOR, btnInfo->text, 64); … … 1813 1714 1814 1715 /* insert separator button into 'available buttons' list */ 1815 btnInfo = (PCUSTOMBUTTON) Alloc(sizeof(CUSTOMBUTTON));1716 btnInfo = (PCUSTOMBUTTON)COMCTL32_Alloc(sizeof(CUSTOMBUTTON)); 1816 1717 memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); 1817 btnInfo->btn.fsStyle = BTNS_SEP;1718 btnInfo->btn.fsStyle = TBSTYLE_SEP; 1818 1719 btnInfo->bVirtual = FALSE; 1819 1720 btnInfo->bRemovable = TRUE; … … 1848 1749 if (index == -1) 1849 1750 { 1850 btnInfo = (PCUSTOMBUTTON) Alloc(sizeof(CUSTOMBUTTON));1751 btnInfo = (PCUSTOMBUTTON)COMCTL32_Alloc(sizeof(CUSTOMBUTTON)); 1851 1752 btnInfo->bVirtual = FALSE; 1852 1753 btnInfo->bRemovable = TRUE; … … 1863 1764 1864 1765 memcpy (&btnInfo->btn, &nmtb.tbButton, sizeof(TBBUTTON)); 1865 if (!(nmtb.tbButton.fsStyle & BTNS_SEP))1766 if (!(nmtb.tbButton.fsStyle & TBSTYLE_SEP)) 1866 1767 { 1867 1768 if (lstrlenW(nmtb.pszText)) … … 1880 1781 1881 1782 /* append 'virtual' separator button to the 'toolbar buttons' list */ 1882 btnInfo = (PCUSTOMBUTTON) Alloc(sizeof(CUSTOMBUTTON));1783 btnInfo = (PCUSTOMBUTTON)COMCTL32_Alloc(sizeof(CUSTOMBUTTON)); 1883 1784 memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); 1884 btnInfo->btn.fsStyle = BTNS_SEP;1785 btnInfo->btn.fsStyle = TBSTYLE_SEP; 1885 1786 btnInfo->bVirtual = TRUE; 1886 1787 btnInfo->bRemovable = FALSE; … … 2052 1953 2053 1954 /* insert into 'available button' list */ 2054 if (!(btnInfo->btn.fsStyle & BTNS_SEP))1955 if (!(btnInfo->btn.fsStyle & TBSTYLE_SEP)) 2055 1956 { 2056 1957 index = (int)SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_ADDSTRING, 0, 0); … … 2058 1959 } 2059 1960 else 2060 Free (btnInfo);1961 COMCTL32_Free (btnInfo); 2061 1962 } 2062 1963 } 2063 1964 break; 2064 case IDC_HELP_BTN:2065 TOOLBAR_SendNotify(&nmtb.hdr, infoPtr, TBN_CUSTHELP);2066 break;2067 case IDC_RESET_BTN:2068 TOOLBAR_SendNotify(&nmtb.hdr, infoPtr, TBN_RESET);2069 break;2070 1965 2071 1966 case IDOK: /* Add button */ … … 2099 1994 2100 1995 /* duplicate 'separator' button */ 2101 btnNew = (PCUSTOMBUTTON) Alloc (sizeof(CUSTOMBUTTON));1996 btnNew = (PCUSTOMBUTTON)COMCTL32_Alloc (sizeof(CUSTOMBUTTON)); 2102 1997 memcpy (btnNew, btnInfo, sizeof(CUSTOMBUTTON)); 2103 1998 btnInfo = btnNew; … … 2130 2025 { 2131 2026 btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, i, 0); 2132 Free(btnInfo);2027 COMCTL32_Free(btnInfo); 2133 2028 SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, 0, 0); 2134 2029 } … … 2141 2036 { 2142 2037 btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_GETITEMDATA, i, 0); 2143 Free(btnInfo);2038 COMCTL32_Free(btnInfo); 2144 2039 SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMDATA, i, 0); 2145 2040 } … … 2199 2094 2200 2095 /* draw image and text */ 2201 if ((btnInfo->btn.fsStyle & BTNS_SEP) == 0) {2096 if ((btnInfo->btn.fsStyle & TBSTYLE_SEP) == 0) { 2202 2097 HIMAGELIST himl = GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr, 2203 2098 btnInfo->btn.iBitmap)); … … 2304 2199 TRACE ("creating default image list!\n"); 2305 2200 2306 himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight,2307 ILC_COLORDDB| ILC_MASK, nButtons, 2);2201 himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, 2202 ILC_COLOR | ILC_MASK, nButtons, 2); 2308 2203 TOOLBAR_InsertImageList(&infoPtr->himlDef, &infoPtr->cimlDef, himlDef, 0); 2309 2204 infoPtr->himlInt = himlDef; 2310 2205 } 2311 2206 else { … … 2349 2244 DeleteDC (hdcBitmap); 2350 2245 2351 nIndex = ImageList_AddMasked (himlDef, hbmLoad, comctl32_color.clrBtnFace);2246 nIndex = ImageList_AddMasked (himlDef, hbmLoad, CLR_DEFAULT); 2352 2247 DeleteObject (hbmLoad); 2353 2248 } … … 2361 2256 MAKEINTRESOURCEA(IDB_STD_SMALL)); 2362 2257 nIndex = ImageList_AddMasked (himlDef, 2363 hbmLoad, comctl32_color.clrBtnFace);2258 hbmLoad, CLR_DEFAULT); 2364 2259 DeleteObject (hbmLoad); 2365 2260 break; … … 2369 2264 MAKEINTRESOURCEA(IDB_STD_LARGE)); 2370 2265 nIndex = ImageList_AddMasked (himlDef, 2371 hbmLoad, comctl32_color.clrBtnFace);2266 hbmLoad, CLR_DEFAULT); 2372 2267 DeleteObject (hbmLoad); 2373 2268 break; … … 2377 2272 MAKEINTRESOURCEA(IDB_VIEW_SMALL)); 2378 2273 nIndex = ImageList_AddMasked (himlDef, 2379 hbmLoad, comctl32_color.clrBtnFace);2274 hbmLoad, CLR_DEFAULT); 2380 2275 DeleteObject (hbmLoad); 2381 2276 break; … … 2385 2280 MAKEINTRESOURCEA(IDB_VIEW_LARGE)); 2386 2281 nIndex = ImageList_AddMasked (himlDef, 2387 hbmLoad, comctl32_color.clrBtnFace);2282 hbmLoad, CLR_DEFAULT); 2388 2283 DeleteObject (hbmLoad); 2389 2284 break; … … 2393 2288 MAKEINTRESOURCEA(IDB_HIST_SMALL)); 2394 2289 nIndex = ImageList_AddMasked (himlDef, 2395 hbmLoad, comctl32_color.clrBtnFace);2290 hbmLoad, CLR_DEFAULT); 2396 2291 DeleteObject (hbmLoad); 2397 2292 break; … … 2401 2296 MAKEINTRESOURCEA(IDB_HIST_LARGE)); 2402 2297 nIndex = ImageList_AddMasked (himlDef, 2403 hbmLoad, comctl32_color.clrBtnFace);2298 hbmLoad, CLR_DEFAULT); 2404 2299 DeleteObject (hbmLoad); 2405 2300 break; … … 2414 2309 { 2415 2310 hbmLoad = LoadBitmapA (lpAddBmp->hInst, (LPSTR)lpAddBmp->nID); 2416 nIndex = ImageList_AddMasked (himlDef, hbmLoad, comctl32_color.clrBtnFace);2311 nIndex = ImageList_AddMasked (himlDef, hbmLoad, CLR_DEFAULT); 2417 2312 DeleteObject (hbmLoad); 2418 2313 } … … 2422 2317 if (infoPtr->nNumBitmapInfos == 0) 2423 2318 { 2424 infoPtr->bitmaps = Alloc(sizeof(TBITMAP_INFO));2319 infoPtr->bitmaps = COMCTL32_Alloc(sizeof(TBITMAP_INFO)); 2425 2320 } 2426 2321 else 2427 2322 { 2428 2323 TBITMAP_INFO *oldBitmaps = infoPtr->bitmaps; 2429 infoPtr->bitmaps = Alloc((infoPtr->nNumBitmapInfos + 1) * sizeof(TBITMAP_INFO));2324 infoPtr->bitmaps = COMCTL32_Alloc((infoPtr->nNumBitmapInfos + 1) * sizeof(TBITMAP_INFO)); 2430 2325 memcpy(&infoPtr->bitmaps[0], &oldBitmaps[0], infoPtr->nNumBitmapInfos); 2431 2326 } … … 2454 2349 } 2455 2350 2456 InvalidateRect(hwnd, NULL, TRUE);2351 InvalidateRect(hwnd, NULL, FALSE); 2457 2352 2458 2353 return nIndex; … … 2475 2370 if (infoPtr->nNumButtons == 0) { 2476 2371 infoPtr->buttons = 2477 Alloc (sizeof(TBUTTON_INFO) * nNewButtons);2372 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons); 2478 2373 } 2479 2374 else { 2480 2375 TBUTTON_INFO *oldButtons = infoPtr->buttons; 2481 2376 infoPtr->buttons = 2482 Alloc (sizeof(TBUTTON_INFO) * nNewButtons);2377 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons); 2483 2378 memcpy (&infoPtr->buttons[0], &oldButtons[0], 2484 2379 nOldButtons * sizeof(TBUTTON_INFO)); 2485 Free (oldButtons);2380 COMCTL32_Free (oldButtons); 2486 2381 } 2487 2382 … … 2496 2391 btnPtr->fsStyle = lpTbb[nCount].fsStyle; 2497 2392 btnPtr->dwData = lpTbb[nCount].dwData; 2498 if(HIWORD(lpTbb[nCount].iString) && lpTbb[nCount].iString != -1) 2499 Str_SetPtrAtoW ((LPWSTR*)&btnPtr->iString, (LPSTR)lpTbb[nCount].iString ); 2500 else 2501 btnPtr->iString = lpTbb[nCount].iString; 2393 btnPtr->iString = lpTbb[nCount].iString; 2502 2394 btnPtr->bHot = FALSE; 2503 2395 2504 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & BTNS_SEP)) {2396 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) { 2505 2397 TTTOOLINFOA ti; 2506 2398 … … 2521 2413 TOOLBAR_DumpToolbar (infoPtr, __LINE__); 2522 2414 2523 InvalidateRect(hwnd, NULL, TRUE);2415 InvalidateRect(hwnd, NULL, FALSE); 2524 2416 2525 2417 return TRUE; … … 2542 2434 if (infoPtr->nNumButtons == 0) { 2543 2435 infoPtr->buttons = 2544 Alloc (sizeof(TBUTTON_INFO) * nNewButtons);2436 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons); 2545 2437 } 2546 2438 else { 2547 2439 TBUTTON_INFO *oldButtons = infoPtr->buttons; 2548 2440 infoPtr->buttons = 2549 Alloc (sizeof(TBUTTON_INFO) * nNewButtons);2441 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons); 2550 2442 memcpy (&infoPtr->buttons[0], &oldButtons[0], 2551 2443 nOldButtons * sizeof(TBUTTON_INFO)); 2552 Free (oldButtons);2444 COMCTL32_Free (oldButtons); 2553 2445 } 2554 2446 … … 2563 2455 btnPtr->fsStyle = lpTbb[nCount].fsStyle; 2564 2456 btnPtr->dwData = lpTbb[nCount].dwData; 2565 if(HIWORD(lpTbb[nCount].iString) && lpTbb[nCount].iString != -1) 2566 Str_SetPtrW ((LPWSTR*)&btnPtr->iString, (LPWSTR)lpTbb[nCount].iString ); 2567 else 2568 btnPtr->iString = lpTbb[nCount].iString; 2457 btnPtr->iString = lpTbb[nCount].iString; 2569 2458 btnPtr->bHot = FALSE; 2570 2459 2571 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & BTNS_SEP)) {2460 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) { 2572 2461 TTTOOLINFOW ti; 2573 2462 … … 2589 2478 TOOLBAR_DumpToolbar (infoPtr, __LINE__); 2590 2479 2591 InvalidateRect(hwnd, NULL, TRUE);2480 InvalidateRect(hwnd, NULL, FALSE); 2592 2481 2593 2482 return TRUE; … … 2613 2502 if (infoPtr->nNumStrings == 0) { 2614 2503 infoPtr->strings = 2615 Alloc (sizeof(LPWSTR));2504 COMCTL32_Alloc (sizeof(LPWSTR)); 2616 2505 } 2617 2506 else { 2618 2507 LPWSTR *oldStrings = infoPtr->strings; 2619 2508 infoPtr->strings = 2620 Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2509 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2621 2510 memcpy (&infoPtr->strings[0], &oldStrings[0], 2622 2511 sizeof(LPWSTR) * infoPtr->nNumStrings); 2623 Free (oldStrings);2624 } 2625 2626 /* Alloc zeros out the allocated memory*/2512 COMCTL32_Free (oldStrings); 2513 } 2514 2515 /*COMCTL32_Alloc zeros out the allocated memory*/ 2627 2516 Str_SetPtrAtoW (&infoPtr->strings[infoPtr->nNumStrings], szString ); 2628 2517 infoPtr->nNumStrings++; … … 2643 2532 if (infoPtr->nNumStrings == 0) { 2644 2533 infoPtr->strings = 2645 Alloc (sizeof(LPWSTR));2534 COMCTL32_Alloc (sizeof(LPWSTR)); 2646 2535 } 2647 2536 else { 2648 2537 LPWSTR *oldStrings = infoPtr->strings; 2649 2538 infoPtr->strings = 2650 Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2539 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2651 2540 memcpy (&infoPtr->strings[0], &oldStrings[0], 2652 2541 sizeof(LPWSTR) * infoPtr->nNumStrings); 2653 Free (oldStrings);2542 COMCTL32_Free (oldStrings); 2654 2543 } 2655 2544 … … 2691 2580 2692 2581 if (infoPtr->nNumStrings == 0) { 2693 infoPtr->strings = Alloc (sizeof(LPWSTR));2582 infoPtr->strings = COMCTL32_Alloc (sizeof(LPWSTR)); 2694 2583 } 2695 2584 else 2696 2585 { 2697 2586 LPWSTR *oldStrings = infoPtr->strings; 2698 infoPtr->strings = Alloc(sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2587 infoPtr->strings = COMCTL32_Alloc(sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2699 2588 memcpy(&infoPtr->strings[0], &oldStrings[0], 2700 2589 sizeof(LPWSTR) * infoPtr->nNumStrings); 2701 Free(oldStrings);2590 COMCTL32_Free(oldStrings); 2702 2591 } 2703 2592 2704 np= strchrW (p,'|');2593 np=COMCTL32_StrChrW (p, L'|'); 2705 2594 if (np!=NULL) { 2706 2595 len = np - p; … … 2712 2601 TRACE("len=%d %s\n", len, debugstr_w(p)); 2713 2602 infoPtr->strings[infoPtr->nNumStrings] = 2714 Alloc (sizeof(WCHAR)*(len+1));2603 COMCTL32_Alloc (sizeof(WCHAR)*(len+1)); 2715 2604 lstrcpynW (infoPtr->strings[infoPtr->nNumStrings], p, len+1); 2716 2605 infoPtr->nNumStrings++; … … 2724 2613 if (infoPtr->nNumStrings == 0) { 2725 2614 infoPtr->strings = 2726 Alloc (sizeof(LPWSTR));2615 COMCTL32_Alloc (sizeof(LPWSTR)); 2727 2616 } 2728 2617 else { 2729 2618 LPWSTR *oldStrings = infoPtr->strings; 2730 2619 infoPtr->strings = 2731 Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2620 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2732 2621 memcpy (&infoPtr->strings[0], &oldStrings[0], 2733 2622 sizeof(LPWSTR) * infoPtr->nNumStrings); 2734 Free (oldStrings);2623 COMCTL32_Free (oldStrings); 2735 2624 } 2736 2625 … … 2753 2642 if (infoPtr->nNumStrings == 0) { 2754 2643 infoPtr->strings = 2755 Alloc (sizeof(LPWSTR));2644 COMCTL32_Alloc (sizeof(LPWSTR)); 2756 2645 } 2757 2646 else { 2758 2647 LPWSTR *oldStrings = infoPtr->strings; 2759 2648 infoPtr->strings = 2760 Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2649 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2761 2650 memcpy (&infoPtr->strings[0], &oldStrings[0], 2762 2651 sizeof(LPWSTR) * infoPtr->nNumStrings); 2763 Free (oldStrings);2652 COMCTL32_Free (oldStrings); 2764 2653 } 2765 2654 … … 2811 2700 cx = infoPtr->nWidth; 2812 2701 2813 if ( (dwStyle & CCS_BOTTOM) ==CCS_NOMOVEY) {2702 if (dwStyle & CCS_NOMOVEY) { 2814 2703 GetWindowRect(hwnd, &window_rect); 2815 2704 ScreenToClient(parent, (LPPOINT)&window_rect.left); 2816 2705 y = window_rect.top; 2817 2706 } 2818 if ((dwStyle & CCS_BOTTOM) == CCS_BOTTOM) {2819 GetWindowRect(hwnd, &window_rect);2820 y = parent_rect.bottom - ( window_rect.bottom - window_rect.top);2821 }2822 2707 } 2823 2708 … … 2836 2721 2837 2722 infoPtr->bAutoSize = TRUE; 2838 SetWindowPos (hwnd, HWND_TOP, x, y, cx, cy, uPosFlags); 2839 /* The following line makes sure that the infoPtr->bAutoSize is turned off 2840 * after the setwindowpos calls */ 2723 SetWindowPos (hwnd, HWND_TOP, parent_rect.left - x, parent_rect.top - y, 2724 cx, cy, uPosFlags); 2725 /* The following line makes sure that the infoPtr->bAutoSize is turned off after 2726 * the setwindowpos calls */ 2841 2727 infoPtr->bAutoSize = FALSE; 2842 2728 … … 2878 2764 INT nIndex; 2879 2765 2880 TRACE("button %d, iBitmap now %d\n", wParam, LOWORD(lParam));2881 2882 2766 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); 2883 2767 if (nIndex == -1) … … 2905 2789 2906 2790 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); 2907 2908 TRACE("hwnd=%p, btn index=%d, lParam=0x%08lx\n", hwnd, nIndex, lParam);2909 2910 2791 if (nIndex == -1) 2911 2792 return FALSE; 2912 2793 2913 2794 btnPtr = &infoPtr->buttons[nIndex]; 2795 2796 if (!(btnPtr->fsStyle & TBSTYLE_CHECK)) 2797 return FALSE; 2914 2798 2915 2799 bChecked = (btnPtr->fsState & TBSTATE_CHECKED) ? TRUE : FALSE; … … 2918 2802 btnPtr->fsState &= ~TBSTATE_CHECKED; 2919 2803 else { 2920 if (btnPtr->fsStyle & BTNS_GROUP) {2804 if (btnPtr->fsStyle & TBSTYLE_GROUP) { 2921 2805 nOldIndex = 2922 2806 TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, nIndex); … … 2931 2815 if( bChecked != LOWORD(lParam) ) 2932 2816 { 2933 if (nOldIndex != -1) 2934 InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, TRUE); 2817 if (nOldIndex != -1) 2818 { 2819 InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, 2820 TOOLBAR_HasText(infoPtr, &infoPtr->buttons[nOldIndex])); 2821 } 2935 2822 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 2936 2823 } … … 2970 2857 if (!(hRes = FindResourceA (COMCTL32_hModule, 2971 2858 MAKEINTRESOURCEA(IDD_TBCUSTOMIZE), 2972 (LPSTR)RT_DIALOGA)))2859 RT_DIALOGA))) 2973 2860 return FALSE; 2974 2861 … … 3000 2887 3001 2888 if ((infoPtr->hwndToolTip) && 3002 !(infoPtr->buttons[nIndex].fsStyle & BTNS_SEP)) {2889 !(infoPtr->buttons[nIndex].fsStyle & TBSTYLE_SEP)) { 3003 2890 TTTOOLINFOA ti; 3004 2891 … … 3013 2900 if (infoPtr->nNumButtons == 1) { 3014 2901 TRACE(" simple delete!\n"); 3015 Free (infoPtr->buttons);2902 COMCTL32_Free (infoPtr->buttons); 3016 2903 infoPtr->buttons = NULL; 3017 2904 infoPtr->nNumButtons = 0; … … 3022 2909 3023 2910 infoPtr->nNumButtons--; 3024 infoPtr->buttons = Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);2911 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons); 3025 2912 if (nIndex > 0) { 3026 2913 memcpy (&infoPtr->buttons[0], &oldButtons[0], … … 3033 2920 } 3034 2921 3035 Free (oldButtons);2922 COMCTL32_Free (oldButtons); 3036 2923 } 3037 2924 … … 3053 2940 3054 2941 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); 3055 3056 TRACE("hwnd=%p, btn index=%d, lParam=0x%08lx\n", hwnd, wParam, lParam);3057 3058 2942 if (nIndex == -1) 3059 2943 return FALSE; … … 3072 2956 /* redraw the button only if the state of the button changed */ 3073 2957 if(bState != (btnPtr->fsState & TBSTATE_ENABLED)) 3074 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 2958 { 2959 InvalidateRect(hwnd, &btnPtr->rect, 2960 TOOLBAR_HasText(infoPtr, btnPtr)); 2961 } 3075 2962 3076 2963 return TRUE; … … 3160 3047 3161 3048 if (!(btnPtr = &infoPtr->buttons[nIndex])) return -1; 3049 3050 if (lpTbInfo->dwMask & TBIF_COMMAND) 3051 lpTbInfo->idCommand = btnPtr->idCommand; 3052 if (lpTbInfo->dwMask & TBIF_IMAGE) 3053 lpTbInfo->iImage = btnPtr->iBitmap; 3054 if (lpTbInfo->dwMask & TBIF_LPARAM) 3055 lpTbInfo->lParam = btnPtr->dwData; 3056 if (lpTbInfo->dwMask & TBIF_SIZE) 3057 lpTbInfo->cx = (WORD)(btnPtr->rect.right - btnPtr->rect.left); 3058 if (lpTbInfo->dwMask & TBIF_STATE) 3059 lpTbInfo->fsState = btnPtr->fsState; 3060 if (lpTbInfo->dwMask & TBIF_STYLE) 3061 lpTbInfo->fsStyle = btnPtr->fsStyle; 3062 if (lpTbInfo->dwMask & TBIF_TEXT) { 3063 LPWSTR lpText = TOOLBAR_GetText(infoPtr,btnPtr); 3064 Str_GetPtrWtoA (lpText, lpTbInfo->pszText,lpTbInfo->cchText); 3065 } 3066 return nIndex; 3067 } 3068 3069 3070 static LRESULT 3071 TOOLBAR_GetButtonInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam) 3072 { 3073 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 3074 LPTBBUTTONINFOW lpTbInfo = (LPTBBUTTONINFOW)lParam; 3075 TBUTTON_INFO *btnPtr; 3076 INT nIndex; 3077 3078 if (infoPtr == NULL) 3079 return -1; 3080 if (lpTbInfo == NULL) 3081 return -1; 3082 if (lpTbInfo->cbSize < sizeof(TBBUTTONINFOW)) 3083 return -1; 3084 3085 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, 3086 lpTbInfo->dwMask & 0x80000000); 3087 if (nIndex == -1) 3088 return -1; 3089 3090 btnPtr = &infoPtr->buttons[nIndex]; 3091 3092 if(!btnPtr) 3093 return -1; 3162 3094 3163 3095 if (lpTbInfo->dwMask & TBIF_COMMAND) … … 3174 3106 lpTbInfo->fsStyle = btnPtr->fsStyle; 3175 3107 if (lpTbInfo->dwMask & TBIF_TEXT) { 3176 /* TB_GETBUTTONINFO doesn't retrieve text from the string list, so we 3177 can't use TOOLBAR_GetText here */ 3178 LPWSTR lpText; 3179 if (HIWORD(btnPtr->iString) && (btnPtr->iString != -1)) { 3180 lpText = (LPWSTR)btnPtr->iString; 3181 Str_GetPtrWtoA (lpText, lpTbInfo->pszText,lpTbInfo->cchText); 3182 } else 3183 lpTbInfo->pszText[0] = '\0'; 3184 } 3185 return nIndex; 3186 } 3187 3188 3189 static LRESULT 3190 TOOLBAR_GetButtonInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam) 3191 { 3192 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 3193 LPTBBUTTONINFOW lpTbInfo = (LPTBBUTTONINFOW)lParam; 3194 TBUTTON_INFO *btnPtr; 3195 INT nIndex; 3196 3197 if (infoPtr == NULL) 3198 return -1; 3199 if (lpTbInfo == NULL) 3200 return -1; 3201 if (lpTbInfo->cbSize < sizeof(TBBUTTONINFOW)) 3202 return -1; 3203 3204 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, 3205 lpTbInfo->dwMask & 0x80000000); 3206 if (nIndex == -1) 3207 return -1; 3208 3209 btnPtr = &infoPtr->buttons[nIndex]; 3210 3211 if(!btnPtr) 3212 return -1; 3213 3214 if (lpTbInfo->dwMask & TBIF_COMMAND) 3215 lpTbInfo->idCommand = btnPtr->idCommand; 3216 if (lpTbInfo->dwMask & TBIF_IMAGE) 3217 lpTbInfo->iImage = btnPtr->iBitmap; 3218 if (lpTbInfo->dwMask & TBIF_LPARAM) 3219 lpTbInfo->lParam = btnPtr->dwData; 3220 if (lpTbInfo->dwMask & TBIF_SIZE) 3221 lpTbInfo->cx = (WORD)(btnPtr->rect.right - btnPtr->rect.left); 3222 if (lpTbInfo->dwMask & TBIF_STATE) 3223 lpTbInfo->fsState = btnPtr->fsState; 3224 if (lpTbInfo->dwMask & TBIF_STYLE) 3225 lpTbInfo->fsStyle = btnPtr->fsStyle; 3226 if (lpTbInfo->dwMask & TBIF_TEXT) { 3227 /* TB_GETBUTTONINFO doesn't retrieve text from the string list, so we 3228 can't use TOOLBAR_GetText here */ 3229 LPWSTR lpText; 3230 if (HIWORD(btnPtr->iString) && (btnPtr->iString != -1)) { 3231 lpText = (LPWSTR)btnPtr->iString; 3232 Str_GetPtrW (lpText,lpTbInfo->pszText,lpTbInfo->cchText); 3233 } else 3234 lpTbInfo->pszText[0] = '\0'; 3108 LPWSTR lpText = TOOLBAR_GetText(infoPtr,btnPtr); 3109 Str_GetPtrW (lpText,lpTbInfo->pszText,lpTbInfo->cchText); 3235 3110 } 3236 3111 … … 3298 3173 TOOLBAR_GetDisabledImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) 3299 3174 { 3300 TRACE("hwnd=%p, wParam=%d, lParam=0x%lx\n", hwnd, wParam, lParam); 3301 /* UNDOCUMENTED: wParam is actually the ID of the image list to return */ 3302 return (LRESULT)GETDISIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), wParam); 3175 return (LRESULT)GETDISIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), 0); 3303 3176 } 3304 3177 … … 3309 3182 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 3310 3183 3311 TRACE("\n");3312 3313 3184 return infoPtr->dwExStyle; 3314 3185 } … … 3318 3189 TOOLBAR_GetHotImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) 3319 3190 { 3320 TRACE("hwnd=%p, wParam=%d, lParam=0x%lx\n", hwnd, wParam, lParam); 3321 /* UNDOCUMENTED: wParam is actually the ID of the image list to return */ 3322 return (LRESULT)GETHOTIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), wParam); 3191 return (LRESULT)GETHOTIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), 0); 3323 3192 } 3324 3193 … … 3342 3211 TOOLBAR_GetDefImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) 3343 3212 { 3344 TRACE("hwnd=%p, wParam=%d, lParam=0x%lx\n", hwnd, wParam, lParam); 3345 /* UNDOCUMENTED: wParam is actually the ID of the image list to return */ 3346 return (LRESULT) GETDEFIMAGELIST(TOOLBAR_GetInfoPtr(hwnd), wParam); 3213 return (LRESULT) GETDEFIMAGELIST(TOOLBAR_GetInfoPtr(hwnd), 0); 3347 3214 } 3348 3215 … … 3565 3432 TBUTTON_INFO *btnPtr; 3566 3433 INT nIndex; 3567 DWORD oldState;3568 3434 3569 3435 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); … … 3572 3438 3573 3439 btnPtr = &infoPtr->buttons[nIndex]; 3574 oldState = btnPtr->fsState;3575 3440 if (LOWORD(lParam) == FALSE) 3576 3441 btnPtr->fsState &= ~TBSTATE_INDETERMINATE; … … 3578 3443 btnPtr->fsState |= TBSTATE_INDETERMINATE; 3579 3444 3580 if(oldState != btnPtr->fsState) 3581 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 3445 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); 3582 3446 3583 3447 return TRUE; … … 3620 3484 debugstr_a((LPSTR)lpTbb->iString)); 3621 3485 len = strlen((LPSTR)lpTbb->iString) + 2; 3622 ptr = Alloc(len);3486 ptr = COMCTL32_Alloc(len); 3623 3487 strcpy(ptr, (LPSTR)lpTbb->iString); 3624 3488 ptr[len - 1] = 0; /* ended by two '\0' */ 3625 3489 lpTbb->iString = TOOLBAR_AddStringA(hwnd, 0, (LPARAM)ptr); 3626 Free(ptr);3490 COMCTL32_Free(ptr); 3627 3491 } 3628 3492 … … 3635 3499 oldButtons = infoPtr->buttons; 3636 3500 infoPtr->nNumButtons++; 3637 infoPtr->buttons = Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);3501 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons); 3638 3502 /* pre insert copy */ 3639 3503 if (nIndex > 0) { … … 3655 3519 infoPtr->buttons[nIndex].iString = lpTbb->iString; 3656 3520 3657 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & BTNS_SEP)) {3521 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) { 3658 3522 TTTOOLINFOA ti; 3659 3523 … … 3675 3539 } 3676 3540 3677 Free (oldButtons);3541 COMCTL32_Free (oldButtons); 3678 3542 3679 3543 TOOLBAR_CalcToolbar (hwnd); … … 3720 3584 debugstr_w((LPWSTR)lpTbb->iString)); 3721 3585 len = strlenW((LPWSTR)lpTbb->iString) + 2; 3722 ptr = Alloc(len*sizeof(WCHAR));3586 ptr = COMCTL32_Alloc(len*sizeof(WCHAR)); 3723 3587 strcpyW(ptr, (LPWSTR)lpTbb->iString); 3724 3588 ptr[len - 1] = 0; /* ended by two '\0' */ 3725 3589 lpTbb->iString = TOOLBAR_AddStringW(hwnd, 0, (LPARAM)ptr); 3726 Free(ptr);3590 COMCTL32_Free(ptr); 3727 3591 } 3728 3592 … … 3735 3599 oldButtons = infoPtr->buttons; 3736 3600 infoPtr->nNumButtons++; 3737 infoPtr->buttons = Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);3601 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons); 3738 3602 /* pre insert copy */ 3739 3603 if (nIndex > 0) { … … 3755 3619 infoPtr->buttons[nIndex].iString = lpTbb->iString; 3756 3620 3757 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & BTNS_SEP)) {3621 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) { 3758 3622 TTTOOLINFOW ti; 3759 3623 … … 3775 3639 } 3776 3640 3777 Free (oldButtons);3641 COMCTL32_Free (oldButtons); 3778 3642 3779 3643 TOOLBAR_CalcToolbar (hwnd); … … 3872 3736 3873 3737 3874 static LRESULT 3875 TOOLBAR_LoadImages (HWND hwnd, WPARAM wParam, LPARAM lParam) 3876 { 3877 TBADDBITMAP tbab; 3878 tbab.hInst = (HINSTANCE)lParam; 3879 tbab.nID = (UINT_PTR)wParam; 3880 3881 TRACE("hwnd = %p, hInst = %p, nID = %u\n", hwnd, tbab.hInst, tbab.nID); 3882 3883 return TOOLBAR_AddBitmap(hwnd, 0, (LPARAM)&tbab); 3884 } 3885 3886 3887 static LRESULT 3888 TOOLBAR_MapAccelerator (HWND hwnd, WPARAM wParam, LPARAM lParam) 3889 { 3890 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 3891 WCHAR wAccel = (WCHAR)wParam; 3892 UINT* pIDButton = (UINT*)lParam; 3893 WCHAR wszAccel[] = {'&',wAccel,0}; 3894 int i; 3895 3896 TRACE("hwnd = %p, wAccel = %x(%s), pIDButton = %p\n", 3897 hwnd, wAccel, debugstr_wn(&wAccel,1), pIDButton); 3898 3899 for (i = 0; i < infoPtr->nNumButtons; i++) 3900 { 3901 TBUTTON_INFO *btnPtr = infoPtr->buttons+i; 3902 if (!(btnPtr->fsStyle & BTNS_NOPREFIX) && 3903 !(btnPtr->fsState & TBSTATE_HIDDEN)) 3904 { 3905 int iLen = strlenW(wszAccel); 3906 LPCWSTR lpszStr = TOOLBAR_GetText(infoPtr, btnPtr); 3907 3908 if (!lpszStr) 3909 continue; 3910 3911 while (*lpszStr) 3912 { 3913 if ((lpszStr[0] == '&') && (lpszStr[1] == '&')) 3914 { 3915 lpszStr += 2; 3916 continue; 3917 } 3918 if (!strncmpiW(lpszStr, wszAccel, iLen)) 3919 { 3920 *pIDButton = btnPtr->idCommand; 3921 return TRUE; 3922 } 3923 lpszStr++; 3924 } 3925 } 3926 } 3927 return FALSE; 3928 } 3929 3930 3931 static LRESULT 3932 TOOLBAR_MarkButton (HWND hwnd, WPARAM wParam, LPARAM lParam) 3933 { 3934 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 3935 INT nIndex; 3936 3937 TRACE("hwnd = %p, wParam = %d, lParam = 0x%08lx\n", hwnd, wParam, lParam); 3938 3939 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); 3940 if (nIndex == -1) 3941 return FALSE; 3942 3943 if (LOWORD(lParam)) 3944 infoPtr->buttons[nIndex].fsState |= TBSTATE_MARKED; 3945 else 3946 infoPtr->buttons[nIndex].fsState &= ~TBSTATE_MARKED; 3947 3948 return TRUE; 3949 } 3950 3738 /* << TOOLBAR_LoadImages >> */ 3739 /* << TOOLBAR_MapAccelerator >> */ 3740 /* << TOOLBAR_MarkButton >> */ 3951 3741 /* << TOOLBAR_MoveButton >> */ 3952 3742 … … 3958 3748 TBUTTON_INFO *btnPtr; 3959 3749 INT nIndex; 3960 DWORD oldState;3961 3750 3962 3751 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); … … 3965 3754 3966 3755 btnPtr = &infoPtr->buttons[nIndex]; 3967 oldState = btnPtr->fsState;3968 3756 if (LOWORD(lParam) == FALSE) 3969 3757 btnPtr->fsState &= ~TBSTATE_PRESSED; … … 3971 3759 btnPtr->fsState |= TBSTATE_PRESSED; 3972 3760 3973 if(oldState != btnPtr->fsState) 3974 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 3761 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); 3975 3762 3976 3763 return TRUE; 3977 3764 } 3978 3765 3979 /* FIXME: there might still be some confusion her between number of buttons 3980 * and number of bitmaps */ 3766 3981 3767 static LRESULT 3982 3768 TOOLBAR_ReplaceBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) … … 3986 3772 HBITMAP hBitmap; 3987 3773 int i = 0, nOldButtons = 0, pos = 0; 3988 int nOldBitmaps, nNewBitmaps;3989 3774 HIMAGELIST himlDef = 0; 3990 3775 … … 4030 3815 return FALSE; 4031 3816 } 4032 4033 himlDef = GETDEFIMAGELIST(infoPtr, 0); /* fixme: correct? */ 4034 nOldBitmaps = ImageList_GetImageCount(himlDef); 3817 3818 infoPtr->nNumBitmaps = infoPtr->nNumBitmaps - nOldButtons + lpReplace->nButtons; 4035 3819 4036 3820 /* ImageList_Replace(GETDEFIMAGELIST(), pos, hBitmap, NULL); */ 4037 3821 4038 for (i = pos + nOldBitmaps - 1; i >= pos; i--) 3822 3823 himlDef = GETDEFIMAGELIST(infoPtr, 0); 3824 for (i = pos + nOldButtons - 1; i >= pos; i--) { 4039 3825 ImageList_Remove(himlDef, i); 3826 } 4040 3827 4041 3828 { … … 4066 3853 DeleteDC (hdcBitmap); 4067 3854 4068 ImageList_AddMasked (himlDef, hbmLoad, comctl32_color.clrBtnFace); 4069 nNewBitmaps = ImageList_GetImageCount(himlDef); 3855 ImageList_AddMasked (himlDef, hbmLoad, CLR_DEFAULT); 4070 3856 DeleteObject (hbmLoad); 4071 3857 } 4072 3858 4073 infoPtr->nNumBitmaps = infoPtr->nNumBitmaps - nOldBitmaps + nNewBitmaps; 4074 4075 TRACE(" pos %d %d old bitmaps replaced by %d new ones.\n", 4076 pos, nOldBitmaps, nNewBitmaps); 4077 4078 InvalidateRect(hwnd, NULL, TRUE); 3859 InvalidateRect(hwnd, NULL, FALSE); 4079 3860 4080 3861 return TRUE; … … 4393 4174 } 4394 4175 4395 /* This function differs a bit from what MSDN says it does:4396 * 1. lParam contains extended style flags to OR with current style4397 * (MSDN isn't clear on the OR bit)4398 * 2. wParam appears to contain extended style flags to be reset4399 * (MSDN says that this parameter is reserved)4400 */4401 4176 static LRESULT 4402 4177 TOOLBAR_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) … … 4406 4181 4407 4182 dwTemp = infoPtr->dwExStyle; 4408 infoPtr->dwExStyle &= ~wParam; 4409 infoPtr->dwExStyle |= (DWORD)lParam; 4410 4411 TRACE("new style 0x%08lx\n", infoPtr->dwExStyle); 4183 infoPtr->dwExStyle = (DWORD)lParam; 4184 4185 if (infoPtr->dwExStyle & (TBSTYLE_EX_MIXEDBUTTONS | 4186 TBSTYLE_EX_HIDECLIPPEDBUTTONS)) { 4187 FIXME("Extended style not implemented %s %s\n", 4188 (infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) ? 4189 "TBSTYLE_EX_MIXEDBUTTONS" : "", 4190 (infoPtr->dwExStyle & TBSTYLE_EX_HIDECLIPPEDBUTTONS) ? 4191 "TBSTYLE_EX_HIDECLIPPEDBUTTONS" : ""); 4192 } 4412 4193 4413 4194 if (infoPtr->dwExStyle & ~TBSTYLE_EX_ALL) 4414 4195 FIXME("Unknown Toolbar Extended Style 0x%08lx. Please report.\n", 4415 4196 (infoPtr->dwExStyle & ~TBSTYLE_EX_ALL)); 4416 4417 TOOLBAR_CalcToolbar (hwnd);4418 4419 TOOLBAR_AutoSize(hwnd);4420 4421 InvalidateRect(hwnd, NULL, TRUE);4422 4197 4423 4198 return (LRESULT)dwTemp; … … 4435 4210 if (infoPtr->iVersion >= 5) 4436 4211 id = wParam; 4437 4438 TRACE("hwnd = %p, himl = %p, id = %d\n", hwnd, himl, id);4439 4212 4440 4213 himlTemp = TOOLBAR_InsertImageList(&infoPtr->himlHot, … … 4465 4238 btnPtr = &infoPtr->buttons[(INT)wParam]; 4466 4239 btnPtr->bHot = TRUE; 4467 InvalidateRect (hwnd, &btnPtr->rect, TRUE); 4240 InvalidateRect (hwnd, &btnPtr->rect, 4241 TOOLBAR_HasText(infoPtr, btnPtr)); 4468 4242 } 4469 4243 if (nOldHotItem>=0) … … 4471 4245 btnPtr = &infoPtr->buttons[nOldHotItem]; 4472 4246 btnPtr->bHot = FALSE; 4473 InvalidateRect (hwnd, &btnPtr->rect, TRUE); 4247 InvalidateRect (hwnd, &btnPtr->rect, 4248 TOOLBAR_HasText(infoPtr, btnPtr)); 4474 4249 } 4475 4250 } … … 4506 4281 infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); 4507 4282 4283 /* FIXME: redraw ? */ 4508 4284 InvalidateRect(hwnd, NULL, TRUE); 4509 4285 … … 4559 4335 infoPtr->nMaxTextRows = (INT)wParam; 4560 4336 4561 TOOLBAR_CalcToolbar(hwnd);4562 4337 return TRUE; 4563 4338 } 4564 4339 4565 4340 4566 /* MSDN gives slightly wrong info on padding.4567 * 1. It is not only used on buttons with the BTNS_AUTOSIZE style4568 * 2. It is not used to create a blank area between the edge of the button4569 * and the text or image if TBSTYLE_LIST is set. It is used to control4570 * the gap between the image and text.4571 * 3. It is not applied to both sides. If TBSTYLE_LIST is set it is used4572 * to control the bottom and right borders [with the border being4573 * szPadding.cx - (GetSystemMetrics(SM_CXEDGE)+1)], otherwise the padding4574 * is shared evenly on both sides of the button.4575 */4576 4341 static LRESULT 4577 4342 TOOLBAR_SetPadding (HWND hwnd, WPARAM wParam, LPARAM lParam) … … 4583 4348 infoPtr->szPadding.cx = LOWORD((DWORD)lParam); 4584 4349 infoPtr->szPadding.cy = HIWORD((DWORD)lParam); 4585 TRACE("cx=%ld, cy=%ld\n",4350 FIXME("stub - nothing done with values, cx=%ld, cy=%ld\n", 4586 4351 infoPtr->szPadding.cx, infoPtr->szPadding.cy); 4587 4352 return (LRESULT) oldPad; … … 4626 4391 4627 4392 /* repaint toolbar */ 4628 InvalidateRect(hwnd, NULL, TRUE);4393 InvalidateRect(hwnd, NULL, FALSE); 4629 4394 } 4630 4395 … … 4658 4423 btnPtr->fsState = LOWORD(lParam); 4659 4424 TOOLBAR_CalcToolbar (hwnd); 4660 InvalidateRect(hwnd, 0, T RUE);4425 InvalidateRect(hwnd, 0, TOOLBAR_HasText(infoPtr, btnPtr)); 4661 4426 return TRUE; 4662 4427 } … … 4666 4431 { 4667 4432 btnPtr->fsState = LOWORD(lParam); 4668 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 4433 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, 4434 btnPtr)); 4669 4435 } 4670 4436 … … 4676 4442 TOOLBAR_SetStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) 4677 4443 { 4678 SetWindowLongW(hwnd, GWL_STYLE, lParam); 4444 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 4445 TBUTTON_INFO *btnPtr; 4446 INT nIndex; 4447 4448 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); 4449 if (nIndex == -1) 4450 return FALSE; 4451 4452 btnPtr = &infoPtr->buttons[nIndex]; 4453 4454 /* process style change if current style doesn't match new style */ 4455 if(btnPtr->fsStyle != LOWORD(lParam)) 4456 { 4457 btnPtr->fsStyle = LOWORD(lParam); 4458 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, 4459 btnPtr)); 4460 4461 if (infoPtr->hwndToolTip) { 4462 FIXME("change tool tip!\n"); 4463 } 4464 } 4679 4465 4680 4466 return TRUE; … … 4686 4472 { 4687 4473 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 4688 4689 TRACE("hwnd=%p, hwndTooltip=%p, lParam=0x%lx\n", hwnd, (HWND)wParam, lParam);4690 4474 4691 4475 if (infoPtr == NULL) … … 4737 4521 infoPtr->clrBtnHighlight = lParam->clrBtnHighlight; 4738 4522 infoPtr->clrBtnShadow = lParam->clrBtnShadow; 4739 InvalidateRect(hwnd, NULL, TRUE);4523 InvalidateRect(hwnd, 0, 0); 4740 4524 return 0; 4741 4525 } … … 4756 4540 } 4757 4541 4758 4759 static LRESULT4760 TOOLBAR_GetStringA (HWND hwnd, WPARAM wParam, LPARAM lParam)4761 {4762 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd);4763 WORD iString = HIWORD(wParam);4764 WORD buffersize = LOWORD(wParam);4765 LPSTR str = (LPSTR)lParam;4766 LRESULT ret = -1;4767 4768 TRACE("hwnd=%p, iString=%d, buffersize=%d, string=%p\n", hwnd, iString, buffersize, str);4769 4770 if (iString < infoPtr->nNumStrings)4771 {4772 ret = WideCharToMultiByte(CP_ACP, 0, infoPtr->strings[iString], -1, str, buffersize, NULL, NULL);4773 4774 TRACE("returning %s\n", debugstr_a(str));4775 }4776 else4777 ERR("String index %d out of range (largest is %d)\n", iString, infoPtr->nNumStrings - 1);4778 4779 return ret;4780 }4781 4782 4783 static LRESULT4784 TOOLBAR_GetStringW (HWND hwnd, WPARAM wParam, LPARAM lParam)4785 {4786 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd);4787 WORD iString = HIWORD(wParam);4788 WORD len = LOWORD(wParam)/sizeof(WCHAR) - 1;4789 LPWSTR str = (LPWSTR)lParam;4790 LRESULT ret = -1;4791 4792 TRACE("hwnd=%p, iString=%d, buffersize=%d, string=%p\n", hwnd, iString, LOWORD(wParam), str);4793 4794 if (iString < infoPtr->nNumStrings)4795 {4796 len = min(len, strlenW(infoPtr->strings[iString]));4797 ret = (len+1)*sizeof(WCHAR);4798 memcpy(str, infoPtr->strings[iString], ret);4799 str[len] = '\0';4800 4801 TRACE("returning %s\n", debugstr_w(str));4802 }4803 else4804 ERR("String index %d out of range (largest is %d)\n", iString, infoPtr->nNumStrings - 1);4805 4806 return ret;4807 }4808 4809 /* UNDOCUMENTED MESSAGE: This appears to set some kind of size. Perhaps it4810 * is the maximum size of the toolbar? */4811 static LRESULT TOOLBAR_Unkwn45D(HWND hwnd, WPARAM wParam, LPARAM lParam)4812 {4813 SIZE * pSize = (SIZE*)lParam;4814 FIXME("hwnd=%p, wParam=0x%08x, size.cx=%ld, size.cy=%ld stub!\n", hwnd, wParam, pSize->cx, pSize->cy);4815 return 0;4816 }4817 4542 4818 4543 /*********************************************************************/ … … 4849 4574 btnPtr = &infoPtr->buttons[(INT)wParam]; 4850 4575 btnPtr->bHot = (no_hi) ? FALSE : TRUE; 4851 InvalidateRect (hwnd, &btnPtr->rect, TRUE); 4576 InvalidateRect (hwnd, &btnPtr->rect, 4577 TOOLBAR_HasText(infoPtr, btnPtr)); 4852 4578 } 4853 4579 if (nOldHotItem>=0) { 4854 4580 btnPtr = &infoPtr->buttons[nOldHotItem]; 4855 4581 btnPtr->bHot = FALSE; 4856 InvalidateRect (hwnd, &btnPtr->rect, TRUE); 4582 InvalidateRect (hwnd, &btnPtr->rect, 4583 TOOLBAR_HasText(infoPtr, btnPtr)); 4857 4584 } 4858 4585 GetFocus(); … … 4866 4593 } 4867 4594 4868 /* UNDOCUMENTED MESSAGE: This sets the toolbar global iListGap parameter4869 * which controls the amount of spacing between the image and the text4870 * of buttons for TBSTYLE_LIST toolbars. */4871 static LRESULT TOOLBAR_Unkwn460(HWND hwnd, WPARAM wParam, LPARAM lParam)4872 {4873 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd);4874 4875 TRACE("hwnd=%p iListGap=%d\n", hwnd, wParam);4876 4877 if (lParam != 0)4878 FIXME("lParam = 0x%08lx. Please report\n", lParam);4879 4880 infoPtr->iListGap = (INT)wParam;4881 4882 TOOLBAR_CalcToolbar(hwnd);4883 InvalidateRect(hwnd, NULL, TRUE);4884 4885 return 0;4886 }4887 4888 /* UNDOCUMENTED MESSAGE: This returns the number of maximum number4889 * of image lists associated with the various states. */4890 static LRESULT TOOLBAR_Unkwn462(HWND hwnd, WPARAM wParam, LPARAM lParam)4891 {4892 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd);4893 4894 TRACE("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam);4895 4896 return max(infoPtr->cimlDef, max(infoPtr->cimlHot, infoPtr->cimlDis));4897 }4898 4595 4899 4596 static LRESULT … … 4926 4623 HWND hwndParent = GetParent(hwnd); 4927 4624 4625 InvalidateRect(hwnd, 0, 1); 4928 4626 GetWindowRect(hwnd, &rc); 4929 4627 MapWindowPoints(0, hwndParent, (LPPOINT)&rc, 2); … … 4951 4649 } 4952 4650 4953 static LRESULT TOOLBAR_Unkwn464(HWND hwnd, WPARAM wParam, LPARAM lParam)4954 {4955 FIXME("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam);4956 4957 InvalidateRect(hwnd, NULL, TRUE);4958 return 1;4959 }4960 4961 4651 4962 4652 static LRESULT … … 4966 4656 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); 4967 4657 LOGFONTA logFont; 4968 4969 TRACE("hwnd = %p\n", hwnd);4970 4658 4971 4659 /* initialize info structure */ … … 4976 4664 4977 4665 infoPtr->nHeight = infoPtr->nButtonHeight + TOP_BORDER + BOTTOM_BORDER; 4666 infoPtr->nRows = 1; 4978 4667 infoPtr->nMaxTextRows = 1; 4979 4668 infoPtr->cxMin = -1; … … 4987 4676 infoPtr->nOldHit = -1; 4988 4677 infoPtr->nHotItem = -2; /* It has to be initially different from nOldHit */ 4989 infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;4678 infoPtr->hwndNotify = GetParent (hwnd); 4990 4679 infoPtr->bTransparent = (dwStyle & TBSTYLE_TRANSPARENT); 4991 4680 infoPtr->bBtnTranspnt = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_LIST)); … … 4997 4686 infoPtr->clrBtnHighlight = CLR_DEFAULT; 4998 4687 infoPtr->clrBtnShadow = CLR_DEFAULT; 4999 /* not sure where the +1 comes from, but this comes to the same value 5000 * as native so this is probably correct */ 5001 infoPtr->szPadding.cx = 2*(GetSystemMetrics(SM_CXEDGE)+OFFSET_X) + 1; 5002 infoPtr->szPadding.cy = 2*(GetSystemMetrics(SM_CYEDGE)+OFFSET_Y); 5003 infoPtr->iListGap = infoPtr->szPadding.cx / 2; 5004 GetClientRect(hwnd, &infoPtr->client_rect); 4688 infoPtr->szPadding.cx = 7; 4689 infoPtr->szPadding.cy = 6; 5005 4690 TOOLBAR_NotifyFormat(infoPtr, (WPARAM)hwnd, (LPARAM)NF_REQUERY); 5006 4691 … … 5044 4729 DestroyWindow (infoPtr->hwndToolTip); 5045 4730 5046 /* delete temporary buffer for tooltip text */5047 if (infoPtr->pszTooltipText)5048 HeapFree(GetProcessHeap(), 0, infoPtr->pszTooltipText);5049 5050 4731 /* delete button data */ 5051 4732 if (infoPtr->buttons) 5052 Free (infoPtr->buttons);4733 COMCTL32_Free (infoPtr->buttons); 5053 4734 5054 4735 /* delete strings */ … … 5057 4738 for (i = 0; i < infoPtr->nNumStrings; i++) 5058 4739 if (infoPtr->strings[i]) 5059 Free (infoPtr->strings[i]);5060 5061 Free (infoPtr->strings);4740 COMCTL32_Free (infoPtr->strings[i]); 4741 4742 COMCTL32_Free (infoPtr->strings); 5062 4743 } 5063 4744 … … 5075 4756 5076 4757 /* free toolbar info data */ 5077 Free (infoPtr);4758 COMCTL32_Free (infoPtr); 5078 4759 SetWindowLongA (hwnd, 0, 0); 5079 4760 … … 5183 4864 btnPtr->fsState |= TBSTATE_PRESSED; 5184 4865 5185 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 4866 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, 4867 btnPtr)); 5186 4868 } 5187 4869 else if (GetWindowLongA (hwnd, GWL_STYLE) & CCS_ADJUSTABLE) … … 5218 4900 5219 4901 /* for EX_DRAWDDARROWS style, click must be in the drop-down arrow rect */ 5220 if ((btnPtr->fsState & TBSTATE_ENABLED) && 5221 ((btnPtr->fsStyle & BTNS_WHOLEDROPDOWN) || 5222 ((btnPtr->fsStyle & BTNS_DROPDOWN) && 5223 ((TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && PtInRect(&arrowRect, pt)) || 5224 (!TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle)))))) 4902 if ((btnPtr->fsState & TBSTATE_ENABLED) && (btnPtr->fsStyle & TBSTYLE_DROPDOWN) && 4903 ((TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && PtInRect(&arrowRect, pt)) || 4904 (!TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle)))) 5225 4905 { 5226 4906 LRESULT res; … … 5236 4916 nmtb.cchText = 0; 5237 4917 nmtb.pszText = 0; 5238 CopyRect(&nmtb.rcButton, &btnPtr->rect);4918 memset(&nmtb.rcButton, 0, sizeof(RECT)); 5239 4919 res = TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, 5240 4920 TBN_DROPDOWN); … … 5252 4932 5253 4933 if (btnPtr->fsState & TBSTATE_ENABLED) 5254 InvalidateRect(hwnd, &btnPtr->rect, T RUE);4934 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); 5255 4935 UpdateWindow(hwnd); 5256 4936 SetCapture (hwnd); … … 5299 4979 infoPtr->buttons[infoPtr->nHotItem].bHot = TRUE; 5300 4980 5301 if (0 <= infoPtr->nButtonDown) {5302 4981 btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; 5303 4982 btnPtr->fsState &= ~TBSTATE_PRESSED; 5304 4983 5305 if (btnPtr->fsStyle & BTNS_CHECK) {5306 if (btnPtr->fsStyle & BTNS_GROUP) {4984 if (btnPtr->fsStyle & TBSTYLE_CHECK) { 4985 if (btnPtr->fsStyle & TBSTYLE_GROUP) { 5307 4986 nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, 5308 4987 nHit); … … 5322 5001 } 5323 5002 5324 if (nOldIndex != -1) 5325 InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, TRUE); 5003 if (nOldIndex != -1) 5004 { 5005 InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, 5006 TOOLBAR_HasText(infoPtr, &infoPtr->buttons[nOldIndex])); 5007 } 5326 5008 5327 5009 /* … … 5366 5048 TOOLBAR_SendNotify ((NMHDR *) &nmmouse, infoPtr, NM_CLICK); 5367 5049 } 5368 }5369 5050 return 0; 5370 5051 } … … 5386 5067 5387 5068 if (btnPtr->fsState & TBSTATE_ENABLED) 5388 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 5069 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, 5070 btnPtr)); 5389 5071 } 5390 5072 return 0; … … 5410 5092 rc1 = hotBtnPtr->rect; 5411 5093 InflateRect (&rc1, 1, 1); 5412 InvalidateRect (hwnd, &rc1, TRUE); 5094 InvalidateRect (hwnd, &rc1, TOOLBAR_HasText(infoPtr, 5095 hotBtnPtr)); 5413 5096 } 5414 5097 … … 5471 5154 if (infoPtr->nOldHit != nHit) 5472 5155 { 5473 /* Remove the effect of an old hot button if the button was 5156 /* Remove the effect of an old hot button if the button was enabled and was 5474 5157 drawn with the hot button effect */ 5475 if(infoPtr->nOldHit >= 0 && infoPtr->nOldHit == infoPtr->nHotItem) 5158 if(infoPtr->nOldHit >= 0 && infoPtr->nOldHit == infoPtr->nHotItem && 5159 (infoPtr->buttons[infoPtr->nOldHit].fsState & TBSTATE_ENABLED)) 5476 5160 { 5477 5161 oldBtnPtr = &infoPtr->buttons[infoPtr->nOldHit]; … … 5486 5170 infoPtr->nHotItem = nHit; 5487 5171 5488 btnPtr->bHot = TRUE; 5172 /* only enabled buttons show hot effect */ 5173 if(infoPtr->buttons[nHit].fsState & TBSTATE_ENABLED) 5174 { 5175 btnPtr->bHot = TRUE; 5176 } 5489 5177 } 5490 5178 … … 5502 5190 /* now invalidate the old and new buttons so they will be painted */ 5503 5191 if (oldBtnPtr) 5504 InvalidateRect (hwnd, &oldBtnPtr->rect, TRUE); 5505 if (btnPtr) 5506 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 5192 InvalidateRect (hwnd, &oldBtnPtr->rect, 5193 TOOLBAR_HasText(infoPtr, oldBtnPtr)); 5194 if (btnPtr && (btnPtr->fsState & TBSTATE_ENABLED)) 5195 InvalidateRect(hwnd, &btnPtr->rect, 5196 TOOLBAR_HasText(infoPtr, btnPtr)); 5507 5197 5508 5198 if (infoPtr->bCaptured) { … … 5551 5241 5552 5242 /* allocate memory for info structure */ 5553 infoPtr = (TOOLBAR_INFO *) Alloc (sizeof(TOOLBAR_INFO));5243 infoPtr = (TOOLBAR_INFO *)COMCTL32_Alloc (sizeof(TOOLBAR_INFO)); 5554 5244 SetWindowLongA (hwnd, 0, (DWORD)infoPtr); 5555 5245 5556 5246 /* paranoid!! */ 5557 5247 infoPtr->dwStructSize = sizeof(TBBUTTON); 5558 infoPtr->nRows = 1;5559 5248 5560 5249 /* fix instance handle, if the toolbar was created by CreateToolbarEx() */ … … 5650 5339 5651 5340 5652 /* handles requests from the tooltip control on what text to display */5653 static LRESULT TOOLBAR_TTGetDispInfo (TOOLBAR_INFO *infoPtr, NMTTDISPINFOW *lpnmtdi)5654 {5655 int index = TOOLBAR_GetButtonIndex(infoPtr, lpnmtdi->hdr.idFrom, FALSE);5656 5657 TRACE("button index = %d\n", index);5658 5659 if (infoPtr->pszTooltipText)5660 {5661 HeapFree(GetProcessHeap(), 0, infoPtr->pszTooltipText);5662 infoPtr->pszTooltipText = NULL;5663 }5664 5665 if (index < 0)5666 return 0;5667 5668 if (infoPtr->bNtfUnicode)5669 {5670 WCHAR wszBuffer[INFOTIPSIZE+1];5671 NMTBGETINFOTIPW tbgit;5672 int len; /* in chars */5673 5674 wszBuffer[0] = '\0';5675 wszBuffer[INFOTIPSIZE] = '\0';5676 5677 tbgit.pszText = wszBuffer;5678 tbgit.cchTextMax = INFOTIPSIZE;5679 tbgit.iItem = lpnmtdi->hdr.idFrom;5680 tbgit.lParam = infoPtr->buttons[index].dwData;5681 5682 TOOLBAR_SendNotify(&tbgit.hdr, infoPtr, TBN_GETINFOTIPW);5683 5684 TRACE("TBN_GETINFOTIPW - got string %s\n", debugstr_w(tbgit.pszText));5685 5686 len = strlenW(tbgit.pszText);5687 if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0])-1)5688 {5689 /* need to allocate temporary buffer in infoPtr as there5690 * isn't enough space in buffer passed to us by the5691 * tooltip control */5692 infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));5693 if (infoPtr->pszTooltipText)5694 {5695 memcpy(infoPtr->pszTooltipText, tbgit.pszText, (len+1)*sizeof(WCHAR));5696 lpnmtdi->lpszText = infoPtr->pszTooltipText;5697 return 0;5698 }5699 }5700 else if (len > 0)5701 {5702 memcpy(lpnmtdi->lpszText, tbgit.pszText, (len+1)*sizeof(WCHAR));5703 return 0;5704 }5705 }5706 else5707 {5708 CHAR szBuffer[INFOTIPSIZE+1];5709 NMTBGETINFOTIPA tbgit;5710 int len; /* in chars */5711 5712 szBuffer[0] = '\0';5713 szBuffer[INFOTIPSIZE] = '\0';5714 5715 tbgit.pszText = szBuffer;5716 tbgit.cchTextMax = INFOTIPSIZE;5717 tbgit.iItem = lpnmtdi->hdr.idFrom;5718 tbgit.lParam = infoPtr->buttons[index].dwData;5719 5720 TOOLBAR_SendNotify(&tbgit.hdr, infoPtr, TBN_GETINFOTIPA);5721 5722 TRACE("TBN_GETINFOTIPA - got string %s\n", debugstr_a(tbgit.pszText));5723 5724 len = -1 + MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, -1, NULL, 0);5725 if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0])-1)5726 {5727 /* need to allocate temporary buffer in infoPtr as there5728 * isn't enough space in buffer passed to us by the5729 * tooltip control */5730 infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));5731 if (infoPtr->pszTooltipText)5732 {5733 MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, len+1, infoPtr->pszTooltipText, (len+1)*sizeof(WCHAR));5734 lpnmtdi->lpszText = infoPtr->pszTooltipText;5735 return 0;5736 }5737 }5738 else if (len > 0)5739 {5740 MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, len+1, lpnmtdi->lpszText, (len+1)*sizeof(WCHAR));5741 return 0;5742 }5743 }5744 5745 /* if button has text, but it is not shown then automatically5746 * use that text as tooltip */5747 if ((infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) &&5748 !(infoPtr->buttons[index].fsStyle & BTNS_SHOWTEXT))5749 {5750 LPWSTR pszText = TOOLBAR_GetText(infoPtr, &infoPtr->buttons[index]);5751 int len = pszText ? strlenW(pszText) : 0;5752 5753 TRACE("using button hidden text %s\n", debugstr_w(pszText));5754 5755 if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0])-1)5756 {5757 /* need to allocate temporary buffer in infoPtr as there5758 * isn't enough space in buffer passed to us by the5759 * tooltip control */5760 infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));5761 if (infoPtr->pszTooltipText)5762 {5763 memcpy(infoPtr->pszTooltipText, pszText, (len+1)*sizeof(WCHAR));5764 lpnmtdi->lpszText = infoPtr->pszTooltipText;5765 return 0;5766 }5767 }5768 else if (len > 0)5769 {5770 memcpy(lpnmtdi->lpszText, pszText, (len+1)*sizeof(WCHAR));5771 return 0;5772 }5773 }5774 5775 TRACE("Sending tooltip notification to %p\n", infoPtr->hwndNotify);5776 5777 /* last resort: send notification on to app */5778 /* FIXME: find out what is really used here */5779 return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, 0, (LPARAM)lpnmtdi);5780 }5781 5782 5783 5341 inline static LRESULT 5784 5342 TOOLBAR_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam) … … 5787 5345 LPNMHDR lpnmh = (LPNMHDR)lParam; 5788 5346 5789 switch (lpnmh->code) 5790 { 5791 case PGN_CALCSIZE: 5792 { 5793 LPNMPGCALCSIZE lppgc = (LPNMPGCALCSIZE)lParam; 5794 5795 if (lppgc->dwFlag == PGF_CALCWIDTH) { 5796 lppgc->iWidth = infoPtr->rcBound.right - infoPtr->rcBound.left; 5797 TRACE("processed PGN_CALCSIZE, returning horz size = %d\n", 5798 lppgc->iWidth); 5799 } 5800 else { 5801 lppgc->iHeight = infoPtr->rcBound.bottom - infoPtr->rcBound.top; 5802 TRACE("processed PGN_CALCSIZE, returning vert size = %d\n", 5803 lppgc->iHeight); 5804 } 5805 return 0; 5806 } 5807 5808 case PGN_SCROLL: 5809 { 5810 LPNMPGSCROLL lppgs = (LPNMPGSCROLL)lParam; 5811 5812 lppgs->iScroll = (lppgs->iDir & (PGF_SCROLLLEFT | PGF_SCROLLRIGHT)) ? 5813 infoPtr->nButtonWidth : infoPtr->nButtonHeight; 5814 TRACE("processed PGN_SCROLL, returning scroll=%d, dir=%d\n", 5815 lppgs->iScroll, lppgs->iDir); 5816 return 0; 5817 } 5818 5819 case TTN_GETDISPINFOW: 5820 return TOOLBAR_TTGetDispInfo(infoPtr, (LPNMTTDISPINFOW)lParam); 5821 5822 case TTN_GETDISPINFOA: 5823 FIXME("TTN_GETDISPINFOA - stub\n"); 5824 return 0; 5825 5826 default: 5827 return 0; 5828 } 5347 if (lpnmh->code == PGN_CALCSIZE) { 5348 LPNMPGCALCSIZE lppgc = (LPNMPGCALCSIZE)lParam; 5349 5350 if (lppgc->dwFlag == PGF_CALCWIDTH) { 5351 lppgc->iWidth = infoPtr->rcBound.right - infoPtr->rcBound.left; 5352 TRACE("processed PGN_CALCSIZE, returning horz size = %d\n", 5353 lppgc->iWidth); 5354 } 5355 else { 5356 lppgc->iHeight = infoPtr->rcBound.bottom - infoPtr->rcBound.top; 5357 TRACE("processed PGN_CALCSIZE, returning vert size = %d\n", 5358 lppgc->iHeight); 5359 } 5360 return 0; 5361 } 5362 5363 if (lpnmh->code == PGN_SCROLL) { 5364 LPNMPGSCROLL lppgs = (LPNMPGSCROLL)lParam; 5365 5366 lppgs->iScroll = (lppgs->iDir & (PGF_SCROLLLEFT | PGF_SCROLLRIGHT)) ? 5367 infoPtr->nButtonWidth : infoPtr->nButtonHeight; 5368 TRACE("processed PGN_SCROLL, returning scroll=%d, dir=%d\n", 5369 lppgs->iScroll, lppgs->iDir); 5370 return 0; 5371 } 5372 5373 5374 TRACE("passing WM_NOTIFY!\n"); 5375 5376 if ((infoPtr->hwndToolTip) && (lpnmh->hwndFrom == infoPtr->hwndToolTip)) { 5377 if (infoPtr->bNtfUnicode) 5378 return SendMessageW (infoPtr->hwndNotify, WM_NOTIFY, 5379 wParam, lParam); 5380 else 5381 return SendMessageA (infoPtr->hwndNotify, WM_NOTIFY, 5382 wParam, lParam); 5383 5384 #if 0 5385 if (lpnmh->code == TTN_GETDISPINFOA) { 5386 LPNMTTDISPINFOA lpdi = (LPNMTTDISPINFOA)lParam; 5387 5388 FIXME("retrieving ASCII string\n"); 5389 5390 } 5391 else if (lpnmh->code == TTN_GETDISPINFOW) { 5392 LPNMTTDISPINFOW lpdi = (LPNMTTDISPINFOW)lParam; 5393 5394 FIXME("retrieving UNICODE string\n"); 5395 5396 } 5397 #endif 5398 } 5399 5400 return 0; 5829 5401 } 5830 5402 … … 5846 5418 INT i; 5847 5419 5848 TRACE("wParam = 0x%x, lParam = 0x%08lx\n", wParam, lParam);5849 5850 if ((lParam == NF_QUERY) && ((HWND)wParam == infoPtr->hwndToolTip))5851 return NFR_UNICODE;5852 5853 5420 if (lParam == NF_REQUERY) { 5854 i = SendMessageA( infoPtr->hwndNotify,5421 i = SendMessageA(GetParent(infoPtr->hwndSelf), 5855 5422 WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY); 5856 5423 if ((i < NFR_ANSI) || (i > NFR_UNICODE)) { … … 5900 5467 * *previous* status of the redraw flag (either 0 or 1) 5901 5468 * instead of the MSDN documented value of 0 if handled. 5902 * (For laughs see the "consist ency" with same function5469 * (For laughs see the "consistancy" with same function 5903 5470 * in rebar.) 5904 5471 * … … 5975 5542 cx = infoPtr->nWidth; 5976 5543 5977 if ( (dwStyle & CCS_BOTTOM) ==CCS_NOMOVEY) {5544 if (dwStyle & CCS_NOMOVEY) { 5978 5545 GetWindowRect(hwnd, &window_rect); 5979 5546 ScreenToClient(parent, (LPPOINT)&window_rect.left); 5980 5547 y = window_rect.top; 5981 5548 } 5982 if ((dwStyle & CCS_BOTTOM) == CCS_BOTTOM) {5983 GetWindowRect(hwnd, &window_rect);5984 y = parent_rect.bottom -5985 ( window_rect.bottom - window_rect.top);5986 }5987 5549 } 5988 5550 … … 6003 5565 } 6004 5566 6005 if(infoPtr->dwExStyle & TBSTYLE_EX_HIDECLIPPEDBUTTONS) 6006 { 6007 RECT delta_width, delta_height, client, dummy; 6008 DWORD min_x, max_x, min_y, max_y; 6009 TBUTTON_INFO *btnPtr; 6010 INT i; 6011 6012 GetClientRect(hwnd, &client); 6013 if(client.right > infoPtr->client_rect.right) 6014 { 6015 min_x = infoPtr->client_rect.right; 6016 max_x = client.right; 6017 } 6018 else 6019 { 6020 max_x = infoPtr->client_rect.right; 6021 min_x = client.right; 6022 } 6023 if(client.bottom > infoPtr->client_rect.bottom) 6024 { 6025 min_y = infoPtr->client_rect.bottom; 6026 max_y = client.bottom; 6027 } 6028 else 6029 { 6030 max_y = infoPtr->client_rect.bottom; 6031 min_y = client.bottom; 6032 } 6033 6034 SetRect(&delta_width, min_x, 0, max_x, min_y); 6035 SetRect(&delta_height, 0, min_y, max_x, max_y); 6036 6037 TRACE("delta_width %s delta_height %s\n", wine_dbgstr_rect(&delta_width), wine_dbgstr_rect(&delta_height)); 6038 btnPtr = infoPtr->buttons; 6039 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) 6040 if(IntersectRect(&dummy, &delta_width, &btnPtr->rect) || 6041 IntersectRect(&dummy, &delta_height, &btnPtr->rect)) 6042 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 6043 } 6044 6045 if((uPosFlags & (SWP_NOSIZE | SWP_NOMOVE)) == (SWP_NOSIZE | SWP_NOMOVE)) 6046 SetWindowPos (hwnd, 0, x, y, cx, cy, uPosFlags | SWP_NOZORDER); 6047 } 6048 GetClientRect(hwnd, &infoPtr->client_rect); 5567 SetWindowPos (hwnd, 0, parent_rect.left - x, parent_rect.top - y, 5568 cx, cy, uPosFlags | SWP_NOZORDER); 5569 } 6049 5570 return 0; 6050 5571 } … … 6067 5588 (TBSTYLE_FLAT | TBSTYLE_LIST)); 6068 5589 TOOLBAR_CheckStyle (hwnd, lpStyle->styleNew); 6069 6070 TRACE("new style 0x%08lx\n", lpStyle->styleNew); 6071 } 6072 6073 TOOLBAR_CalcToolbar(hwnd); 5590 } 6074 5591 6075 5592 TOOLBAR_AutoSize (hwnd); 6076 5593 6077 InvalidateRect(hwnd, NULL, TRUE);5594 InvalidateRect(hwnd, NULL, FALSE); 6078 5595 6079 5596 return 0; … … 6094 5611 ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 6095 5612 { 6096 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);6097 6098 5613 TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n", 6099 5614 hwnd, uMsg, /* SPY_GetMsgName(uMsg), */ wParam, lParam); … … 6211 5726 return TOOLBAR_GetState (hwnd, wParam, lParam); 6212 5727 6213 case TB_GETSTRINGA:6214 return TOOLBAR_GetStringA (hwnd, wParam, lParam);6215 6216 case TB_GETSTRINGW:6217 return TOOLBAR_GetStringW (hwnd, wParam, lParam);6218 6219 5728 case TB_GETSTYLE: 6220 5729 return TOOLBAR_GetStyle (hwnd, wParam, lParam); … … 6264 5773 return TOOLBAR_IsButtonPressed (hwnd, wParam, lParam); 6265 5774 6266 case TB_LOADIMAGES: 6267 return TOOLBAR_LoadImages (hwnd, wParam, lParam); 6268 6269 case TB_MAPACCELERATORA: 6270 case TB_MAPACCELERATORW: 6271 return TOOLBAR_MapAccelerator (hwnd, wParam, lParam); 6272 6273 case TB_MARKBUTTON: 6274 return TOOLBAR_MarkButton (hwnd, wParam, lParam); 6275 5775 case TB_LOADIMAGES: /* 4.70 */ 5776 FIXME("missing standard imagelists\n"); 5777 return 0; 5778 5779 /* case TB_MAPACCELERATORA: */ /* 4.71 */ 5780 /* case TB_MAPACCELERATORW: */ /* 4.71 */ 5781 /* case TB_MARKBUTTON: */ /* 4.71 */ 6276 5782 /* case TB_MOVEBUTTON: */ /* 4.71 */ 6277 5783 … … 6359 5865 return TOOLBAR_SetUnicodeFormat (hwnd, wParam, lParam); 6360 5866 6361 case TB_UNKWN45D:6362 return TOOLBAR_Unkwn45D(hwnd, wParam, lParam);6363 6364 5867 case TB_UNKWN45E: 6365 5868 return TOOLBAR_Unkwn45E (hwnd, wParam, lParam); 6366 5869 6367 case TB_UNKWN460:6368 return TOOLBAR_Unkwn460(hwnd, wParam, lParam);6369 6370 case TB_UNKWN462:6371 return TOOLBAR_Unkwn462(hwnd, wParam, lParam);6372 6373 5870 case TB_UNKWN463: 6374 5871 return TOOLBAR_Unkwn463 (hwnd, wParam, lParam); 6375 5872 6376 case TB_UNKWN464:6377 return TOOLBAR_Unkwn464(hwnd, wParam, lParam);6378 5873 6379 5874 /* Common Control Messages */ … … 6445 5940 6446 5941 case WM_NOTIFYFORMAT: 6447 returnTOOLBAR_NotifyFormatFake (hwnd, wParam, lParam);5942 TOOLBAR_NotifyFormatFake (hwnd, wParam, lParam); 6448 5943 6449 5944 case WM_PAINT: … … 6469 5964 case WM_MEASUREITEM: 6470 5965 case WM_VKEYTOITEM: 6471 return SendMessageA (infoPtr->hwndNotify, uMsg, wParam, lParam); 5966 { 5967 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 5968 if(infoPtr != NULL) 5969 return SendMessageA (infoPtr->hwndNotify, uMsg, wParam, lParam); 5970 else 5971 return SendMessageA (GetParent (hwnd), uMsg, wParam, lParam); 5972 } 6472 5973 6473 5974 /* We see this in Outlook Express 5.x and just does DefWindowProc */ … … 6495 5996 wndClass.cbClsExtra = 0; 6496 5997 wndClass.cbWndExtra = sizeof(TOOLBAR_INFO *); 6497 wndClass.hCursor = LoadCursorA (0, (LPSTR)IDC_ARROWA);5998 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA); 6498 5999 wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); 6499 6000 wndClass.lpszClassName = TOOLBARCLASSNAMEA; … … 6522 6023 PIMLENTRY *pnies; 6523 6024 6524 c = (PIMLENTRY) Alloc(sizeof(IMLENTRY));6025 c = (PIMLENTRY) COMCTL32_Alloc(sizeof(IMLENTRY)); 6525 6026 c->id = id; 6526 6027 6527 pnies = Alloc((*cies + 1) * sizeof(PIMLENTRY));6028 pnies = COMCTL32_Alloc((*cies + 1) * sizeof(PIMLENTRY)); 6528 6029 memcpy(pnies, *pies, ((*cies) * sizeof(PIMLENTRY))); 6529 6030 pnies[*cies] = c; 6530 6031 (*cies)++; 6531 6032 6532 Free(*pies);6033 COMCTL32_Free(*pies); 6533 6034 *pies = pnies; 6534 6035 } … … 6546 6047 6547 6048 for (i = 0; i < *cies; i++) 6548 Free((*pies)[i]);6549 6550 Free(*pies);6049 COMCTL32_Free((*pies)[i]); 6050 6051 COMCTL32_Free(*pies); 6551 6052 6552 6053 *cies = 0;
Note:
See TracChangeset
for help on using the changeset viewer.