- Timestamp:
- Mar 17, 2004, 5:38:52 PM (22 years ago)
- Location:
- trunk/src/comctl32
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/listview.c
r10530 r10535 8937 8937 #ifdef __WIN32OS2__ 8938 8938 #ifdef DEBUG 8939 void dprintfMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)8939 static void dprintfMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 8940 8940 { 8941 8941 char *msg = NULL; -
trunk/src/comctl32/rebar.c
r10139 r10535 120 120 * Still to do: 121 121 * 2. Following still not handled: RBBS_FIXEDBMP, 122 * RBBS_USECHEVRON,CCS_NORESIZE,122 * CCS_NORESIZE, 123 123 * CCS_NOMOVEX, CCS_NOMOVEY 124 124 * 3. Following are only partially handled: … … 137 137 * 7. The following notifications are not implemented: 138 138 * NM_CUSTOMDRAW, NM_RELEASEDCAPTURE 139 * RB _CHEVRONPUSHED, RBN_MINMAX139 * RBN_MINMAX 140 140 */ 141 141 142 #include <stdarg.h> 142 143 #include <stdlib.h> 143 144 #include <string.h> 144 145 146 #include "windef.h" 145 147 #include "winbase.h" 146 148 #include "wingdi.h" 147 149 #include "wine/unicode.h" 150 #include "winuser.h" 151 #include "winnls.h" 148 152 #include "commctrl.h" 149 /* #include "spy.h" */ 153 #include "comctl32.h" 150 154 #include "wine/debug.h" 151 155 … … 191 195 RECT rcCapText; /* calculated caption text rectangle */ 192 196 RECT rcChild; /* calculated child rectangle */ 197 RECT rcChevron; /* calculated chevron rectangle */ 193 198 194 199 LPWSTR lpText; … … 207 212 #define DRAW_RIGHTSEP 0x00000010 208 213 #define DRAW_BOTTOMSEP 0x00000020 214 #define DRAW_CHEVRONHOT 0x00000040 215 #define DRAW_CHEVRONPUSHED 0x00000080 216 #define DRAW_LAST_IN_ROW 0x00000100 217 #define DRAW_FIRST_IN_ROW 0x00000200 209 218 #define NTF_INVALIDATE 0x01000000 210 211 typedef struct212 {213 INT istartband; /* index of first band in row */214 INT iendband; /* index of last band in row */215 } REBAR_ROW;216 217 219 218 220 typedef struct … … 245 247 POINTS dragStart; /* x,y of button down */ 246 248 POINTS dragNow; /* x,y of this MouseMove */ 247 INT i hitBand; /* band number of band whose gripper was grabbed*/249 INT iOldBand; /* last band that had the mouse cursor over it */ 248 250 INT ihitoffset; /* offset of hotspot from gripper.left */ 249 251 POINT origin; /* left/upper corner of client */ 250 251 REBAR_ROW *rows; /* pointer to row indexes */ 252 INT ichevronhotBand; /* last band that had a hot chevron */ 253 INT iGrabbedBand;/* band number of band whose gripper was grabbed */ 254 252 255 REBAR_BAND *bands; /* pointer to the array of rebar bands */ 253 256 } REBAR_INFO; … … 290 293 #define GRIPPER_WIDTH 3 291 294 295 /* Width of the chevron button if present */ 296 #define CHEVRON_WIDTH 10 297 292 298 /* Height of divider for Rebar if not disabled (CCS_NODIVIDER) */ 293 299 /* either top or bottom */ … … 299 305 /* ---- End of REBAR layout constants. ---- */ 300 306 307 #define RB_GETBANDINFO_OLD (WM_USER+5) /* obsoleted after IE3, but we have to support it anyway */ 301 308 302 309 /* The following 6 defines return the proper rcBand element */ … … 331 338 static UINT mindragy = 0; 332 339 333 static c har *band_stylename[] = {340 static const char *band_stylename[] = { 334 341 "RBBS_BREAK", /* 0001 */ 335 342 "RBBS_FIXEDSIZE", /* 0002 */ … … 343 350 NULL }; 344 351 345 static c har *band_maskname[] = {352 static const char *band_maskname[] = { 346 353 "RBBIM_STYLE", /* 0x00000001 */ 347 354 "RBBIM_COLORS", /* 0x00000002 */ … … 408 415 TRACE("band info:"); 409 416 if (pB->fMask & RBBIM_SIZE) 410 DPRINTF(" cx=%u", pB->cx);417 TRACE(" cx=%u", pB->cx); 411 418 if (pB->fMask & RBBIM_IDEALSIZE) 412 DPRINTF(" xIdeal=%u", pB->cxIdeal);419 TRACE(" xIdeal=%u", pB->cxIdeal); 413 420 if (pB->fMask & RBBIM_HEADERSIZE) 414 DPRINTF(" xHeader=%u", pB->cxHeader);421 TRACE(" xHeader=%u", pB->cxHeader); 415 422 if (pB->fMask & RBBIM_LPARAM) 416 DPRINTF(" lParam=0x%08lx", pB->lParam);417 DPRINTF("\n");423 TRACE(" lParam=0x%08lx", pB->lParam); 424 TRACE("\n"); 418 425 } 419 426 if (pB->fMask & RBBIM_CHILDSIZE) … … 434 441 iP->hwndSelf, iP->clrText, iP->clrBk, iP->uNumBands, iP->uNumRows, 435 442 iP->calcSize.cx, iP->calcSize.cy); 436 TRACE("hwnd=%p: flags=%08x, dragStart=%d,%d, dragNow=%d,%d, i hitBand=%d\n",443 TRACE("hwnd=%p: flags=%08x, dragStart=%d,%d, dragNow=%d,%d, iGrabbedBand=%d\n", 437 444 iP->hwndSelf, iP->fStatus, iP->dragStart.x, iP->dragStart.y, 438 445 iP->dragNow.x, iP->dragNow.y, 439 iP->i hitBand);446 iP->iGrabbedBand); 440 447 TRACE("hwnd=%p: style=%08lx, I'm Unicode=%s, notify in Unicode=%s, redraw=%s\n", 441 448 iP->hwndSelf, iP->dwStyle, (iP->bUnicode)?"TRUE":"FALSE", … … 453 460 if (pB->fMask & (RBBIM_SIZE | RBBIM_IDEALSIZE | RBBIM_LPARAM )) { 454 461 if (pB->fMask & RBBIM_SIZE) 455 DPRINTF(" cx=%u", pB->cx);462 TRACE(" cx=%u", pB->cx); 456 463 if (pB->fMask & RBBIM_IDEALSIZE) 457 DPRINTF(" xIdeal=%u", pB->cxIdeal);464 TRACE(" xIdeal=%u", pB->cxIdeal); 458 465 if (pB->fMask & RBBIM_LPARAM) 459 DPRINTF(" lParam=0x%08lx", pB->lParam);460 } 461 DPRINTF("\n");466 TRACE(" lParam=0x%08lx", pB->lParam); 467 } 468 TRACE("\n"); 462 469 if (RBBIM_CHILDSIZE) 463 470 TRACE("band # %u: xMin=%u, yMin=%u, yChild=%u, yMax=%u, yIntgl=%u\n", … … 468 475 TRACE("band # %u: lcx=%u, ccx=%u, hcx=%u, lcy=%u, ccy=%u, hcy=%u, offChild=%ld,%ld\n", 469 476 i, pB->lcx, pB->ccx, pB->hcx, pB->lcy, pB->ccy, pB->hcy, pB->offChild.cx, pB->offChild.cy); 470 TRACE("band # %u: fStatus=%08x, fDraw=%08x, Band=(% d,%d)-(%d,%d), Grip=(%d,%d)-(%d,%d)\n",477 TRACE("band # %u: fStatus=%08x, fDraw=%08x, Band=(%ld,%ld)-(%ld,%ld), Grip=(%ld,%ld)-(%ld,%ld)\n", 471 478 i, pB->fStatus, pB->fDraw, 472 479 pB->rcBand.left, pB->rcBand.top, pB->rcBand.right, pB->rcBand.bottom, 473 480 pB->rcGripper.left, pB->rcGripper.top, pB->rcGripper.right, pB->rcGripper.bottom); 474 TRACE("band # %u: Img=(% d,%d)-(%d,%d), Txt=(%d,%d)-(%d,%d), Child=(%d,%d)-(%d,%d)\n",481 TRACE("band # %u: Img=(%ld,%ld)-(%ld,%ld), Txt=(%ld,%ld)-(%ld,%ld), Child=(%ld,%ld)-(%ld,%ld)\n", 475 482 i, 476 483 pB->rcCapImage.left, pB->rcCapImage.top, pB->rcCapImage.right, pB->rcCapImage.bottom, … … 481 488 } 482 489 490 static void 491 REBAR_DrawChevron (HDC hdc, INT left, INT top, INT colorRef) 492 { 493 INT x, y; 494 HPEN hPen, hOldPen; 495 496 if (!(hPen = CreatePen( PS_SOLID, 1, GetSysColor( colorRef )))) return; 497 hOldPen = SelectObject ( hdc, hPen ); 498 x = left + 2; 499 y = top; 500 MoveToEx (hdc, x, y, NULL); 501 LineTo (hdc, x+5, y++); x++; 502 MoveToEx (hdc, x, y, NULL); 503 LineTo (hdc, x+3, y++); x++; 504 MoveToEx (hdc, x, y, NULL); 505 LineTo (hdc, x+1, y++); 506 SelectObject( hdc, hOldPen ); 507 DeleteObject( hPen ); 508 } 483 509 484 510 static HWND … … 610 636 } 611 637 638 if (!IsRectEmpty(&lpBand->rcChevron)) 639 { 640 if (lpBand->fDraw & DRAW_CHEVRONPUSHED) 641 { 642 DrawEdge(hdc, &lpBand->rcChevron, BDR_SUNKENOUTER, BF_RECT | BF_MIDDLE); 643 REBAR_DrawChevron(hdc, lpBand->rcChevron.left+1, lpBand->rcChevron.top + 11, COLOR_WINDOWFRAME); 644 } 645 else if (lpBand->fDraw & DRAW_CHEVRONHOT) 646 { 647 DrawEdge(hdc, &lpBand->rcChevron, BDR_RAISEDINNER, BF_RECT | BF_MIDDLE); 648 REBAR_DrawChevron(hdc, lpBand->rcChevron.left, lpBand->rcChevron.top + 10, COLOR_WINDOWFRAME); 649 } 650 else 651 REBAR_DrawChevron(hdc, lpBand->rcChevron.left, lpBand->rcChevron.top + 10, COLOR_WINDOWFRAME); 652 } 653 612 654 if (lpBand->uCDret == (CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYITEMDRAW)) { 613 655 nmcd.dwDrawStage = CDDS_ITEMPOSTPAINT; … … 628 670 { 629 671 REBAR_BAND *lpBand; 630 UINT i , oldrow;672 UINT i; 631 673 632 674 if (!infoPtr->DoRedraw) return; 633 675 634 oldrow = infoPtr->bands[0].iRow;635 676 for (i = 0; i < infoPtr->uNumBands; i++) { 636 677 lpBand = &infoPtr->bands[i]; … … 681 722 (lpBand->rcoldBand.bottom !=lpBand->rcBand.bottom)) { 682 723 lpBand->fDraw |= NTF_INVALIDATE; 683 TRACE("band %d row=%d: changed to (% d,%d)-(%d,%d) from (%d,%d)-(%d,%d)\n",724 TRACE("band %d row=%d: changed to (%ld,%ld)-(%ld,%ld) from (%ld,%ld)-(%ld,%ld)\n", 684 725 i, lpBand->iRow, 685 726 lpBand->rcBand.left, lpBand->rcBand.top, … … 689 730 } 690 731 else 691 TRACE("band %d row=%d: unchanged (% d,%d)-(%d,%d)\n",732 TRACE("band %d row=%d: unchanged (%ld,%ld)-(%ld,%ld)\n", 692 733 i, lpBand->iRow, 693 734 lpBand->rcBand.left, lpBand->rcBand.top, … … 765 806 else 766 807 lpBand->rcBand.right = lpBand->rcBand.left + curwidth; 767 TRACE("Phase 1 band %d, (% d,%d)-(%d,%d), orig x=%d, xsep=%d\n",808 TRACE("Phase 1 band %d, (%ld,%ld)-(%ld,%ld), orig x=%d, xsep=%d\n", 768 809 i, lpBand->rcBand.left, lpBand->rcBand.top, 769 810 lpBand->rcBand.right, lpBand->rcBand.bottom, x, xsep); … … 835 876 else 836 877 lpBand->rcBand.right = lpBand->rcBand.left + curwidth; 837 TRACE("Phase 2 band %d, (% d,%d)-(%d,%d), orig x=%d, xsep=%d\n",878 TRACE("Phase 2 band %d, (%ld,%ld)-(%ld,%ld), orig x=%d, xsep=%d\n", 838 879 i, lpBand->rcBand.left, lpBand->rcBand.top, 839 880 lpBand->rcBand.right, lpBand->rcBand.bottom, x, xsep); … … 951 992 lpBand->rcBand.left+lpBand->cxHeader, lpBand->rcBand.top+yoff, 952 993 lpBand->rcBand.right-xoff, lpBand->rcBand.bottom-yoff); 994 if ((lpBand->fStyle & RBBS_USECHEVRON) && (lpBand->rcChild.right - lpBand->rcChild.left < lpBand->cxIdeal)) 995 { 996 lpBand->rcChild.right -= CHEVRON_WIDTH; 997 SetRect(&lpBand->rcChevron, lpBand->rcChild.right, 998 lpBand->rcChild.top, lpBand->rcChild.right + CHEVRON_WIDTH, 999 lpBand->rcChild.bottom); 1000 } 953 1001 } 954 1002 else { … … 963 1011 (oldChild.bottom-oldChild.top != lpBand->rcChild.bottom-lpBand->rcChild.top))) { 964 1012 TRACE("Child rectangle changed for band %u\n", i); 965 TRACE(" from (% d,%d)-(%d,%d) to (%d,%d)-(%d,%d)\n",1013 TRACE(" from (%ld,%ld)-(%ld,%ld) to (%ld,%ld)-(%ld,%ld)\n", 966 1014 oldChild.left, oldChild.top, 967 1015 oldChild.right, oldChild.bottom, … … 970 1018 } 971 1019 if (lpBand->fDraw & NTF_INVALIDATE) { 972 TRACE("invalidating (% d,%d)-(%d,%d)\n",1020 TRACE("invalidating (%ld,%ld)-(%ld,%ld)\n", 973 1021 lpBand->rcBand.left, 974 1022 lpBand->rcBand.top, … … 1102 1150 (oldChild.bottom-oldChild.top != lpBand->rcChild.bottom-lpBand->rcChild.top))) { 1103 1151 TRACE("Child rectangle changed for band %u\n", i); 1104 TRACE(" from (% d,%d)-(%d,%d) to (%d,%d)-(%d,%d)\n",1152 TRACE(" from (%ld,%ld)-(%ld,%ld) to (%ld,%ld)-(%ld,%ld)\n", 1105 1153 oldChild.left, oldChild.top, 1106 1154 oldChild.right, oldChild.bottom, … … 1109 1157 } 1110 1158 if (lpBand->fDraw & NTF_INVALIDATE) { 1111 TRACE("invalidating (% d,%d)-(%d,%d)\n",1159 TRACE("invalidating (%ld,%ld)-(%ld,%ld)\n", 1112 1160 lpBand->rcBand.left, 1113 1161 lpBand->rcBand.top, … … 1142 1190 GetClientRect (infoPtr->hwndSelf, &rc); 1143 1191 1144 TRACE( " old [%ld x %ld], new [%ld x %ld], client [% d x %d]\n",1192 TRACE( " old [%ld x %ld], new [%ld x %ld], client [%ld x %ld]\n", 1145 1193 infoPtr->oldSize.cx, infoPtr->oldSize.cy, 1146 1194 infoPtr->calcSize.cx, infoPtr->calcSize.cy, … … 1228 1276 infoPtr->hwndSelf, infoPtr->dwStyle, 1229 1277 x, y, width, height); 1230 1231 1278 #ifdef __WIN32OS2__ 1232 1279 //NOTE: this one is causing problems!!!! … … 1271 1318 if (!EqualRect (&lpBand->rcChild, &rbcz.rcChild)) { 1272 1319 TRACE("Child rect changed by NOTIFY for band %u\n", i); 1273 TRACE(" from (% d,%d)-(%d,%d) to (%d,%d)-(%d,%d)\n",1320 TRACE(" from (%ld,%ld)-(%ld,%ld) to (%ld,%ld)-(%ld,%ld)\n", 1274 1321 lpBand->rcChild.left, lpBand->rcChild.top, 1275 1322 lpBand->rcChild.right, lpBand->rcChild.bottom, … … 1302 1349 1303 1350 /* center combo box inside child area */ 1304 TRACE("moving child (Combo(Ex)) %p to (% d,%d) for (%d,%d)\n",1351 TRACE("moving child (Combo(Ex)) %p to (%ld,%d) for (%ld,%d)\n", 1305 1352 lpBand->hwndChild, 1306 1353 lpBand->rcChild.left, yPos, … … 1317 1364 } 1318 1365 else { 1319 TRACE("moving child (Other) %p to (% d,%d) for (%d,%d)\n",1366 TRACE("moving child (Other) %p to (%ld,%ld) for (%ld,%ld)\n", 1320 1367 lpBand->hwndChild, 1321 1368 lpBand->rcChild.left, lpBand->rcChild.top, … … 1377 1424 1378 1425 GetClientRect (infoPtr->hwndSelf, &rcClient); 1379 TRACE("Client is (% d,%d)-(%d,%d)\n",1426 TRACE("Client is (%ld,%ld)-(%ld,%ld)\n", 1380 1427 rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); 1381 1428 1382 1429 if (lpRect) { 1383 1430 rcAdj = *lpRect; 1384 TRACE("adjustment rect is (% d,%d)-(%d,%d)\n",1431 TRACE("adjustment rect is (%ld,%ld)-(%ld,%ld)\n", 1385 1432 rcAdj.left, rcAdj.top, rcAdj.right, rcAdj.bottom); 1386 1433 } … … 1433 1480 lpBand->iRow = row; 1434 1481 1482 SetRectEmpty(&lpBand->rcChevron); 1483 1435 1484 if (HIDDENBAND(lpBand)) continue; 1436 1485 … … 1446 1495 /* separator from previous band */ 1447 1496 cxsep = (cntonrow == 0) ? 0 : SEP_WIDTH; 1448 1449 /* Header: includes gripper, text, image */ 1450 cx = lpBand->cxHeader; 1451 if (lpBand->fStyle & RBBS_FIXEDSIZE) cx = lpBand->lcx; 1497 cx = lpBand->lcx; 1452 1498 1453 1499 if (infoPtr->dwStyle & CCS_VERT) … … 1538 1584 x = rightx; 1539 1585 } 1540 TRACE("P1 band %u, row %d, (% d,%d)-(%d,%d)\n",1586 TRACE("P1 band %u, row %d, (%ld,%ld)-(%ld,%ld)\n", 1541 1587 i, row, 1542 1588 lpBand->rcBand.left, lpBand->rcBand.top, … … 1617 1663 /* y/x current height/width of all rows */ 1618 1664 if (lpRect) { 1619 INT i, j,prev_rh, new_rh, adj_rh, prev_idx, current_idx;1665 INT i, prev_rh, new_rh, adj_rh, prev_idx, current_idx; 1620 1666 REBAR_BAND *prev, *current, *walk; 1667 UINT j; 1621 1668 1622 1669 /* FIXME: problem # 2 */ … … 1625 1672 (x < adjcx) : (y < adjcy) 1626 1673 #else 1627 (adjcx - x > 4) : (adjcy - y > 4)1674 (adjcx - x > 5) : (adjcy - y > 4) 1628 1675 #endif 1629 1676 ) && … … 1678 1725 y += adj_rh; 1679 1726 } 1680 TRACE("P2 moving band %d to own row at (% d,%d)-(%d,%d)\n",1727 TRACE("P2 moving band %d to own row at (%ld,%ld)-(%ld,%ld)\n", 1681 1728 current_idx, 1682 1729 current->rcBand.left, current->rcBand.top, 1683 1730 current->rcBand.right, current->rcBand.bottom); 1684 TRACE("P2 prev band %d at (% d,%d)-(%d,%d)\n",1731 TRACE("P2 prev band %d at (%ld,%ld)-(%ld,%ld)\n", 1685 1732 prev_idx, 1686 1733 prev->rcBand.left, prev->rcBand.top, … … 1713 1760 1714 1761 1715 /* ******* Start Phase 2a - create array of start and end ******* */ 1716 /* indexes by row */ 1717 1718 if (infoPtr->uNumRows != origrows) { 1719 if (infoPtr->rows) COMCTL32_Free (infoPtr->rows); 1720 infoPtr->rows = COMCTL32_Alloc (sizeof (REBAR_ROW) * infoPtr->uNumRows); 1721 } 1722 1723 row = 0; 1724 for (i = 0; i < infoPtr->uNumBands; i++) { 1725 lpBand = &infoPtr->bands[i]; 1726 if (HIDDENBAND(lpBand)) continue; 1727 1728 if (lpBand->iRow > row) { 1729 row++; 1730 infoPtr->rows[row-1].istartband = i; 1731 } 1732 if (row == 0) { 1733 ERR("P2a bug!!!!!!\n"); 1734 } 1735 infoPtr->rows[row-1].iendband = i; 1736 } 1737 1738 for (i = 0; i < infoPtr->uNumRows; i++) { 1739 REBAR_ROW *p; 1740 1741 p = &infoPtr->rows[i]; 1742 TRACE("P2a row %d, starts %d, ends %d\n", 1743 i+1, p->istartband, p->iendband); 1744 } 1745 1746 /* ******* End Phase 2a - create array of start and end ******* */ 1747 /* indexes by row */ 1762 /* ******* Start Phase 2a - mark first and last band in each ******* */ 1763 1764 prevBand = NULL; 1765 for (i = 0; i < infoPtr->uNumBands; i++) { 1766 lpBand = &infoPtr->bands[i]; 1767 if (HIDDENBAND(lpBand)) 1768 continue; 1769 if( !prevBand ) { 1770 lpBand->fDraw |= DRAW_FIRST_IN_ROW; 1771 prevBand = lpBand; 1772 } 1773 else if( prevBand->iRow == lpBand->iRow ) 1774 prevBand = lpBand; 1775 else { 1776 prevBand->fDraw |= DRAW_LAST_IN_ROW; 1777 lpBand->fDraw |= DRAW_FIRST_IN_ROW; 1778 prevBand = lpBand; 1779 } 1780 } 1781 if( prevBand ) 1782 prevBand->fDraw |= DRAW_LAST_IN_ROW; 1783 1784 /* ******* End Phase 2a - mark first and last band in each ******* */ 1748 1785 1749 1786 … … 1755 1792 if (((infoPtr->dwStyle & CCS_VERT) ? clientcx > x : clientcy > y) && 1756 1793 infoPtr->uNumBands) { 1757 INT diff, i, iband, j; 1794 INT diff, i; 1795 UINT j; 1758 1796 1759 1797 diff = (infoPtr->dwStyle & CCS_VERT) ? clientcx - x : clientcy - y; 1760 for (i = infoPtr->uNumRows; i >= 1; i--) { 1761 /* if row has more than 1 band, ignore row */ 1762 if (infoPtr->rows[i-1].istartband != infoPtr->rows[i-1].iendband) 1763 continue; 1764 /* point to only band in row */ 1765 iband = infoPtr->rows[i-1].istartband; 1766 lpBand = &infoPtr->bands[iband]; 1798 1799 /* iterate backwards thru the rows */ 1800 for (i = infoPtr->uNumBands-1; i>=0; i--) { 1801 lpBand = &infoPtr->bands[i]; 1767 1802 if(HIDDENBAND(lpBand)) continue; 1803 1804 /* if row has more than 1 band, ignore it */ 1805 if( !(lpBand->fDraw&DRAW_FIRST_IN_ROW) ) 1806 continue; 1807 if( !(lpBand->fDraw&DRAW_LAST_IN_ROW) ) 1808 continue; 1809 1768 1810 if (lpBand->fMask & RBBS_VARIABLEHEIGHT) continue; 1769 1811 if (((INT)lpBand->cyMaxChild < 1) || … … 1771 1813 if (lpBand->cyMaxChild + lpBand->cyIntegral == 0) continue; 1772 1814 ERR("P2b band %u RBBS_VARIABLEHEIGHT set but cyMax=%d, cyInt=%d\n", 1773 i band, lpBand->cyMaxChild, lpBand->cyIntegral);1815 i, lpBand->cyMaxChild, lpBand->cyIntegral); 1774 1816 continue; 1775 1817 } … … 1784 1826 else 1785 1827 lpBand->rcBand.bottom = lpBand->rcBand.top + j; 1786 TRACE("P2b band %d, row %d changed to (% d,%d)-(%d,%d)\n",1787 i band, lpBand->iRow,1828 TRACE("P2b band %d, row %d changed to (%ld,%ld)-(%ld,%ld)\n", 1829 i, lpBand->iRow, 1788 1830 lpBand->rcBand.left, lpBand->rcBand.top, 1789 1831 lpBand->rcBand.right, lpBand->rcBand.bottom); … … 1806 1848 1807 1849 if (infoPtr->uNumBands) { 1808 REBAR_ROW *p;1850 int startband; 1809 1851 1810 1852 /* If RBS_BANDBORDERS set then indicate to draw bottom separator */ … … 1814 1856 if (infoPtr->dwStyle & RBS_BANDBORDERS) { 1815 1857 1816 for(i = 0; i < infoPtr->uNumRows; i++) { 1817 p = &infoPtr->rows[i]; 1818 for (j = p->istartband; j <= p->iendband; j++) { 1819 lpBand = &infoPtr->bands[j]; 1820 if (HIDDENBAND(lpBand)) continue; 1821 if (j != p->iendband) 1822 lpBand->fDraw |= DRAW_RIGHTSEP; 1823 if (i != infoPtr->uNumRows-1) 1824 lpBand->fDraw |= DRAW_BOTTOMSEP; 1825 } 1858 for (i=0; i<infoPtr->uNumBands; i++) { 1859 lpBand = &infoPtr->bands[i]; 1860 if (HIDDENBAND(lpBand)) 1861 continue; 1862 1863 /* not righthand bands */ 1864 if( !(lpBand->fDraw & DRAW_LAST_IN_ROW) ) 1865 lpBand->fDraw |= DRAW_RIGHTSEP; 1866 1867 /* not the last row */ 1868 if( lpBand->iRow != infoPtr->uNumRows ) 1869 lpBand->fDraw |= DRAW_BOTTOMSEP; 1826 1870 } 1827 1871 } … … 1829 1873 /* Distribute the extra space on the horizontal and adjust */ 1830 1874 /* all bands in row to same height. */ 1831 for (i=1; i<=infoPtr->uNumRows; i++) { 1832 p = &infoPtr->rows[i-1]; 1833 mcy = 0; 1834 1835 TRACE("P3 processing row %d, starting band %d, ending band %d\n", 1836 i, p->istartband, p->iendband); 1837 1838 /* Find the largest height of the bands in the row */ 1839 for (j = p->istartband; j <= p->iendband; j++) { 1840 lpBand = &infoPtr->bands[j]; 1841 if (HIDDENBAND(lpBand)) continue; 1842 if (mcy < ircBw(lpBand)) 1843 mcy = ircBw(lpBand); 1844 } 1845 1846 REBAR_AdjustBands (infoPtr, p->istartband, p->iendband, 1875 mcy = 0; 1876 startband = -1; 1877 for (i=0; i<infoPtr->uNumBands; i++) { 1878 1879 lpBand = &infoPtr->bands[i]; 1880 1881 if( lpBand->fDraw & DRAW_FIRST_IN_ROW ) 1882 { 1883 startband = i; 1884 mcy = 0; 1885 } 1886 1887 if ( (mcy < ircBw(lpBand)) && !HIDDENBAND(lpBand) ) 1888 mcy = ircBw(lpBand); 1889 1890 if( lpBand->fDraw & DRAW_LAST_IN_ROW ) 1891 { 1892 TRACE("P3 processing row %d, starting band %d, ending band %d\n", 1893 lpBand->iRow, startband, i); 1894 if( startband < 0 ) 1895 ERR("Last band %d with no first, row %d\n", i, lpBand->iRow); 1896 1897 REBAR_AdjustBands (infoPtr, startband, i, 1847 1898 (infoPtr->dwStyle & CCS_VERT) ? 1848 1899 clientcy : clientcx, mcy); 1900 } 1849 1901 } 1850 1902 … … 1900 1952 UINT header=0; 1901 1953 UINT textheight=0; 1902 INT i, nonfixed;1954 UINT i, nonfixed; 1903 1955 REBAR_BAND *tBand; 1904 1956 … … 2038 2090 } 2039 2091 2040 static void2092 static BOOL 2041 2093 REBAR_CommonSetupBand (HWND hwnd, LPREBARBANDINFOA lprbbi, REBAR_BAND *lpBand) 2042 2094 /* Function: This routine copies the supplied values from */ 2043 2095 /* user input (lprbbi) to the internal band structure. */ 2044 { 2096 /* It returns true if something changed and false if not. */ 2097 { 2098 BOOL bChanged = FALSE; 2099 2045 2100 lpBand->fMask |= lprbbi->fMask; 2046 2101 2047 if (lprbbi->fMask & RBBIM_STYLE) 2102 if( (lprbbi->fMask & RBBIM_STYLE) && 2103 (lpBand->fStyle != lprbbi->fStyle ) ) 2104 { 2048 2105 lpBand->fStyle = lprbbi->fStyle; 2049 2050 if (lprbbi->fMask & RBBIM_COLORS) { 2106 bChanged = TRUE; 2107 } 2108 2109 if( (lprbbi->fMask & RBBIM_COLORS) && 2110 ( ( lpBand->clrFore != lprbbi->clrFore ) || 2111 ( lpBand->clrBack != lprbbi->clrBack ) ) ) 2112 { 2051 2113 lpBand->clrFore = lprbbi->clrFore; 2052 2114 lpBand->clrBack = lprbbi->clrBack; 2053 } 2054 2055 if (lprbbi->fMask & RBBIM_IMAGE) 2115 bChanged = TRUE; 2116 } 2117 2118 if( (lprbbi->fMask & RBBIM_IMAGE) && 2119 ( lpBand->iImage != lprbbi->iImage ) ) 2120 { 2056 2121 lpBand->iImage = lprbbi->iImage; 2057 2058 if (lprbbi->fMask & RBBIM_CHILD) { 2122 bChanged = TRUE; 2123 } 2124 2125 if( (lprbbi->fMask & RBBIM_CHILD) && 2126 (lprbbi->hwndChild != lpBand->hwndChild ) ) 2127 { 2059 2128 if (lprbbi->hwndChild) { 2060 2129 lpBand->hwndChild = lprbbi->hwndChild; … … 2071 2140 lpBand->hwndPrevParent = 0; 2072 2141 } 2073 } 2074 2075 if (lprbbi->fMask & RBBIM_CHILDSIZE) { 2142 bChanged = TRUE; 2143 } 2144 2145 if( (lprbbi->fMask & RBBIM_CHILDSIZE) && 2146 ( (lpBand->cxMinChild != lprbbi->cxMinChild) || 2147 (lpBand->cyMinChild != lprbbi->cyMinChild ) || 2148 ( (lprbbi->cbSize >= sizeof (REBARBANDINFOA)) && 2149 ( (lpBand->cyChild != lprbbi->cyChild ) || 2150 (lpBand->cyMaxChild != lprbbi->cyMaxChild ) || 2151 (lpBand->cyIntegral != lprbbi->cyIntegral ) ) ) || 2152 ( (lprbbi->cbSize < sizeof (REBARBANDINFOA)) && 2153 ( (lpBand->cyChild || 2154 lpBand->cyMaxChild || 2155 lpBand->cyIntegral ) ) ) ) ) 2156 { 2076 2157 lpBand->cxMinChild = lprbbi->cxMinChild; 2077 2158 lpBand->cyMinChild = lprbbi->cyMinChild; … … 2087 2168 lpBand->cyIntegral = 0; 2088 2169 } 2089 } 2090 2091 if (lprbbi->fMask & RBBIM_SIZE) 2170 bChanged = TRUE; 2171 } 2172 2173 if( (lprbbi->fMask & RBBIM_SIZE) && 2174 (lpBand->cx != lprbbi->cx ) ) 2175 { 2092 2176 lpBand->cx = lprbbi->cx; 2093 2094 if (lprbbi->fMask & RBBIM_BACKGROUND) 2177 bChanged = TRUE; 2178 } 2179 2180 if( (lprbbi->fMask & RBBIM_BACKGROUND) && 2181 ( lpBand->hbmBack != lprbbi->hbmBack ) ) 2182 { 2095 2183 lpBand->hbmBack = lprbbi->hbmBack; 2096 2097 if (lprbbi->fMask & RBBIM_ID) 2184 bChanged = TRUE; 2185 } 2186 2187 if( (lprbbi->fMask & RBBIM_ID) && 2188 (lpBand->wID != lprbbi->wID ) ) 2189 { 2098 2190 lpBand->wID = lprbbi->wID; 2191 bChanged = TRUE; 2192 } 2099 2193 2100 2194 /* check for additional data */ 2101 2195 if (lprbbi->cbSize >= sizeof (REBARBANDINFOA)) { 2102 if (lprbbi->fMask & RBBIM_IDEALSIZE) 2196 if( (lprbbi->fMask & RBBIM_IDEALSIZE) && 2197 ( lpBand->cxIdeal != lprbbi->cxIdeal ) ) 2198 { 2103 2199 lpBand->cxIdeal = lprbbi->cxIdeal; 2104 2105 if (lprbbi->fMask & RBBIM_LPARAM) 2200 bChanged = TRUE; 2201 } 2202 2203 if( (lprbbi->fMask & RBBIM_LPARAM) && 2204 (lpBand->lParam != lprbbi->lParam ) ) 2205 { 2106 2206 lpBand->lParam = lprbbi->lParam; 2107 2108 if (lprbbi->fMask & RBBIM_HEADERSIZE) 2207 bChanged = TRUE; 2208 } 2209 2210 if( (lprbbi->fMask & RBBIM_HEADERSIZE) && 2211 (lpBand->cxHeader != lprbbi->cxHeader ) ) 2212 { 2109 2213 lpBand->cxHeader = lprbbi->cxHeader; 2110 } 2214 bChanged = TRUE; 2215 } 2216 } 2217 2218 return bChanged; 2111 2219 } 2112 2220 … … 2119 2227 { 2120 2228 REBAR_BAND *lpBand; 2121 INT i, oldrow; 2229 UINT i; 2230 INT oldrow; 2122 2231 HDC hdc = (HDC)wParam; 2123 2232 RECT rect; … … 2145 2254 DrawEdge (hdc, &rcRowSep, EDGE_ETCHED, BF_BOTTOM); 2146 2255 } 2147 TRACE ("drawing band separator bottom (% d,%d)-(%d,%d)\n",2256 TRACE ("drawing band separator bottom (%ld,%ld)-(%ld,%ld)\n", 2148 2257 rcRowSep.left, rcRowSep.top, 2149 2258 rcRowSep.right, rcRowSep.bottom); … … 2163 2272 DrawEdge (hdc, &rcSep, EDGE_ETCHED, BF_RIGHT); 2164 2273 } 2165 TRACE("drawing band separator right (% d,%d)-(%d,%d)\n",2274 TRACE("drawing band separator right (%ld,%ld)-(%ld,%ld)\n", 2166 2275 rcSep.left, rcSep.top, rcSep.right, rcSep.bottom); 2167 2276 } … … 2190 2299 2191 2300 rect = lpBand->rcBand; 2192 TRACE("%s background color=0x%06lx, band (% d,%d)-(%d,%d), clip (%d,%d)-(%d,%d)\n",2301 TRACE("%s background color=0x%06lx, band (%ld,%ld)-(%ld,%ld), clip (%ld,%ld)-(%ld,%ld)\n", 2193 2302 (lpBand->clrBack == CLR_NONE) ? "none" : 2194 2303 ((lpBand->clrBack == CLR_DEFAULT) ? "dft" : ""), … … 2206 2315 2207 2316 static void 2208 REBAR_InternalHitTest (REBAR_INFO *infoPtr, LPPOINT lpPt, UINT *pFlags, INT *pBand)2317 REBAR_InternalHitTest (REBAR_INFO *infoPtr, const LPPOINT lpPt, UINT *pFlags, INT *pBand) 2209 2318 { 2210 2319 REBAR_BAND *lpBand; 2211 2320 RECT rect; 2212 INT iCount;2321 UINT iCount; 2213 2322 2214 2323 GetClientRect (infoPtr->hwndSelf, &rect); … … 2226 2335 else { 2227 2336 /* somewhere inside */ 2228 infoPtr->ihitBand = -1;2229 2337 for (iCount = 0; iCount < infoPtr->uNumBands; iCount++) { 2230 2338 lpBand = &infoPtr->bands[iCount]; … … 2235 2343 if (PtInRect (&lpBand->rcGripper, *lpPt)) { 2236 2344 *pFlags = RBHT_GRABBER; 2237 infoPtr->ihitBand = iCount;2238 2345 TRACE("ON GRABBER %d\n", iCount); 2239 2346 return; … … 2254 2361 return; 2255 2362 } 2363 else if (PtInRect (&lpBand->rcChevron, *lpPt)) { 2364 *pFlags = RBHT_CHEVRON; 2365 TRACE("ON CHEVRON %d\n", iCount); 2366 return; 2367 } 2256 2368 else { 2257 2369 *pFlags = RBHT_NOWHERE; … … 2277 2389 return; 2278 2390 } 2279 2280 TRACE("flags=0x%X\n", *pFlags);2281 return;2282 2391 } 2283 2392 … … 2344 2453 READJ(band, Readjust); 2345 2454 2346 TRACE("band %d: left=%d, right=%d, move=%d, rtn=%d, rcBand=(% d,%d)-(%d,%d)\n",2455 TRACE("band %d: left=%d, right=%d, move=%d, rtn=%d, rcBand=(%ld,%ld)-(%ld,%ld)\n", 2347 2456 i, Leadjust, Readjust, movement, ret, 2348 2457 band->rcBand.left, band->rcBand.top, … … 2375 2484 infoPtr->dragStart.y = 0; 2376 2485 infoPtr->dragNow = infoPtr->dragStart; 2377 infoPtr->i hitBand = -1;2486 infoPtr->iGrabbedBand = -1; 2378 2487 ReleaseCapture (); 2379 2488 return ; … … 2382 2491 } 2383 2492 2384 ihitBand = infoPtr->i hitBand;2493 ihitBand = infoPtr->iGrabbedBand; 2385 2494 hitBand = &infoPtr->bands[ihitBand]; 2386 2495 imaxdBand = ihitBand; /* to suppress warning message */ … … 2527 2636 if ((lpBand->fMask & RBBIM_CHILD) && lpBand->hwndChild) 2528 2637 childhwnd = lpBand->hwndChild; 2529 COMCTL32_Free (infoPtr->bands);2638 Free (infoPtr->bands); 2530 2639 infoPtr->bands = NULL; 2531 2640 infoPtr->uNumBands = 0; … … 2539 2648 2540 2649 infoPtr->uNumBands--; 2541 infoPtr->bands = COMCTL32_Alloc (sizeof (REBAR_BAND) * infoPtr->uNumBands);2650 infoPtr->bands = Alloc (sizeof (REBAR_BAND) * infoPtr->uNumBands); 2542 2651 if (uBand > 0) { 2543 2652 memcpy (&infoPtr->bands[0], &oldBands[0], … … 2550 2659 } 2551 2660 2552 COMCTL32_Free (oldBands);2661 Free (oldBands); 2553 2662 } 2554 2663 … … 2631 2740 if (lprbbi == NULL) 2632 2741 return FALSE; 2633 if (lprbbi->cbSize < REBARBANDINFO _V3_SIZEA)2742 if (lprbbi->cbSize < REBARBANDINFOA_V3_SIZE) 2634 2743 return FALSE; 2635 2744 if ((UINT)wParam >= infoPtr->uNumBands) … … 2717 2826 if (lprbbi == NULL) 2718 2827 return FALSE; 2719 if (lprbbi->cbSize < REBARBANDINFO _V3_SIZEW)2828 if (lprbbi->cbSize < REBARBANDINFOW_V3_SIZE) 2720 2829 return FALSE; 2721 2830 if ((UINT)wParam >= infoPtr->uNumBands) … … 2868 2977 CopyRect (lprc, &lpBand->rcBand); 2869 2978 2870 TRACE("band %d, (% d,%d)-(%d,%d)\n", iBand,2979 TRACE("band %d, (%ld,%ld)-(%ld,%ld)\n", iBand, 2871 2980 lprc->left, lprc->top, lprc->right, lprc->bottom); 2872 2981 … … 2888 2997 { 2889 2998 INT iRow = (INT)wParam; 2890 int ret = 0;2891 int i, j = 0;2999 int j = 0, ret = 0; 3000 UINT i; 2892 3001 REBAR_BAND *lpBand; 2893 3002 … … 2991 3100 if (lprbbi == NULL) 2992 3101 return FALSE; 2993 if (lprbbi->cbSize < REBARBANDINFO _V3_SIZEA)3102 if (lprbbi->cbSize < REBARBANDINFOA_V3_SIZE) 2994 3103 return FALSE; 2995 3104 … … 2999 3108 3000 3109 if (infoPtr->uNumBands == 0) { 3001 infoPtr->bands = (REBAR_BAND *) COMCTL32_Alloc (sizeof (REBAR_BAND));3110 infoPtr->bands = (REBAR_BAND *)Alloc (sizeof (REBAR_BAND)); 3002 3111 uIndex = 0; 3003 3112 } … … 3005 3114 REBAR_BAND *oldBands = infoPtr->bands; 3006 3115 infoPtr->bands = 3007 (REBAR_BAND *) COMCTL32_Alloc ((infoPtr->uNumBands+1)*sizeof(REBAR_BAND));3116 (REBAR_BAND *)Alloc ((infoPtr->uNumBands+1)*sizeof(REBAR_BAND)); 3008 3117 if (((INT)uIndex == -1) || (uIndex > infoPtr->uNumBands)) 3009 3118 uIndex = infoPtr->uNumBands; … … 3021 3130 } 3022 3131 3023 COMCTL32_Free (oldBands);3132 Free (oldBands); 3024 3133 } 3025 3134 … … 3042 3151 INT len = MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, NULL, 0 ); 3043 3152 if (len > 1) { 3044 lpBand->lpText = (LPWSTR) COMCTL32_Alloc (len*sizeof(WCHAR));3153 lpBand->lpText = (LPWSTR)Alloc (len*sizeof(WCHAR)); 3045 3154 MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, lpBand->lpText, len ); 3046 3155 } … … 3072 3181 if (lprbbi == NULL) 3073 3182 return FALSE; 3074 if (lprbbi->cbSize < REBARBANDINFO _V3_SIZEW)3183 if (lprbbi->cbSize < REBARBANDINFOW_V3_SIZE) 3075 3184 return FALSE; 3076 3185 … … 3080 3189 3081 3190 if (infoPtr->uNumBands == 0) { 3082 infoPtr->bands = (REBAR_BAND *) COMCTL32_Alloc (sizeof (REBAR_BAND));3191 infoPtr->bands = (REBAR_BAND *)Alloc (sizeof (REBAR_BAND)); 3083 3192 uIndex = 0; 3084 3193 } … … 3086 3195 REBAR_BAND *oldBands = infoPtr->bands; 3087 3196 infoPtr->bands = 3088 (REBAR_BAND *) COMCTL32_Alloc ((infoPtr->uNumBands+1)*sizeof(REBAR_BAND));3197 (REBAR_BAND *)Alloc ((infoPtr->uNumBands+1)*sizeof(REBAR_BAND)); 3089 3198 if (((INT)uIndex == -1) || (uIndex > infoPtr->uNumBands)) 3090 3199 uIndex = infoPtr->uNumBands; … … 3097 3206 3098 3207 /* post copy */ 3099 if (uIndex < infoPtr->uNumBands - 1) {3208 if (uIndex <= infoPtr->uNumBands - 1) { 3100 3209 memcpy (&infoPtr->bands[uIndex+1], &oldBands[uIndex], 3101 (infoPtr->uNumBands - uIndex - 1) * sizeof(REBAR_BAND));3102 } 3103 3104 COMCTL32_Free (oldBands);3210 (infoPtr->uNumBands - uIndex) * sizeof(REBAR_BAND)); 3211 } 3212 3213 Free (oldBands); 3105 3214 } 3106 3215 … … 3123 3232 INT len = lstrlenW (lprbbi->lpText); 3124 3233 if (len > 0) { 3125 lpBand->lpText = (LPWSTR) COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));3234 lpBand->lpText = (LPWSTR)Alloc ((len + 1)*sizeof(WCHAR)); 3126 3235 strcpyW (lpBand->lpText, lprbbi->lpText); 3127 3236 } … … 3131 3240 /* On insert of second band, revalidate band 1 to possible add gripper */ 3132 3241 if (infoPtr->uNumBands == 2) 3133 REBAR_ValidateBand (infoPtr, &infoPtr->bands[ 0]);3242 REBAR_ValidateBand (infoPtr, &infoPtr->bands[uIndex ? 0 : 1]); 3134 3243 3135 3244 REBAR_DumpBand (infoPtr); … … 3212 3321 lpBand->cxHeader; 3213 3322 if (movement < 0) { 3214 ERR("something is wrong, band=(% d,%d)-(%d,%d), cxheader=%d\n",3323 ERR("something is wrong, band=(%ld,%ld)-(%ld,%ld), cxheader=%d\n", 3215 3324 lpBand->rcBand.left, lpBand->rcBand.top, 3216 3325 lpBand->rcBand.right, lpBand->rcBand.bottom, … … 3333 3442 memcpy (&holder, &oldBands[uFrom], sizeof(REBAR_BAND)); 3334 3443 3335 /* close up rest of bands (ps uedo delete) */3444 /* close up rest of bands (pseudo delete) */ 3336 3445 if (uFrom < infoPtr->uNumBands - 1) { 3337 3446 memcpy (&oldBands[uFrom], &oldBands[uFrom+1], … … 3341 3450 /* allocate new space and copy rest of bands into it */ 3342 3451 infoPtr->bands = 3343 (REBAR_BAND *) COMCTL32_Alloc ((infoPtr->uNumBands)*sizeof(REBAR_BAND));3452 (REBAR_BAND *)Alloc ((infoPtr->uNumBands)*sizeof(REBAR_BAND)); 3344 3453 3345 3454 /* pre insert copy */ … … 3358 3467 } 3359 3468 3360 COMCTL32_Free (oldBands);3469 Free (oldBands); 3361 3470 3362 3471 TRACE("moved band %d to index %d\n", uFrom, uTo); … … 3377 3486 3378 3487 3488 /* return TRUE if two strings are different */ 3489 static BOOL 3490 REBAR_strdifW( LPCWSTR a, LPCWSTR b ) 3491 { 3492 return ( (a && !b) || (b && !a) || (a && b && lstrcmpW(a, b) ) ); 3493 } 3494 3379 3495 static LRESULT 3380 3496 REBAR_SetBandInfoA (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) … … 3382 3498 LPREBARBANDINFOA lprbbi = (LPREBARBANDINFOA)lParam; 3383 3499 REBAR_BAND *lpBand; 3500 BOOL bChanged; 3384 3501 3385 3502 if (lprbbi == NULL) 3386 3503 return FALSE; 3387 if (lprbbi->cbSize < REBARBANDINFO _V3_SIZEA)3504 if (lprbbi->cbSize < REBARBANDINFOA_V3_SIZE) 3388 3505 return FALSE; 3389 3506 if ((UINT)wParam >= infoPtr->uNumBands) … … 3396 3513 lpBand = &infoPtr->bands[(UINT)wParam]; 3397 3514 3398 REBAR_CommonSetupBand (infoPtr->hwndSelf, lprbbi, lpBand);3515 bChanged = REBAR_CommonSetupBand (infoPtr->hwndSelf, lprbbi, lpBand); 3399 3516 if (lprbbi->fMask & RBBIM_TEXT) { 3400 if (lpBand->lpText) { 3401 COMCTL32_Free (lpBand->lpText); 3402 lpBand->lpText = NULL; 3403 } 3404 if (lprbbi->lpText) { 3405 INT len = MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, NULL, 0 ); 3406 lpBand->lpText = (LPWSTR)COMCTL32_Alloc (len*sizeof(WCHAR)); 3407 MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, lpBand->lpText, len ); 3408 } 3517 LPWSTR wstr = NULL; 3518 3519 if (lprbbi->lpText) 3520 { 3521 INT len; 3522 len = MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, NULL, 0 ); 3523 if (len > 1) 3524 wstr = (LPWSTR)Alloc (len*sizeof(WCHAR)); 3525 if (wstr) 3526 MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, wstr, len ); 3527 } 3528 if (REBAR_strdifW(lpBand->lpText, wstr)) { 3529 if (lpBand->lpText) { 3530 Free (lpBand->lpText); 3531 lpBand->lpText = NULL; 3532 } 3533 if (wstr) { 3534 lpBand->lpText = wstr; 3535 wstr = NULL; 3536 } 3537 bChanged = TRUE; 3538 } 3539 if (wstr) 3540 Free (wstr); 3409 3541 } 3410 3542 … … 3413 3545 REBAR_DumpBand (infoPtr); 3414 3546 3415 if ( lprbbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE)) {3547 if (bChanged && (lprbbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE))) { 3416 3548 REBAR_Layout (infoPtr, NULL, TRUE, FALSE); 3417 3549 InvalidateRect(infoPtr->hwndSelf, 0, 1); … … 3421 3553 } 3422 3554 3423 3424 3555 static LRESULT 3425 3556 REBAR_SetBandInfoW (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) … … 3427 3558 LPREBARBANDINFOW lprbbi = (LPREBARBANDINFOW)lParam; 3428 3559 REBAR_BAND *lpBand; 3560 BOOL bChanged; 3429 3561 3430 3562 if (lprbbi == NULL) 3431 3563 return FALSE; 3432 if (lprbbi->cbSize < REBARBANDINFO _V3_SIZEW)3564 if (lprbbi->cbSize < REBARBANDINFOW_V3_SIZE) 3433 3565 return FALSE; 3434 3566 if ((UINT)wParam >= infoPtr->uNumBands) … … 3441 3573 lpBand = &infoPtr->bands[(UINT)wParam]; 3442 3574 3443 REBAR_CommonSetupBand (infoPtr->hwndSelf, (LPREBARBANDINFOA)lprbbi, lpBand); 3444 if (lprbbi->fMask & RBBIM_TEXT) { 3575 bChanged = REBAR_CommonSetupBand (infoPtr->hwndSelf, (LPREBARBANDINFOA)lprbbi, lpBand); 3576 if( (lprbbi->fMask & RBBIM_TEXT) && 3577 REBAR_strdifW( lpBand->lpText, lprbbi->lpText ) ) { 3445 3578 if (lpBand->lpText) { 3446 COMCTL32_Free (lpBand->lpText);3579 Free (lpBand->lpText); 3447 3580 lpBand->lpText = NULL; 3448 3581 } 3449 3582 if (lprbbi->lpText) { 3450 3583 INT len = lstrlenW (lprbbi->lpText); 3451 lpBand->lpText = (LPWSTR)COMCTL32_Alloc ((len + 1)*sizeof(WCHAR)); 3452 strcpyW (lpBand->lpText, lprbbi->lpText); 3453 } 3584 if (len > 0) 3585 { 3586 lpBand->lpText = (LPWSTR)Alloc ((len + 1)*sizeof(WCHAR)); 3587 strcpyW (lpBand->lpText, lprbbi->lpText); 3588 } 3589 } 3590 bChanged = TRUE; 3454 3591 } 3455 3592 … … 3458 3595 REBAR_DumpBand (infoPtr); 3459 3596 3460 if ( lprbbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE)) {3597 if ( bChanged && (lprbbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE)) ) { 3461 3598 REBAR_Layout (infoPtr, NULL, TRUE, FALSE); 3462 3599 InvalidateRect(infoPtr->hwndSelf, 0, 1); … … 3608 3745 } 3609 3746 3747 infoPtr->fStatus |= BAND_NEEDS_LAYOUT; 3610 3748 REBAR_Layout (infoPtr, NULL, TRUE, FALSE); 3611 3749 InvalidateRect(infoPtr->hwndSelf, 0, 1); … … 3624 3762 return FALSE; 3625 3763 3626 TRACE("[% d %d %d %d]\n",3764 TRACE("[%ld %ld %ld %ld]\n", 3627 3765 lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); 3628 3766 3629 3767 /* what is going on???? */ 3630 3768 GetWindowRect(infoPtr->hwndSelf, &t1); 3631 TRACE("window rect [% d %d %d %d]\n",3769 TRACE("window rect [%ld %ld %ld %ld]\n", 3632 3770 t1.left, t1.top, t1.right, t1.bottom); 3633 3771 GetClientRect(infoPtr->hwndSelf, &t1); 3634 TRACE("client rect [% d %d %d %d]\n",3772 TRACE("client rect [%ld %ld %ld %ld]\n", 3635 3773 t1.left, t1.top, t1.right, t1.bottom); 3636 3774 … … 3654 3792 GetWindowRect(infoPtr->hwndSelf, &wnrc1); 3655 3793 GetClientRect(infoPtr->hwndSelf, &clrc1); 3656 TRACE("window=(% d,%d)-(%d,%d) client=(%d,%d)-(%d,%d) cs=(%d,%d %dx%d)\n",3794 TRACE("window=(%ld,%ld)-(%ld,%ld) client=(%ld,%ld)-(%ld,%ld) cs=(%d,%d %dx%d)\n", 3657 3795 wnrc1.left, wnrc1.top, wnrc1.right, wnrc1.bottom, 3658 3796 clrc1.left, clrc1.top, clrc1.right, clrc1.bottom, … … 3669 3807 { 3670 3808 REBAR_BAND *lpBand; 3671 INT i;3809 UINT i; 3672 3810 3673 3811 … … 3680 3818 /* delete text strings */ 3681 3819 if (lpBand->lpText) { 3682 COMCTL32_Free (lpBand->lpText);3820 Free (lpBand->lpText); 3683 3821 lpBand->lpText = NULL; 3684 3822 } … … 3688 3826 3689 3827 /* free band array */ 3690 COMCTL32_Free (infoPtr->bands);3828 Free (infoPtr->bands); 3691 3829 infoPtr->bands = NULL; 3692 3830 } … … 3700 3838 3701 3839 /* free rebar info data */ 3702 COMCTL32_Free (infoPtr);3840 Free (infoPtr); 3703 3841 TRACE("destroyed!\n"); 3704 3842 return 0; … … 3723 3861 } 3724 3862 3863 static LRESULT 3864 REBAR_PushChevron(REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) 3865 { 3866 if (wParam >= 0 && (UINT)wParam < infoPtr->uNumBands) 3867 { 3868 NMREBARCHEVRON nmrbc; 3869 REBAR_BAND *lpBand = &infoPtr->bands[wParam]; 3870 3871 TRACE("Pressed chevron on band %d\n", wParam); 3872 3873 /* redraw chevron in pushed state */ 3874 lpBand->fDraw |= DRAW_CHEVRONPUSHED; 3875 RedrawWindow(infoPtr->hwndSelf, &lpBand->rcChevron,0, 3876 RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW); 3877 3878 /* notify app so it can display a popup menu or whatever */ 3879 nmrbc.uBand = wParam; 3880 nmrbc.wID = lpBand->wID; 3881 nmrbc.lParam = lpBand->lParam; 3882 nmrbc.rc = lpBand->rcChevron; 3883 nmrbc.lParamNM = lParam; 3884 REBAR_Notify((NMHDR*)&nmrbc, infoPtr, RBN_CHEVRONPUSHED); 3885 3886 /* redraw chevron in previous state */ 3887 lpBand->fDraw &= ~DRAW_CHEVRONPUSHED; 3888 InvalidateRect(infoPtr->hwndSelf, &lpBand->rcChevron, TRUE); 3889 3890 return TRUE; 3891 } 3892 return FALSE; 3893 } 3725 3894 3726 3895 static LRESULT … … 3728 3897 { 3729 3898 REBAR_BAND *lpBand; 3730 3731 /* If InternalHitTest did not find a hit on the Gripper, */ 3732 /* then ignore the button click. */ 3733 if (infoPtr->ihitBand == -1) return 0; 3734 3735 SetCapture (infoPtr->hwndSelf); 3736 3737 /* save off the LOWORD and HIWORD of lParam as initial x,y */ 3738 lpBand = &infoPtr->bands[infoPtr->ihitBand]; 3739 infoPtr->dragStart = MAKEPOINTS(lParam); 3740 infoPtr->dragNow = infoPtr->dragStart; 3741 if (infoPtr->dwStyle & CCS_VERT) 3742 infoPtr->ihitoffset = infoPtr->dragStart.y - (lpBand->rcBand.top+REBAR_PRE_GRIPPER); 3743 else 3744 infoPtr->ihitoffset = infoPtr->dragStart.x - (lpBand->rcBand.left+REBAR_PRE_GRIPPER); 3745 3899 UINT htFlags; 3900 UINT iHitBand; 3901 POINT ptMouseDown; 3902 ptMouseDown.x = (INT)LOWORD(lParam); 3903 ptMouseDown.y = (INT)HIWORD(lParam); 3904 3905 REBAR_InternalHitTest(infoPtr, &ptMouseDown, &htFlags, &iHitBand); 3906 lpBand = &infoPtr->bands[iHitBand]; 3907 3908 if (htFlags == RBHT_CHEVRON) 3909 { 3910 REBAR_PushChevron(infoPtr, iHitBand, 0); 3911 } 3912 else if (htFlags == RBHT_GRABBER || htFlags == RBHT_CAPTION) 3913 { 3914 TRACE("Starting drag\n"); 3915 3916 SetCapture (infoPtr->hwndSelf); 3917 infoPtr->iGrabbedBand = iHitBand; 3918 3919 /* save off the LOWORD and HIWORD of lParam as initial x,y */ 3920 infoPtr->dragStart = MAKEPOINTS(lParam); 3921 infoPtr->dragNow = infoPtr->dragStart; 3922 if (infoPtr->dwStyle & CCS_VERT) 3923 infoPtr->ihitoffset = infoPtr->dragStart.y - (lpBand->rcBand.top+REBAR_PRE_GRIPPER); 3924 else 3925 infoPtr->ihitoffset = infoPtr->dragStart.x - (lpBand->rcBand.left+REBAR_PRE_GRIPPER); 3926 } 3746 3927 return 0; 3747 3928 } 3748 3749 3929 3750 3930 static LRESULT 3751 3931 REBAR_LButtonUp (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) 3752 3932 { 3753 NMHDR layout; 3754 RECT rect; 3755 INT ihitBand; 3756 3757 /* If InternalHitTest did not find a hit on the Gripper, */ 3758 /* then ignore the button click. */ 3759 if (infoPtr->ihitBand == -1) return 0; 3760 3761 ihitBand = infoPtr->ihitBand; 3762 infoPtr->dragStart.x = 0; 3763 infoPtr->dragStart.y = 0; 3764 infoPtr->dragNow = infoPtr->dragStart; 3765 infoPtr->ihitBand = -1; 3766 3767 ReleaseCapture (); 3768 3769 if (infoPtr->fStatus & BEGIN_DRAG_ISSUED) { 3770 REBAR_Notify((NMHDR *) &layout, infoPtr, RBN_LAYOUTCHANGED); 3771 REBAR_Notify_NMREBAR (infoPtr, ihitBand, RBN_ENDDRAG); 3772 infoPtr->fStatus &= ~BEGIN_DRAG_ISSUED; 3773 } 3774 3775 GetClientRect(infoPtr->hwndSelf, &rect); 3776 InvalidateRect(infoPtr->hwndSelf, NULL, TRUE); 3933 if (infoPtr->iGrabbedBand >= 0) 3934 { 3935 NMHDR layout; 3936 RECT rect; 3937 3938 infoPtr->dragStart.x = 0; 3939 infoPtr->dragStart.y = 0; 3940 infoPtr->dragNow = infoPtr->dragStart; 3941 3942 ReleaseCapture (); 3943 3944 if (infoPtr->fStatus & BEGIN_DRAG_ISSUED) { 3945 REBAR_Notify(&layout, infoPtr, RBN_LAYOUTCHANGED); 3946 REBAR_Notify_NMREBAR (infoPtr, infoPtr->iGrabbedBand, RBN_ENDDRAG); 3947 infoPtr->fStatus &= ~BEGIN_DRAG_ISSUED; 3948 } 3949 3950 infoPtr->iGrabbedBand = -1; 3951 3952 GetClientRect(infoPtr->hwndSelf, &rect); 3953 InvalidateRect(infoPtr->hwndSelf, NULL, TRUE); 3954 } 3777 3955 3778 3956 return 0; 3779 3957 } 3780 3958 3959 static LRESULT 3960 REBAR_MouseLeave (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) 3961 { 3962 if (infoPtr->ichevronhotBand >= 0) 3963 { 3964 REBAR_BAND *lpChevronBand = &infoPtr->bands[infoPtr->ichevronhotBand]; 3965 if (lpChevronBand->fDraw & DRAW_CHEVRONHOT) 3966 { 3967 lpChevronBand->fDraw &= ~DRAW_CHEVRONHOT; 3968 InvalidateRect(infoPtr->hwndSelf, &lpChevronBand->rcChevron, TRUE); 3969 } 3970 } 3971 infoPtr->iOldBand = -1; 3972 infoPtr->ichevronhotBand = -2; 3973 3974 return TRUE; 3975 } 3781 3976 3782 3977 static LRESULT 3783 3978 REBAR_MouseMove (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) 3784 3979 { 3785 REBAR_BAND * band1, *band2;3980 REBAR_BAND *lpChevronBand; 3786 3981 POINTS ptsmove; 3787 3982 3788 /* Validate entry as hit on Gripper has occurred */3789 if (GetCapture() != infoPtr->hwndSelf) return 0;3790 if (infoPtr->ihitBand == -1) return 0;3791 3792 3983 ptsmove = MAKEPOINTS(lParam); 3793 3984 3794 /* if mouse did not move much, exit */ 3795 if ((abs(ptsmove.x - infoPtr->dragNow.x) <= mindragx) && 3796 (abs(ptsmove.y - infoPtr->dragNow.y) <= mindragy)) return 0; 3797 3798 band1 = &infoPtr->bands[infoPtr->ihitBand-1]; 3799 band2 = &infoPtr->bands[infoPtr->ihitBand]; 3800 3801 /* Test for valid drag case - must not be first band in row */ 3802 if (infoPtr->dwStyle & CCS_VERT) { 3803 if ((ptsmove.x < band2->rcBand.left) || 3804 (ptsmove.x > band2->rcBand.right) || 3805 ((infoPtr->ihitBand > 0) && (band1->iRow != band2->iRow))) { 3806 FIXME("Cannot drag to other rows yet!!\n"); 3807 } 3808 else { 3809 REBAR_HandleLRDrag (infoPtr, &ptsmove); 3810 } 3811 } 3812 else { 3813 if ((ptsmove.y < band2->rcBand.top) || 3814 (ptsmove.y > band2->rcBand.bottom) || 3815 ((infoPtr->ihitBand > 0) && (band1->iRow != band2->iRow))) { 3816 FIXME("Cannot drag to other rows yet!!\n"); 3817 } 3818 else { 3819 REBAR_HandleLRDrag (infoPtr, &ptsmove); 3820 } 3821 } 3985 /* if we are currently dragging a band */ 3986 if (infoPtr->iGrabbedBand >= 0) 3987 { 3988 REBAR_BAND *band1, *band2; 3989 3990 if (GetCapture() != infoPtr->hwndSelf) 3991 ERR("We are dragging but haven't got capture?!?\n"); 3992 3993 band1 = &infoPtr->bands[infoPtr->iGrabbedBand-1]; 3994 band2 = &infoPtr->bands[infoPtr->iGrabbedBand]; 3995 3996 /* if mouse did not move much, exit */ 3997 if ((abs(ptsmove.x - infoPtr->dragNow.x) <= mindragx) && 3998 (abs(ptsmove.y - infoPtr->dragNow.y) <= mindragy)) return 0; 3999 4000 /* Test for valid drag case - must not be first band in row */ 4001 if (infoPtr->dwStyle & CCS_VERT) { 4002 if ((ptsmove.x < band2->rcBand.left) || 4003 (ptsmove.x > band2->rcBand.right) || 4004 ((infoPtr->iGrabbedBand > 0) && (band1->iRow != band2->iRow))) { 4005 FIXME("Cannot drag to other rows yet!!\n"); 4006 } 4007 else { 4008 REBAR_HandleLRDrag (infoPtr, &ptsmove); 4009 } 4010 } 4011 else { 4012 if ((ptsmove.y < band2->rcBand.top) || 4013 (ptsmove.y > band2->rcBand.bottom) || 4014 ((infoPtr->iGrabbedBand > 0) && (band1->iRow != band2->iRow))) { 4015 FIXME("Cannot drag to other rows yet!!\n"); 4016 } 4017 else { 4018 REBAR_HandleLRDrag (infoPtr, &ptsmove); 4019 } 4020 } 4021 } 4022 else 4023 { 4024 POINT ptMove; 4025 INT iHitBand; 4026 UINT htFlags; 4027 TRACKMOUSEEVENT trackinfo; 4028 4029 ptMove.x = (INT)ptsmove.x; 4030 ptMove.y = (INT)ptsmove.y; 4031 REBAR_InternalHitTest(infoPtr, &ptMove, &htFlags, &iHitBand); 4032 4033 if (infoPtr->iOldBand >= 0 && infoPtr->iOldBand == infoPtr->ichevronhotBand) 4034 { 4035 lpChevronBand = &infoPtr->bands[infoPtr->ichevronhotBand]; 4036 if (lpChevronBand->fDraw & DRAW_CHEVRONHOT) 4037 { 4038 lpChevronBand->fDraw &= ~DRAW_CHEVRONHOT; 4039 InvalidateRect(infoPtr->hwndSelf, &lpChevronBand->rcChevron, TRUE); 4040 } 4041 infoPtr->ichevronhotBand = -2; 4042 } 4043 4044 if (htFlags == RBHT_CHEVRON) 4045 { 4046 /* fill in the TRACKMOUSEEVENT struct */ 4047 trackinfo.cbSize = sizeof(TRACKMOUSEEVENT); 4048 trackinfo.dwFlags = TME_QUERY; 4049 trackinfo.hwndTrack = infoPtr->hwndSelf; 4050 trackinfo.dwHoverTime = 0; 4051 4052 /* call _TrackMouseEvent to see if we are currently tracking for this hwnd */ 4053 _TrackMouseEvent(&trackinfo); 4054 4055 /* Make sure tracking is enabled so we receive a WM_MOUSELEAVE message */ 4056 if(!(trackinfo.dwFlags & TME_LEAVE)) 4057 { 4058 trackinfo.dwFlags = TME_LEAVE; /* notify upon leaving */ 4059 4060 /* call TRACKMOUSEEVENT so we receive a WM_MOUSELEAVE message */ 4061 /* and can properly deactivate the hot chevron */ 4062 _TrackMouseEvent(&trackinfo); 4063 } 4064 4065 lpChevronBand = &infoPtr->bands[iHitBand]; 4066 if (!(lpChevronBand->fDraw & DRAW_CHEVRONHOT)) 4067 { 4068 lpChevronBand->fDraw |= DRAW_CHEVRONHOT; 4069 InvalidateRect(infoPtr->hwndSelf, &lpChevronBand->rcChevron, TRUE); 4070 infoPtr->ichevronhotBand = iHitBand; 4071 } 4072 } 4073 infoPtr->iOldBand = iHitBand; 4074 } 4075 3822 4076 return 0; 3823 4077 } … … 3831 4085 -GetSystemMetrics(SM_CYEDGE)); 3832 4086 } 3833 TRACE("new client=(% d,%d)-(%d,%d)\n",4087 TRACE("new client=(%ld,%ld)-(%ld,%ld)\n", 3834 4088 ((LPRECT)lParam)->left, ((LPRECT)lParam)->top, 3835 4089 ((LPRECT)lParam)->right, ((LPRECT)lParam)->bottom); … … 3856 4110 GetWindowRect(hwnd, &wnrc1); 3857 4111 GetClientRect(hwnd, &clrc1); 3858 TRACE("window=(% d,%d)-(%d,%d) client=(%d,%d)-(%d,%d) cs=(%d,%d %dx%d)\n",4112 TRACE("window=(%ld,%ld)-(%ld,%ld) client=(%ld,%ld)-(%ld,%ld) cs=(%d,%d %dx%d)\n", 3859 4113 wnrc1.left, wnrc1.top, wnrc1.right, wnrc1.bottom, 3860 4114 clrc1.left, clrc1.top, clrc1.right, clrc1.bottom, … … 3863 4117 3864 4118 /* allocate memory for info structure */ 3865 infoPtr = (REBAR_INFO *) COMCTL32_Alloc (sizeof(REBAR_INFO));4119 infoPtr = (REBAR_INFO *)Alloc (sizeof(REBAR_INFO)); 3866 4120 SetWindowLongA (hwnd, 0, (DWORD)infoPtr); 3867 4121 … … 3871 4125 infoPtr->clrBtnText = GetSysColor (COLOR_BTNTEXT); 3872 4126 infoPtr->clrBtnFace = GetSysColor (COLOR_BTNFACE); 3873 infoPtr->ihitBand = -1; 4127 infoPtr->iOldBand = -1; 4128 infoPtr->ichevronhotBand = -2; 4129 infoPtr->iGrabbedBand = -1; 3874 4130 infoPtr->hwndSelf = hwnd; 3875 4131 infoPtr->DoRedraw = TRUE; 3876 infoPtr->hcurArrow = LoadCursorA (0, IDC_ARROWA);3877 infoPtr->hcurHorz = LoadCursorA (0, IDC_SIZEWEA);3878 infoPtr->hcurVert = LoadCursorA (0, IDC_SIZENSA);3879 infoPtr->hcurDrag = LoadCursorA (0, IDC_SIZEA);4132 infoPtr->hcurArrow = LoadCursorA (0, (LPSTR)IDC_ARROWA); 4133 infoPtr->hcurHorz = LoadCursorA (0, (LPSTR)IDC_SIZEWEA); 4134 infoPtr->hcurVert = LoadCursorA (0, (LPSTR)IDC_SIZENSA); 4135 infoPtr->hcurDrag = LoadCursorA (0, (LPSTR)IDC_SIZEA); 3880 4136 infoPtr->bUnicode = IsWindowUnicode (hwnd); 3881 4137 infoPtr->fStatus = CREATE_RUNNING; … … 3989 4245 GetWindowRect (infoPtr->hwndSelf, &rcWindow); 3990 4246 OffsetRect (&rcWindow, -rcWindow.left, -rcWindow.top); 3991 TRACE("rect (% d,%d)-(%d,%d)\n",4247 TRACE("rect (%ld,%ld)-(%ld,%ld)\n", 3992 4248 rcWindow.left, rcWindow.top, 3993 4249 rcWindow.right, rcWindow.bottom); … … 4030 4286 hdc = wParam==0 ? BeginPaint (infoPtr->hwndSelf, &ps) : (HDC)wParam; 4031 4287 4032 TRACE("painting (% d,%d)-(%d,%d) client (%d,%d)-(%d,%d)\n",4288 TRACE("painting (%ld,%ld)-(%ld,%ld) client (%ld,%ld)-(%ld,%ld)\n", 4033 4289 ps.rcPaint.left, ps.rcPaint.top, 4034 4290 ps.rcPaint.right, ps.rcPaint.bottom, … … 4155 4411 infoPtr->fStatus &= ~CREATE_RUNNING; 4156 4412 GetWindowRect ( infoPtr->hwndSelf, &rcWin); 4157 TRACE("win rect (% d,%d)-(%d,%d)\n",4413 TRACE("win rect (%ld,%ld)-(%ld,%ld)\n", 4158 4414 rcWin.left, rcWin.top, rcWin.right, rcWin.bottom); 4159 4415 … … 4162 4418 /* native control seems to do this */ 4163 4419 GetClientRect (GetParent(infoPtr->hwndSelf), &rcClient); 4164 TRACE("sizing rebar, message and client zero, parent client (% d,%d)\n",4420 TRACE("sizing rebar, message and client zero, parent client (%ld,%ld)\n", 4165 4421 rcClient.right, rcClient.bottom); 4166 4422 } … … 4176 4432 /* do the actual WM_SIZE request */ 4177 4433 GetClientRect (infoPtr->hwndSelf, &rcClient); 4178 TRACE("sizing rebar from (%ld,%ld) to (%d,%d), client (% d,%d)\n",4434 TRACE("sizing rebar from (%ld,%ld) to (%d,%d), client (%ld,%ld)\n", 4179 4435 infoPtr->calcSize.cx, infoPtr->calcSize.cy, 4180 4436 LOWORD(lParam), HIWORD(lParam), … … 4196 4452 /* native seems to use the current client rect for the size */ 4197 4453 infoPtr->fStatus |= BAND_NEEDS_LAYOUT; 4198 TRACE("sizing rebar to client (% d,%d) size is zero but AUTOSIZE set\n",4454 TRACE("sizing rebar to client (%ld,%ld) size is zero but AUTOSIZE set\n", 4199 4455 rcClient.right, rcClient.bottom); 4200 4456 } 4201 4457 else { 4202 TRACE("sizing rebar from (%ld,%ld) to (%d,%d), client (%d,%d)\n", 4458 #ifdef __WIN32OS2__ 4459 INT width, x, y, height; 4460 RECT parent_rect, rcWin; 4461 4462 if(HIWORD(lParam) != (rcClient.bottom - rcClient.top) || 4463 LOWORD(lParam) != (rcClient.right - rcClient.left)) 4464 { 4465 /* Need to resize width to match parent */ 4466 GetWindowRect ( infoPtr->hwndSelf, &rcWin); 4467 height = (rcWin.bottom - rcWin.top); 4468 4469 /* width and height don't apply */ 4470 GetClientRect (GetParent(infoPtr->hwndSelf), &parent_rect); 4471 width = parent_rect.right - parent_rect.left; 4472 TRACE("Rebar: resize to match parent"); 4473 SetWindowPos (infoPtr->hwndSelf, 0, 0, 0, width, height, SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); 4474 return 0;; 4475 } 4476 #endif 4477 TRACE("sizing rebar from (%ld,%ld) to (%d,%d), client (%ld,%ld)\n", 4203 4478 infoPtr->calcSize.cx, infoPtr->calcSize.cy, 4204 4479 LOWORD(lParam), HIWORD(lParam), … … 4214 4489 autosize.rcActual = autosize.rcTarget; /* ??? */ 4215 4490 REBAR_Notify((NMHDR *) &autosize, infoPtr, RBN_AUTOSIZE); 4216 TRACE("RBN_AUTOSIZE client=(% d,%d), lp=%08lx\n",4491 TRACE("RBN_AUTOSIZE client=(%ld,%ld), lp=%08lx\n", 4217 4492 autosize.rcTarget.right, autosize.rcTarget.bottom, lParam); 4218 4493 } … … 4255 4530 wParam, lParam); 4256 4531 GetWindowRect(infoPtr->hwndSelf, &rc); 4257 TRACE("hwnd %p new pos (% d,%d)-(%d,%d)\n",4532 TRACE("hwnd %p new pos (%ld,%ld)-(%ld,%ld)\n", 4258 4533 infoPtr->hwndSelf, rc.left, rc.top, rc.right, rc.bottom); 4259 4534 return ret; 4260 4535 } 4261 4536 4537 #ifdef __WIN32OS2__ 4538 #ifdef DEBUG 4539 static void dprintfMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 4540 { 4541 char *msg = NULL; 4542 4543 switch (uMsg) 4544 { 4545 case RB_DELETEBAND: 4546 msg = "RB_DELETEBAND"; 4547 break; 4548 case RB_GETBANDBORDERS: 4549 msg = "RB_GETBANDBORDERS"; 4550 break; 4551 case RB_GETBANDCOUNT: 4552 msg = "RB_GETBANDCOUNT"; 4553 break; 4554 case RB_GETBANDINFO_OLD: 4555 msg = "RB_GETBANDINFO_OLD"; 4556 break; 4557 case RB_GETBANDINFOA: 4558 msg = "RB_GETBANDINFOA"; 4559 break; 4560 case RB_GETBANDINFOW: 4561 msg = "RB_GETBANDINFOW"; 4562 break; 4563 case RB_GETBARHEIGHT: 4564 msg = "RB_GETBARHEIGHT"; 4565 break; 4566 case RB_GETBARINFO: 4567 msg = "RB_GETBARINFO"; 4568 break; 4569 case RB_GETBKCOLOR: 4570 msg = "RB_GETBKCOLOR"; 4571 break; 4572 case RB_GETPALETTE: 4573 msg = "RB_GETPALETTE"; 4574 break; 4575 case RB_GETRECT: 4576 msg = "RB_GETRECT"; 4577 break; 4578 case RB_GETROWCOUNT: 4579 msg = "RB_GETROWCOUNT"; 4580 break; 4581 case RB_GETROWHEIGHT: 4582 msg = "RB_GETROWHEIGHT"; 4583 break; 4584 case RB_GETTEXTCOLOR: 4585 msg = "RB_GETTEXTCOLOR"; 4586 break; 4587 case RB_GETTOOLTIPS: 4588 msg = "RB_GETTOOLTIPS"; 4589 break; 4590 case RB_GETUNICODEFORMAT: 4591 msg = "RB_GETUNICODEFORMAT"; 4592 break; 4593 case CCM_GETVERSION: 4594 msg = "CCM_GETVERSION"; 4595 break; 4596 case RB_HITTEST: 4597 msg = "RB_HITTEST"; 4598 break; 4599 case RB_IDTOINDEX: 4600 msg = "RB_IDTOINDEX"; 4601 break; 4602 case RB_INSERTBANDA: 4603 msg = "RB_INSERTBANDA"; 4604 break; 4605 case RB_INSERTBANDW: 4606 msg = "RB_INSERTBANDW"; 4607 break; 4608 case RB_MAXIMIZEBAND: 4609 msg = "RB_MAXIMIZEBAND"; 4610 break; 4611 case RB_MINIMIZEBAND: 4612 msg = "RB_MINIMIZEBAND"; 4613 break; 4614 case RB_MOVEBAND: 4615 msg = "RB_MOVEBAND"; 4616 break; 4617 case RB_PUSHCHEVRON: 4618 msg = "RB_PUSHCHEVRON"; 4619 break; 4620 case RB_SETBANDINFOA: 4621 msg = "RB_SETBANDINFOA"; 4622 break; 4623 case RB_SETBANDINFOW: 4624 msg = "RB_SETBANDINFOW"; 4625 break; 4626 case RB_SETBARINFO: 4627 msg = "RB_SETBARINFO"; 4628 break; 4629 case RB_SETBKCOLOR: 4630 msg = "RB_SETBKCOLOR"; 4631 break; 4632 case RB_SETPARENT: 4633 msg = "RB_SETPARENT"; 4634 break; 4635 case RB_SETTEXTCOLOR: 4636 msg = "RB_SETTEXTCOLOR"; 4637 break; 4638 case RB_SETUNICODEFORMAT: 4639 msg = "RB_SETUNICODEFORMAT"; 4640 break; 4641 case CCM_SETVERSION: 4642 msg = "CCM_SETVERSION"; 4643 break; 4644 case RB_SHOWBAND: 4645 msg = "RB_SHOWBAND"; 4646 break; 4647 case RB_SIZETORECT: 4648 msg = "RB_SIZETORECT"; 4649 break; 4650 /* case RB_BEGINDRAG: */ 4651 /* case RB_DRAGMOVE: */ 4652 /* case RB_ENDDRAG: */ 4653 /* case RB_GETCOLORSCHEME: */ 4654 /* case RB_GETDROPTARGET: */ 4655 /* case RB_SETCOLORSCHEME: */ 4656 /* case RB_SETPALETTE: */ 4657 /* return REBAR_GetPalette (infoPtr, wParam, lParam); */ 4658 /* case RB_SETTOOLTIPS: */ 4659 4660 default: 4661 return; 4662 } 4663 dprintf(("Rebar %x %s %x %x", hwnd, msg, wParam, lParam)); 4664 } 4665 #endif 4666 #endif //__WIN32OS2__ 4262 4667 4263 4668 static LRESULT WINAPI … … 4266 4671 REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd); 4267 4672 4673 #if defined(DEBUG) && defined(__WIN32OS2__) 4674 dprintfMsg(hwnd, uMsg, wParam, lParam); 4675 #else 4268 4676 TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n", 4269 hwnd, uMsg, /* SPY_GetMsgName(uMsg), */ wParam, lParam); 4677 hwnd, uMsg, wParam, lParam); 4678 #endif 4270 4679 if (!infoPtr && (uMsg != WM_NCCREATE)) 4271 4680 return DefWindowProcA (hwnd, uMsg, wParam, lParam); … … 4286 4695 return REBAR_GetBandCount (infoPtr); 4287 4696 4288 case RB_GETBANDINFO: /* obsoleted after IE3, but we have to 4289 support it anyway. */ 4697 case RB_GETBANDINFO_OLD: 4290 4698 case RB_GETBANDINFOA: 4291 4699 return REBAR_GetBandInfoA (infoPtr, wParam, lParam); … … 4350 4758 case RB_MOVEBAND: 4351 4759 return REBAR_MoveBand (infoPtr, wParam, lParam); 4760 4761 case RB_PUSHCHEVRON: 4762 return REBAR_PushChevron (infoPtr, wParam, lParam); 4352 4763 4353 4764 case RB_SETBANDINFOA: … … 4426 4837 case WM_MOUSEMOVE: 4427 4838 return REBAR_MouseMove (infoPtr, wParam, lParam); 4839 4840 case WM_MOUSELEAVE: 4841 return REBAR_MouseLeave (infoPtr, wParam, lParam); 4428 4842 4429 4843 case WM_NCCALCSIZE: … … 4515 4929 REBAR_Unregister (void) 4516 4930 { 4517 UnregisterClassA (REBARCLASSNAMEA, (HINSTANCE)NULL);4518 } 4931 UnregisterClassA (REBARCLASSNAMEA, NULL); 4932 } -
trunk/src/comctl32/status.c
r8526 r10535 20 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 21 * 22 * FIXME: 23 * 1) Implement all CCS_* styles. 24 * 2) Should we hide grip if the parent window is maximized? 22 * NOTE 23 * 24 * This code was audited for completeness against the documented features 25 * of Comctl32.dll version 6.0 on Sep. 24, 2002, by Dimitrie O. Paun. 26 * 27 * Unless otherwise noted, we believe this code to be complete, as per 28 * the specification mentioned above. 29 * If you discover missing features, or bugs, please note them below. 30 * 31 * TODO: 32 * -- CCS_BOTTOM (default) 33 * -- CCS_LEFT 34 * -- CCS_NODEVIDER 35 * -- CCS_NOMOVEX 36 * -- CCS_NOMOVEY 37 * -- CCS_NOPARENTALIGN 38 * -- CCS_RIGHT 39 * -- CCS_TOP 40 * -- CCS_VERT (defaults to RIGHT) 25 41 */ 26 42 43 #include <stdarg.h> 27 44 #include <string.h> 28 45 46 #include "windef.h" 29 47 #include "winbase.h" 30 48 #include "wine/unicode.h" 49 #include "wingdi.h" 50 #include "winuser.h" 51 #include "winnls.h" 31 52 #include "commctrl.h" 53 #include "comctl32.h" 32 54 #include "wine/debug.h" 33 55 … … 46 68 { 47 69 HWND Self; 70 HWND Notify; 48 71 WORD numParts; 49 72 UINT height; … … 87 110 INT i; 88 111 89 TRACE("draw size grip % d,%d - %d,%d\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);112 TRACE("draw size grip %ld,%ld - %ld,%ld\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); 90 113 91 114 pt.x = lpRect->right - 1; … … 125 148 126 149 127 static void 150 static void 128 151 STATUSBAR_DrawPart (HDC hdc, const STATUSWINDOWPART *part, const STATUSWINDOWINFO *infoPtr, int itemID) 129 152 { … … 131 154 UINT border = BDR_SUNKENOUTER; 132 155 133 TRACE("part bound % d,%d - %d,%d\n", r.left, r.top, r.right, r.bottom);156 TRACE("part bound %ld,%ld - %ld,%ld\n", r.left, r.top, r.right, r.bottom); 134 157 if (part->style & SBT_POPOUT) 135 158 border = BDR_RAISEDOUTER; … … 138 161 139 162 DrawEdge(hdc, &r, border, BF_RECT|BF_ADJUST); 140 163 141 164 if (part->style & SBT_OWNERDRAW) 142 165 { … … 149 172 dis.rcItem = r; 150 173 dis.itemData = (INT)part->text; 151 SendMessageW (GetParent (infoPtr->Self), WM_DRAWITEM, 152 (WPARAM)dis.CtlID, (LPARAM)&dis); 153 } 174 SendMessageW (infoPtr->Notify, WM_DRAWITEM, (WPARAM)dis.CtlID, (LPARAM)&dis); 175 } 154 176 else 155 177 { … … 158 180 INT cy = r.bottom - r.top; 159 181 160 r.left += 2; 182 r.left += 2; 161 183 DrawIconEx (hdc, r.left, r.top, part->hIcon, cy, cy, 0, 0, DI_NORMAL); 162 184 r.left += cy; … … 257 279 /* get our window size */ 258 280 GetClientRect (infoPtr->Self, &rect); 259 TRACE("client wnd size is % d,%d - %d,%d\n", rect.left, rect.top, rect.right, rect.bottom);281 TRACE("client wnd size is %ld,%ld - %ld,%ld\n", rect.left, rect.top, rect.right, rect.bottom); 260 282 261 283 rect.top += VERT_BORDER; … … 540 562 RECT parent_rect; 541 563 542 GetClientRect ( GetParent (infoPtr->Self), &parent_rect);564 GetClientRect (infoPtr->Notify, &parent_rect); 543 565 infoPtr->height = height + VERT_BORDER; 544 566 width = parent_rect.right - parent_rect.left; … … 568 590 for (i = infoPtr->numParts ; i < oldNumParts; i++) { 569 591 if (infoPtr->parts[i].text && !(infoPtr->parts[i].style & SBT_OWNERDRAW)) 570 COMCTL32_Free (infoPtr->parts[i].text);592 Free (infoPtr->parts[i].text); 571 593 } 572 594 } else if (oldNumParts < infoPtr->numParts) { 573 tmp = COMCTL32_Alloc (sizeof(STATUSWINDOWPART) * infoPtr->numParts);595 tmp = Alloc (sizeof(STATUSWINDOWPART) * infoPtr->numParts); 574 596 if (!tmp) return FALSE; 575 597 for (i = 0; i < oldNumParts; i++) { … … 577 599 } 578 600 if (infoPtr->parts) 579 COMCTL32_Free (infoPtr->parts);601 Free (infoPtr->parts); 580 602 infoPtr->parts = tmp; 581 603 } … … 587 609 return TRUE; 588 610 } 589 611 590 612 for (i = 0; i < infoPtr->numParts; i++) 591 613 infoPtr->parts[i].x = parts[i]; … … 626 648 627 649 static BOOL 628 STATUSBAR_SetTextT (STATUSWINDOWINFO *infoPtr, INT nPart, WORD style, 650 STATUSBAR_SetTextT (STATUSWINDOWINFO *infoPtr, INT nPart, WORD style, 629 651 LPCWSTR text, BOOL isW) 630 652 { … … 632 654 BOOL changed = FALSE; 633 655 634 if (style & SBT_OWNERDRAW) { 635 TRACE("part %d, text % x\n",nPart,text);656 if (style & SBT_OWNERDRAW) { 657 TRACE("part %d, text %p\n",nPart,text); 636 658 } 637 659 else TRACE("part %d, text %s\n", nPart, debugstr_t(text, isW)); … … 663 685 LPCSTR atxt = (LPCSTR)text; 664 686 DWORD len = MultiByteToWideChar( CP_ACP, 0, atxt, -1, NULL, 0 ); 665 ntext = COMCTL32_Alloc( (len + 1)*sizeof(WCHAR) );687 ntext = Alloc( (len + 1)*sizeof(WCHAR) ); 666 688 if (!ntext) return FALSE; 667 689 MultiByteToWideChar( CP_ACP, 0, atxt, -1, ntext, len ); 668 690 } else if (text) { 669 ntext = COMCTL32_Alloc( (strlenW(text) + 1)*sizeof(WCHAR) );691 ntext = Alloc( (strlenW(text) + 1)*sizeof(WCHAR) ); 670 692 if (!ntext) return FALSE; 671 693 strcpyW (ntext, text); … … 675 697 if (text) { 676 698 if (!changed && part->text && !lstrcmpW(ntext, part->text)) { 677 if (!isW) COMCTL32_Free(ntext);699 if (!isW) Free(ntext); 678 700 return TRUE; 679 701 } 680 702 } else { 681 if (!changed && !part->text) 703 if (!changed && !part->text) 682 704 return TRUE; 683 705 } 684 706 685 707 if (part->text) 686 COMCTL32_Free (part->text);708 Free (part->text); 687 709 part->text = ntext; 688 710 } … … 758 780 nmhdr.idFrom = GetWindowLongW (infoPtr->Self, GWL_ID); 759 781 nmhdr.code = SBN_SIMPLEMODECHANGE; 760 SendMessageW ( GetParent (infoPtr->Self), WM_NOTIFY, 0, (LPARAM)&nmhdr);782 SendMessageW (infoPtr->Notify, WM_NOTIFY, 0, (LPARAM)&nmhdr); 761 783 InvalidateRect(infoPtr->Self, NULL, FALSE); 762 784 return TRUE; … … 772 794 for (i = 0; i < infoPtr->numParts; i++) { 773 795 if (infoPtr->parts[i].text && !(infoPtr->parts[i].style & SBT_OWNERDRAW)) 774 COMCTL32_Free (infoPtr->parts[i].text);796 Free (infoPtr->parts[i].text); 775 797 } 776 798 if (infoPtr->part0.text && !(infoPtr->part0.style & SBT_OWNERDRAW)) 777 COMCTL32_Free (infoPtr->part0.text);778 COMCTL32_Free (infoPtr->parts);799 Free (infoPtr->part0.text); 800 Free (infoPtr->parts); 779 801 780 802 /* delete default font */ … … 786 808 DestroyWindow (infoPtr->hwndToolTip); 787 809 788 COMCTL32_Free (infoPtr);789 810 SetWindowLongW(infoPtr->Self, 0, 0); 811 Free (infoPtr); 790 812 return 0; 791 813 } … … 803 825 804 826 TRACE("\n"); 805 infoPtr = (STATUSWINDOWINFO*) COMCTL32_Alloc (sizeof(STATUSWINDOWINFO));827 infoPtr = (STATUSWINDOWINFO*)Alloc (sizeof(STATUSWINDOWINFO)); 806 828 if (!infoPtr) goto create_fail; 807 829 SetWindowLongW (hwnd, 0, (DWORD)infoPtr); 808 830 809 831 infoPtr->Self = hwnd; 832 infoPtr->Notify = lpCreate->hwndParent; 810 833 infoPtr->numParts = 1; 811 834 infoPtr->parts = 0; … … 814 837 infoPtr->hFont = 0; 815 838 816 i = SendMessageW( GetParent (hwnd), WM_NOTIFYFORMAT,hwnd, NF_QUERY);839 i = SendMessageW(infoPtr->Notify, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY); 817 840 infoPtr->NtfUnicode = (i == NFR_UNICODE); 818 841 … … 834 857 835 858 /* initialize first part */ 836 infoPtr->parts = COMCTL32_Alloc (sizeof(STATUSWINDOWPART));859 infoPtr->parts = Alloc (sizeof(STATUSWINDOWPART)); 837 860 if (!infoPtr->parts) goto create_fail; 838 861 infoPtr->parts[0].bound = rect; … … 846 869 if (lpCreate->lpszName && 847 870 (len = strlenW ((LPCWSTR)lpCreate->lpszName))) { 848 infoPtr->parts[0].text = COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));871 infoPtr->parts[0].text = Alloc ((len + 1)*sizeof(WCHAR)); 849 872 if (!infoPtr->parts[0].text) goto create_fail; 850 873 strcpyW (infoPtr->parts[0].text, (LPCWSTR)lpCreate->lpszName); … … 855 878 (len = strlen((LPCSTR)lpCreate->lpszName))) { 856 879 DWORD lenW = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)lpCreate->lpszName, -1, NULL, 0 ); 857 infoPtr->parts[0].text = COMCTL32_Alloc (lenW*sizeof(WCHAR));880 infoPtr->parts[0].text = Alloc (lenW*sizeof(WCHAR)); 858 881 if (!infoPtr->parts[0].text) goto create_fail; 859 882 MultiByteToWideChar( CP_ACP, 0, (LPCSTR)lpCreate->lpszName, -1, … … 871 894 #endif 872 895 873 if ((hdc = GetDC ( 0))) {896 if ((hdc = GetDC (hwnd))) { 874 897 TEXTMETRICW tm; 875 898 HFONT hOldFont; … … 879 902 textHeight = tm.tmHeight; 880 903 SelectObject (hdc, hOldFont); 881 ReleaseDC ( 0, hdc);904 ReleaseDC (hwnd, hdc); 882 905 } 883 906 TRACE(" textHeight=%d\n", textHeight); … … 886 909 infoPtr->hwndToolTip = 887 910 CreateWindowExW (0, TOOLTIPS_CLASSW, NULL, 0, 888 CW_USEDEFAULT, CW_USEDEFAULT, 889 CW_USEDEFAULT, CW_USEDEFAULT, 890 hwnd, 0, 891 GetWindowLongW (hwnd, GWL_HINSTANCE), NULL); 911 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 912 CW_USEDEFAULT, hwnd, 0, 913 (HINSTANCE)GetWindowLongW(hwnd, GWL_HINSTANCE), NULL); 892 914 893 915 if (infoPtr->hwndToolTip) { … … 901 923 SendMessageW (lpCreate->hwndParent, WM_NOTIFY, 902 924 (WPARAM)nmttc.hdr.idFrom, (LPARAM)&nmttc); 903 } 925 } 904 926 } 905 927 906 928 if (!(dwStyle & CCS_NORESIZE)) { /* don't resize wnd if it doesn't want it ! */ 907 GetClientRect ( GetParent (hwnd), &rect);929 GetClientRect (infoPtr->Notify, &rect); 908 930 width = rect.right - rect.left; 909 931 infoPtr->height = textHeight + 4 + VERT_BORDER; … … 914 936 915 937 return 0; 916 938 917 939 create_fail: 918 940 TRACE(" failed!\n"); … … 993 1015 { 994 1016 infoPtr->hFont = font; 995 TRACE("% 04x\n", infoPtr->hFont);1017 TRACE("%p\n", infoPtr->hFont); 996 1018 if (redraw) 997 1019 InvalidateRect(infoPtr->Self, NULL, FALSE); … … 1014 1036 /* duplicate string */ 1015 1037 if (part->text) 1016 COMCTL32_Free (part->text);1038 Free (part->text); 1017 1039 part->text = 0; 1018 1040 if (infoPtr->bUnicode) { 1019 1041 if (text && (len = strlenW((LPCWSTR)text))) { 1020 part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));1042 part->text = Alloc ((len+1)*sizeof(WCHAR)); 1021 1043 if (!part->text) return FALSE; 1022 1044 strcpyW (part->text, (LPCWSTR)text); … … 1026 1048 if (text && (len = lstrlenA(text))) { 1027 1049 DWORD lenW = MultiByteToWideChar( CP_ACP, 0, text, -1, NULL, 0 ); 1028 part->text = COMCTL32_Alloc (lenW*sizeof(WCHAR));1050 part->text = Alloc (lenW*sizeof(WCHAR)); 1029 1051 if (!part->text) return FALSE; 1030 1052 MultiByteToWideChar( CP_ACP, 0, text, -1, part->text, lenW ); … … 1039 1061 1040 1062 static BOOL 1063 #ifdef __WIN32OS2__ 1064 STATUSBAR_WMSize (STATUSWINDOWINFO *infoPtr, WORD flags, LPARAM lParam) 1065 #else 1041 1066 STATUSBAR_WMSize (STATUSWINDOWINFO *infoPtr, WORD flags) 1067 #endif 1042 1068 { 1043 1069 INT width, x, y; … … 1047 1073 TRACE("flags %04x\n", flags); 1048 1074 1049 if (flags != SIZE_RESTORED) { 1050 WARN("flags MUST be SIZE_RESTORED\n"); 1075 if (flags != SIZE_RESTORED && flags != SIZE_MAXIMIZED) 1076 { 1077 WARN("flags MUST be SIZE_RESTORED or SIZE_MAXIMIZED\n"); 1051 1078 return FALSE; 1052 1079 } 1080 1053 1081 #ifdef __WIN32OS2__ 1054 1082 if (GetWindowLongW(infoPtr->Self, GWL_STYLE) & CCS_NORESIZE) { … … 1057 1085 return FALSE; 1058 1086 } 1087 1088 /* Invalidate the window if we need to draw a size grip */ 1089 /* TODO: The size grip area would be sufficient though */ 1090 if (GetWindowLongW (infoPtr->Self, GWL_STYLE) & SBARS_SIZEGRIP) 1091 { 1092 RECT rcWin; 1093 1094 GetClientRect(infoPtr->Self, &rcWin); 1095 if(HIWORD(lParam) != (rcWin.bottom - rcWin.top) || 1096 LOWORD(lParam) != (rcWin.right - rcWin.left)) 1097 { 1098 TRACE("SBARS_SIZEGRIP && height/width changed -> invalidate window"); 1099 InvalidateRect(infoPtr->Self,NULL,TRUE); 1100 } 1101 } 1059 1102 #else 1060 1103 if (GetWindowLongW(infoPtr->Self, GWL_STYLE) & CCS_NORESIZE) return FALSE; … … 1062 1105 1063 1106 /* width and height don't apply */ 1064 GetClientRect ( GetParent(infoPtr->Self), &parent_rect);1107 GetClientRect (infoPtr->Notify, &parent_rect); 1065 1108 width = parent_rect.right - parent_rect.left; 1066 1109 x = parent_rect.left; 1067 1110 y = parent_rect.bottom - infoPtr->height; 1068 MoveWindow (infoPtr->Self, parent_rect.left, 1111 MoveWindow (infoPtr->Self, parent_rect.left, 1069 1112 parent_rect.bottom - infoPtr->height, 1070 1113 width, infoPtr->height, TRUE); … … 1074 1117 1075 1118 1076 static LRESULT 1119 static LRESULT 1077 1120 STATUSBAR_NotifyFormat (STATUSWINDOWINFO *infoPtr, HWND from, INT cmd) 1078 1121 { 1079 1122 if (cmd == NF_REQUERY) { 1080 INT i = SendMessageW(from, WM_NOTIFYFORMAT, infoPtr->Self, NF_QUERY);1123 INT i = SendMessageW(from, WM_NOTIFYFORMAT, (WPARAM)infoPtr->Self, NF_QUERY); 1081 1124 infoPtr->NtfUnicode = (i == NFR_UNICODE); 1082 1125 } … … 1088 1131 STATUSBAR_SendNotify (HWND hwnd, UINT code) 1089 1132 { 1133 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr(hwnd); 1090 1134 NMHDR nmhdr; 1091 1135 … … 1094 1138 nmhdr.idFrom = GetWindowLongW (hwnd, GWL_ID); 1095 1139 nmhdr.code = code; 1096 SendMessageW ( GetParent (hwnd), WM_NOTIFY, 0, (LPARAM)&nmhdr);1140 SendMessageW (infoPtr->Notify, WM_NOTIFY, 0, (LPARAM)&nmhdr); 1097 1141 return 0; 1098 1142 } … … 1107 1151 LRESULT res; 1108 1152 1109 TRACE("hwnd=% xmsg=%x wparam=%x lparam=%lx\n", hwnd, msg, wParam, lParam);1153 TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n", hwnd, msg, wParam, lParam); 1110 1154 if (!infoPtr && msg != WM_CREATE) 1111 1155 return DefWindowProcW (hwnd, msg, wParam, lParam); … … 1116 1160 1117 1161 case SB_GETICON: 1118 return STATUSBAR_GetIcon (infoPtr, nPart);1162 return (LRESULT)STATUSBAR_GetIcon (infoPtr, nPart); 1119 1163 1120 1164 case SB_GETPARTS: … … 1155 1199 return STATUSBAR_SetMinHeight (infoPtr, (INT)wParam); 1156 1200 1157 case SB_SETPARTS: 1201 case SB_SETPARTS: 1158 1202 return STATUSBAR_SetParts (infoPtr, (INT)wParam, (LPINT)lParam); 1159 1203 … … 1183 1227 1184 1228 case WM_GETFONT: 1185 return infoPtr->hFont? infoPtr->hFont : infoPtr->hDefaultFont;1229 return (LRESULT)(infoPtr->hFont? infoPtr->hFont : infoPtr->hDefaultFont); 1186 1230 1187 1231 case WM_GETTEXT: … … 1208 1252 case WM_NCLBUTTONUP: 1209 1253 case WM_NCLBUTTONDOWN: 1210 PostMessageW ( GetParent (hwnd), msg, wParam, lParam);1254 PostMessageW (infoPtr->Notify, msg, wParam, lParam); 1211 1255 return 0; 1212 1256 1213 1257 case WM_NOTIFYFORMAT: 1214 1258 return STATUSBAR_NotifyFormat(infoPtr, (HWND)wParam, (INT)lParam); 1215 1259 1216 1260 case WM_PAINT: 1217 1261 return STATUSBAR_WMPaint (infoPtr, (HDC)wParam); … … 1230 1274 1231 1275 case WM_SIZE: 1276 #ifdef __WIN32OS2__ 1277 if (STATUSBAR_WMSize (infoPtr, (WORD)wParam, lParam)) return 0; 1278 #else 1232 1279 if (STATUSBAR_WMSize (infoPtr, (WORD)wParam)) return 0; 1280 #endif 1233 1281 return DefWindowProcW (hwnd, msg, wParam, lParam); 1234 1282 1235 1283 default: 1236 if ( msg >= WM_USER)1284 if ((msg >= WM_USER) && (msg < WM_APP)) 1237 1285 ERR("unknown msg %04x wp=%04x lp=%08lx\n", 1238 1286 msg, wParam, lParam); … … 1259 1307 wndClass.cbClsExtra = 0; 1260 1308 wndClass.cbWndExtra = sizeof(STATUSWINDOWINFO *); 1261 wndClass.hCursor = LoadCursorW (0, IDC_ARROWW);1309 wndClass.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROWW); 1262 1310 wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); 1263 1311 wndClass.lpszClassName = STATUSCLASSNAMEW; 1264 1312 1265 1313 RegisterClassW (&wndClass); 1266 1314 } … … 1276 1324 STATUS_Unregister (void) 1277 1325 { 1278 UnregisterClassW (STATUSCLASSNAMEW, (HINSTANCE)NULL); 1279 } 1280 1326 UnregisterClassW (STATUSCLASSNAMEW, NULL); 1327 } -
trunk/src/comctl32/toolbar.c
r10098 r10535 19 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 20 * 21 * NOTES 22 * 21 23 * Differences between MSDN and actual native control operation: 22 24 * 1. MSDN says: "TBSTYLE_LIST: Creates a flat toolbar with button text … … 28 30 * *not* imply TBSTYLE_FLAT as documented. (GA 8/2001) 29 31 * 30 * 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 * 31 39 * TODO: 32 40 * - Button wrapping (under construction). 33 * - Messages. 34 * - Notifications (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 35 62 * - Fix TB_SETROWS. 36 * - Tooltip support (almost complete).37 * - Unicode suppport (under construction).38 63 * - Fix TOOLBAR_SetButtonInfo32A/W. 39 * - TBSTYLE_AUTOSIZE for toolbar and buttons. 40 * - I_IMAGECALLBACK support. 41 * - iString of -1 is undocumented 64 * - iListGap custom draw support. 42 65 * - Customization dialog: 43 * - Add flat look.44 66 * - Minor buglet in 'available buttons' list: 45 * Buttons are not listed in M $-like order. M$seems to use a single67 * Buttons are not listed in MS-like order. MS seems to use a single 46 68 * internal list to store the button information of both listboxes. 47 69 * - Drag list support. 48 * - Help and Reset button support.49 70 * 50 71 * Testing: … … 59 80 */ 60 81 82 #include <stdarg.h> 61 83 #include <string.h> 62 84 85 #include "windef.h" 63 86 #include "winbase.h" 64 #include "windef.h"65 87 #include "wingdi.h" 66 88 #include "winuser.h" 67 89 #include "wine/unicode.h" 90 #include "winnls.h" 68 91 #include "commctrl.h" 69 92 #include "imagelist.h" … … 105 128 INT nHeight; /* height of the toolbar */ 106 129 INT nWidth; /* width of the toolbar */ 130 RECT client_rect; 107 131 INT nButtonHeight; 108 132 INT nButtonWidth; … … 127 151 DWORD dwItemCDFlag; /* TBCDRF_ flags from last ITEMPREPAINT */ 128 152 SIZE szPadding; /* padding values around button */ 153 INT iListGap; /* default gap between text and image for toolbar with list style */ 129 154 HFONT hDefaultFont; 130 155 HFONT hFont; /* text font */ … … 153 178 RECT rcBound; /* bounding rectangle */ 154 179 INT iVersion; 155 180 LPWSTR pszTooltipText; /* temporary store for a string > 80 characters 181 * for TTN_GETDISPINFOW notification */ 156 182 TBUTTON_INFO *buttons; /* pointer to button array */ 157 183 LPWSTR *strings; /* pointer to string array */ … … 175 201 } CUSTOMBUTTON, *PCUSTOMBUTTON; 176 202 203 typedef enum 204 { 205 IMAGE_LIST_DEFAULT, 206 IMAGE_LIST_HOT, 207 IMAGE_LIST_DISABLED 208 } IMAGE_LIST_TYPE; 177 209 178 210 #define SEPARATOR_WIDTH 8 … … 180 212 #define BOTTOM_BORDER 2 181 213 #define DDARROW_WIDTH 11 214 #define ARROW_HEIGHT 3 215 216 /* gap between border of button and text/image */ 217 #define OFFSET_X 1 218 #define OFFSET_Y 1 219 /* how wide to treat the bitmap if it isn't present */ 220 #define LIST_IMAGE_ABSENT_WIDTH 2 182 221 183 222 #define TOOLBAR_GetInfoPtr(hwnd) ((TOOLBAR_INFO *)GetWindowLongA(hwnd,0)) 184 223 #define TOOLBAR_HasText(x, y) (TOOLBAR_GetText(x, y) ? TRUE : FALSE) 185 224 #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 #endif 232 233 static inline int TOOLBAR_GetListTextOffset(TOOLBAR_INFO *infoPtr, INT iListGap) 234 { 235 return GetSystemMetrics(SM_CXEDGE) + iListGap - infoPtr->szPadding.cx/2; 236 } 186 237 187 238 /* Used to find undocumented extended styles */ … … 355 406 356 407 /*********************************************************************** 357 * TOOLBAR_ DrawImageList408 * TOOLBAR_GetImageListForDrawing 358 409 * 359 410 * This function validates the bitmap index (including I_IMAGECALLBACK 360 * functionality). It then draws the image via the ImageList_Draw 361 * function. It returns TRUE if the image was drawn, FALSE otherwise. 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. 362 461 */ 363 462 static BOOL 364 TOOLBAR_DrawImageList (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HIMAGELIST himl, 365 HDC hdc, UINT left, UINT top, UINT draw_flags) 463 TOOLBAR_TestImageExist (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HIMAGELIST himl) 366 464 { 367 465 INT index; … … 383 481 return FALSE; 384 482 } 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_TestImageExist395 *396 * This function is similar to TOOLBAR_DrawImageList, except it does not397 * draw the image. The I_IMAGECALLBACK functionality is implemented.398 */399 static BOOL400 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 }420 483 return TRUE; 421 484 } … … 453 516 * TOOLBAR_DrawDDFlatSeparator 454 517 * 455 * This function draws the separator that was flag ed as TBSTYLE_DROPDOWN.518 * This function draws the separator that was flagged as BTNS_DROPDOWN. 456 519 * In this case, the separator is a pixel high line of COLOR_BTNSHADOW, 457 520 * followed by a pixel high line of COLOR_BTNHIGHLIGHT. These separators … … 495 558 496 559 static void 497 TOOLBAR_DrawArrow (HDC hdc, INT left, INT top, INT colorRef)560 TOOLBAR_DrawArrow (HDC hdc, INT left, INT top, COLORREF clr) 498 561 { 499 562 INT x, y; 500 563 HPEN hPen, hOldPen; 501 564 502 if (!(hPen = CreatePen( PS_SOLID, 1, GetSysColor( colorRef )))) return;565 if (!(hPen = CreatePen( PS_SOLID, 1, clr))) return; 503 566 hOldPen = SelectObject ( hdc, hPen ); 504 567 x = left + 2; 505 y = top + 8;568 y = top; 506 569 MoveToEx (hdc, x, y, NULL); 507 570 LineTo (hdc, x+5, y++); x++; … … 521 584 */ 522 585 static void 523 TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,524 HDC hdc, INT nState, DWORD dwStyle, 525 RECT *rcText, LPWSTR lpText, NMTBCUSTOMDRAW *tbcd) 526 { 586 TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, RECT *rcText, LPWSTR lpText, 587 NMTBCUSTOMDRAW *tbcd) 588 { 589 HDC hdc = tbcd->nmcd.hdc; 527 590 HFONT hOldFont = 0; 528 591 COLORREF clrOld = 0; 592 COLORREF clrOldBk = 0; 593 int oldBkMode = 0; 594 UINT state = tbcd->nmcd.uItemState; 529 595 530 596 /* draw text */ 531 597 if (lpText) { 532 TRACE("string rect=(%ld,%ld)-(%ld,%ld)\n",598 TRACE("string=%s rect=(%ld,%ld)-(%ld,%ld)\n", debugstr_w(lpText), 533 599 rcText->left, rcText->top, rcText->right, rcText->bottom); 534 600 535 601 hOldFont = SelectObject (hdc, infoPtr->hFont); 536 if (!(nState & TBSTATE_ENABLED)) { 602 if ((state & CDIS_HOT) && (infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK )) { 603 clrOld = SetTextColor (hdc, tbcd->clrTextHighlight); 604 } 605 else if (state & CDIS_DISABLED) { 537 606 clrOld = SetTextColor (hdc, tbcd->clrBtnHighlight); 538 607 OffsetRect (rcText, 1, 1); … … 541 610 OffsetRect (rcText, -1, -1); 542 611 } 543 else if ( nState & TBSTATE_INDETERMINATE) {612 else if (state & CDIS_INDETERMINATE) { 544 613 clrOld = SetTextColor (hdc, comctl32_color.clr3dShadow); 545 614 } 546 else if ( btnPtr->bHot && (infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK)) {615 else if ((state & CDIS_MARKED) && !(infoPtr->dwItemCDFlag & TBCDRF_NOMARK)) { 547 616 clrOld = SetTextColor (hdc, tbcd->clrTextHighlight); 617 clrOldBk = SetBkColor (hdc, tbcd->clrMark); 618 oldBkMode = SetBkMode (hdc, OPAQUE); /* FIXME: should this be in the NMTBCUSTOMDRAW structure? */ 548 619 } 549 620 else { … … 553 624 DrawTextW (hdc, lpText, -1, rcText, infoPtr->dwDTFlags); 554 625 SetTextColor (hdc, clrOld); 626 if ((state & CDIS_MARKED) && !(infoPtr->dwItemCDFlag & TBCDRF_NOMARK)) 627 { 628 SetBkColor (hdc, clrOldBk); 629 SetBkMode (hdc, oldBkMode); 630 } 555 631 SelectObject (hdc, hOldFont); 556 632 } … … 559 635 560 636 static void 561 TOOLBAR_DrawPattern (HDC hdc, LPRECT lpRect) 562 { 563 HBRUSH hbr = SelectObject (hdc, COMCTL32_hPattern55AABrush); 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; 564 643 INT cx = lpRect->right - lpRect->left; 565 644 INT cy = lpRect->bottom - lpRect->top; 566 PatBlt (hdc, lpRect->left, lpRect->top, cx, cy, 0x00FA0089); 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); 567 650 SelectObject (hdc, hbr); 568 651 } 569 652 570 653 571 static void 572 TOOLBAR_DrawMasked (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, 573 HDC hdc, INT x, INT y) 654 static void TOOLBAR_DrawMasked(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, 655 HDC hdc, INT x, INT y) 574 656 { 575 657 HIMAGELIST himl = GETDEFIMAGELIST(infoPtr, 0); 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); 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 } 604 699 } 605 700 … … 621 716 } 622 717 623 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 */ 624 834 static void 625 835 TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) … … 627 837 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 628 838 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); 629 BOOL hasDropDownArrow = TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && 630 (btnPtr->fsStyle & TBSTYLE_DROPDOWN); 631 RECT rc, rcArrow, rcBitmap, rcText, rcFill; 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; 632 845 LPWSTR lpText = NULL; 633 846 NMTBCUSTOMDRAW tbcd; 634 847 DWORD ntfret; 635 848 INT offset; 636 HIMAGELIST himlDef;637 638 if (btnPtr->fsState & TBSTATE_HIDDEN)639 return;640 849 641 850 rc = btnPtr->rect; 642 CopyRect (&rcFill, &rc);643 851 CopyRect (&rcArrow, &rc); 644 852 CopyRect(&rcBitmap, &rc); 645 CopyRect(&rcText, &rc);646 853 647 854 /* get a pointer to the text */ … … 650 857 if (hasDropDownArrow) 651 858 { 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 } 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); 658 876 659 877 /* Center the bitmap horizontally and vertically */ 660 878 if (dwStyle & TBSTYLE_LIST) 661 rcBitmap.left += 3;879 rcBitmap.left += GetSystemMetrics(SM_CXEDGE) + OFFSET_X; 662 880 else 663 881 rcBitmap.left+=(infoPtr->nButtonWidth - infoPtr->nBitmapWidth) / 2; 664 882 665 883 if(lpText) 666 rcBitmap.top+= 2; /* this looks to be the correct value from vmware comparison - cmm */884 rcBitmap.top+= GetSystemMetrics(SM_CYEDGE) + OFFSET_Y; 667 885 else 668 886 rcBitmap.top+=(infoPtr->nButtonHeight - infoPtr->nBitmapHeight) / 2; 669 887 670 888 TRACE("iBitmap: %d, start=(%ld,%ld) w=%d, h=%d\n", 671 672 889 btnPtr->iBitmap, rcBitmap.left, rcBitmap.top, 890 infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); 673 891 TRACE ("iString: %x\n", btnPtr->iString); 674 892 TRACE ("Stringtext: %s\n", debugstr_w(lpText)); … … 676 894 /* draw text */ 677 895 if (lpText) { 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 */ 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 */ 712 917 ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW)); 713 918 tbcd.clrText = comctl32_color.clrBtnText; … … 719 924 tbcd.nStringBkMode = (infoPtr->bBtnTranspnt) ? TRANSPARENT : OPAQUE; 720 925 tbcd.nHLStringBkMode = (infoPtr->bBtnTranspnt) ? TRANSPARENT : OPAQUE; 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.*/926 /* MSDN says that this is the text rectangle. 927 * But (why always a but) tracing of v5.7 of native shows 928 * that this is really a *relative* rectangle based on the 929 * the nmcd.rc. Also the left and top are always 0 ignoring 930 * any bitmap that might be present. */ 726 931 tbcd.rcText.left = 0; 727 932 tbcd.rcText.top = 0; 728 933 tbcd.rcText.right = rcText.right - rc.left; 729 934 tbcd.rcText.bottom = rcText.bottom - rc.top; 730 731 /* FIXME: what should these be set to ????? */ 732 tbcd.hbrMonoDither = 0; 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? */ 733 941 tbcd.hbrLines = 0; 734 942 tbcd.hpenLines = 0; … … 740 948 { 741 949 tbcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT; 742 tbcd.nmcd.hdc = hdc;743 tbcd.nmcd.rc = rc;744 950 tbcd.nmcd.dwItemSpec = btnPtr->idCommand; 745 tbcd.nmcd.uItemState = TOOLBAR_TranslateState(btnPtr);746 951 tbcd.nmcd.lItemlParam = btnPtr->dwData; 747 952 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 748 957 infoPtr->dwItemCustDraw = ntfret & 0xffff; 749 958 infoPtr->dwItemCDFlag = ntfret & 0xffff0000; … … 755 964 } 756 965 757 if (!infoPtr->bBtnTranspnt)758 FillRect( hdc, &rcFill, GetSysColorBrush(COLOR_BTNFACE));759 760 966 /* separator */ 761 if (btnPtr->fsStyle & TBSTYLE_SEP) {967 if (btnPtr->fsStyle & BTNS_SEP) { 762 968 /* with the FLAT style, iBitmap is the width and has already */ 763 969 /* been taken into consideration in calculating the width */ … … 766 972 /* when drawing the vertical bar... */ 767 973 if ((dwStyle & TBSTYLE_FLAT) /* && (btnPtr->iBitmap == 0) */) { 768 if (btnPtr->fsStyle & TBSTYLE_DROPDOWN)974 if (btnPtr->fsStyle & BTNS_DROPDOWN) 769 975 TOOLBAR_DrawDDFlatSeparator (&rc, hdc, btnPtr, infoPtr); 770 976 else 771 977 TOOLBAR_DrawFlatSeparator (&rc, hdc, infoPtr); 772 978 } 773 else if (btnPtr->fsStyle != TBSTYLE_SEP) {979 else if (btnPtr->fsStyle != BTNS_SEP) { 774 980 FIXME("Draw some kind of separator: fsStyle=%x\n", 775 981 btnPtr->fsStyle); … … 778 984 } 779 985 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); 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)) 991 { 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); 790 998 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) 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) 877 1015 { 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)); 907 if (hasDropDownArrow) 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 933 { 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: 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: 954 1031 if (infoPtr->dwItemCustDraw & CDRF_NOTIFYPOSTPAINT) 955 1032 { … … 975 1052 TBUTTON_INFO *btnPtr; 976 1053 INT i, oldBKmode = 0; 977 RECT rcTemp ;1054 RECT rcTemp, rcClient; 978 1055 NMTBCUSTOMDRAW tbcd; 979 1056 DWORD ntfret; 1057 1058 /* the app has told us not to redraw the toolbar */ 1059 if (!infoPtr->bDoRedraw) 1060 return; 980 1061 981 1062 /* if imagelist belongs to the app, it can be changed … … 1001 1082 oldBKmode = SetBkMode (hdc, TRANSPARENT); 1002 1083 1084 GetClientRect(hwnd, &rcClient); 1085 1003 1086 /* redraw necessary buttons */ 1004 1087 btnPtr = infoPtr->buttons; 1005 1088 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) 1006 1089 { 1007 if(IntersectRect(&rcTemp, &(ps->rcPaint), &(btnPtr->rect))) 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) 1008 1101 TOOLBAR_DrawButton (hwnd, btnPtr, hdc); 1009 1102 } … … 1032 1125 * indicates where the underline goes, except for the string "&&" which 1033 1126 * is reduced to a single "&". GetTextExtentPoint does not process these 1034 * only DrawText does. Note that the TBSTYLE_NOPREFIX is handled here.1127 * only DrawText does. Note that the BTNS_NOPREFIX is handled here. 1035 1128 */ 1036 1129 static void … … 1043 1136 lpSize->cy = 0; 1044 1137 1045 if (!(btnPtr->fsState & TBSTATE_HIDDEN) ) 1138 if (infoPtr->nMaxTextRows > 0 && 1139 !(btnPtr->fsState & TBSTATE_HIDDEN) && 1140 (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || 1141 (btnPtr->fsStyle & BTNS_SHOWTEXT)) ) 1046 1142 { 1047 1143 LPWSTR lpText = TOOLBAR_GetText(infoPtr, btnPtr); … … 1058 1154 /* Use DrawText to get true size as drawn (less pesky "&") */ 1059 1155 DrawTextW (hdc, lpText, -1, &myrect, DT_VCENTER | DT_SINGLELINE | 1060 DT_CALCRECT | ((btnPtr->fsStyle & TBSTYLE_NOPREFIX) ?1156 DT_CALCRECT | ((btnPtr->fsStyle & BTNS_NOPREFIX) ? 1061 1157 DT_NOPREFIX : 0)); 1062 1158 … … 1088 1184 lpSize->cx = 0; 1089 1185 lpSize->cy = 0; 1186 1187 if(infoPtr->nMaxTextRows == 0) 1188 return; 1090 1189 1091 1190 hdc = GetDC (hwnd); … … 1113 1212 * TOOLBAR_WrapToolbar 1114 1213 * 1115 * This function walks through the buttons and sep erators in the1214 * This function walks through the buttons and separators in the 1116 1215 * toolbar, and sets the TBSTATE_WRAP flag only on those items where 1117 1216 * wrapping should occur based on the width of the toolbar window. … … 1167 1266 /* custom controls in toolbars. */ 1168 1267 /* */ 1169 /* TBSTYLE_DROPDOWN separators are treated as buttons for */1268 /* BTNS_DROPDOWN separators are treated as buttons for */ 1170 1269 /* width. - GA 8/01 */ 1171 if ((btnPtr[i].fsStyle & TBSTYLE_SEP) &&1172 !(btnPtr[i].fsStyle & TBSTYLE_DROPDOWN))1270 if ((btnPtr[i].fsStyle & BTNS_SEP) && 1271 !(btnPtr[i].fsStyle & BTNS_DROPDOWN)) 1173 1272 cx = (btnPtr[i].iBitmap > 0) ? 1174 1273 btnPtr[i].iBitmap : SEPARATOR_WIDTH; … … 1180 1279 /* next row if the previous wrapping is on a button. */ 1181 1280 if( bButtonWrap && 1182 (btnPtr[i].fsStyle & TBSTYLE_SEP) &&1281 (btnPtr[i].fsStyle & BTNS_SEP) && 1183 1282 (i + 1 < infoPtr->nNumButtons ) && 1184 (btnPtr[i + 1].fsStyle & TBSTYLE_SEP) )1283 (btnPtr[i + 1].fsStyle & BTNS_SEP) ) 1185 1284 { 1186 1285 TRACE("wrap point 1 btn %d style %02x\n", i, btnPtr[i].fsStyle); … … 1204 1303 /* go to the next until it reaches a non separator. */ 1205 1304 /* Wrap the last separator if it is before a button. */ 1206 while( ( ((btnPtr[i].fsStyle & TBSTYLE_SEP) &&1207 !(btnPtr[i].fsStyle & TBSTYLE_DROPDOWN)) ||1305 while( ( ((btnPtr[i].fsStyle & BTNS_SEP) && 1306 !(btnPtr[i].fsStyle & BTNS_DROPDOWN)) || 1208 1307 (btnPtr[i].fsState & TBSTATE_HIDDEN) ) && 1209 1308 i < infoPtr->nNumButtons ) … … 1230 1329 for ( j = i - 1; j >= 0 && !(btnPtr[j].fsState & TBSTATE_WRAP); j--) 1231 1330 { 1232 if ((btnPtr[j].fsStyle & TBSTYLE_SEP) &&1331 if ((btnPtr[j].fsStyle & BTNS_SEP) && 1233 1332 !(btnPtr[j].fsState & TBSTATE_HIDDEN)) 1234 1333 { … … 1273 1372 bFound = TRUE; 1274 1373 x = infoPtr->nIndent; 1275 if (btnPtr[i].fsStyle & TBSTYLE_SEP )1374 if (btnPtr[i].fsStyle & BTNS_SEP ) 1276 1375 bButtonWrap = FALSE; 1277 1376 else … … 1314 1413 TOOLBAR_CalcStrings (hwnd, &sizeString); 1315 1414 1415 TOOLBAR_DumpToolbar (infoPtr, __LINE__); 1416 1316 1417 for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++) 1317 1418 { … … 1324 1425 0, sizeString.cy) + infoPtr->szPadding.cy; 1325 1426 infoPtr->nButtonWidth = ((usesBitmaps) ? infoPtr->nBitmapWidth : 1326 0) + sizeString.cx + 6; 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; 1327 1430 TRACE("LIST style, But w=%d h=%d, useBitmaps=%d, Bit w=%d h=%d\n", 1328 1431 infoPtr->nButtonWidth, infoPtr->nButtonHeight, usesBitmaps, 1329 1432 infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); 1330 TOOLBAR_DumpToolbar (infoPtr, __LINE__);1331 1433 } 1332 1434 else { … … 1335 1437 if (usesBitmaps) 1336 1438 infoPtr->nButtonHeight = sizeString.cy + 1337 2 + /* this is the space to separate text from bitmap */1338 infoPtr->nBitmapHeight + 6;1439 infoPtr->szPadding.cy/2 + /* this is the space to separate text from bitmap */ 1440 infoPtr->nBitmapHeight + infoPtr->szPadding.cy; 1339 1441 else 1340 infoPtr->nButtonHeight = sizeString.cy + 6;1442 infoPtr->nButtonHeight = sizeString.cy + infoPtr->szPadding.cy; 1341 1443 } 1342 else if (infoPtr->nButtonHeight < infoPtr->nBitmapHeight + 6)1343 infoPtr->nButtonHeight = infoPtr->nBitmapHeight + 6;1444 else 1445 infoPtr->nButtonHeight = infoPtr->nBitmapHeight + infoPtr->szPadding.cy; 1344 1446 1345 1447 if (sizeString.cx > infoPtr->nBitmapWidth) 1346 infoPtr->nButtonWidth = sizeString.cx + 6;1347 else if (infoPtr->nButtonWidth < infoPtr->nBitmapWidth + 6)1348 infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6;1448 infoPtr->nButtonWidth = sizeString.cx + infoPtr->szPadding.cx; 1449 else 1450 infoPtr->nButtonWidth = infoPtr->nBitmapWidth + infoPtr->szPadding.cx; 1349 1451 } 1350 1452 … … 1359 1461 y = 0; 1360 1462 1361 /*1362 * We will set the height below, and we set the width on entry1363 * so we do not reset them here..1364 */1365 #if 01366 GetClientRect( hwnd, &rc );1367 /* get initial values for toolbar */1368 infoPtr->nWidth = rc.right - rc.left;1369 infoPtr->nHeight = rc.bottom - rc.top;1370 #endif1371 1372 1463 /* from above, minimum is a button, and possible text */ 1373 1464 cx = infoPtr->nButtonWidth; … … 1387 1478 1388 1479 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; */1395 1480 1396 1481 TRACE("cy=%d\n", cy); … … 1410 1495 /* it is the actual width of the separator. This is used for */ 1411 1496 /* custom controls in toolbars. */ 1412 if (btnPtr->fsStyle & TBSTYLE_SEP) {1413 if (btnPtr->fsStyle & TBSTYLE_DROPDOWN) {1497 if (btnPtr->fsStyle & BTNS_SEP) { 1498 if (btnPtr->fsStyle & BTNS_DROPDOWN) { 1414 1499 cy = (btnPtr->iBitmap > 0) ? 1415 1500 btnPtr->iBitmap : SEPARATOR_WIDTH; … … 1422 1507 else 1423 1508 { 1424 if (btnPtr->fsStyle & TBSTYLE_AUTOSIZE) 1509 if ((infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || 1510 (btnPtr->fsStyle & BTNS_AUTOSIZE)) 1425 1511 { 1426 1512 SIZE sz; … … 1436 1522 ReleaseDC (hwnd, hdc); 1437 1523 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; 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; 1444 1540 } 1445 1541 else 1446 1542 cx = infoPtr->nButtonWidth; 1447 1543 1448 if ( hasDropDownArrows && (btnPtr->fsStyle & TBSTYLE_DROPDOWN))1544 if ((hasDropDownArrows && (btnPtr->fsStyle & BTNS_DROPDOWN)) || (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN)) 1449 1545 cx += DDARROW_WIDTH; 1450 1546 } … … 1462 1558 1463 1559 /* Set the toolTip only for non-hidden, non-separator button */ 1464 if (infoPtr->hwndToolTip && !(btnPtr->fsStyle & TBSTYLE_SEP ))1560 if (infoPtr->hwndToolTip && !(btnPtr->fsStyle & BTNS_SEP )) 1465 1561 { 1466 1562 TTTOOLINFOA ti; … … 1485 1581 if( bWrap ) 1486 1582 { 1487 if ( !(btnPtr->fsStyle & TBSTYLE_SEP) )1583 if ( !(btnPtr->fsStyle & BTNS_SEP) ) 1488 1584 y += cy; 1489 1585 else … … 1492 1588 /* it is the actual width of the separator. This is used for */ 1493 1589 /* custom controls in toolbars. */ 1494 if ( !(btnPtr->fsStyle & TBSTYLE_DROPDOWN))1590 if ( !(btnPtr->fsStyle & BTNS_DROPDOWN)) 1495 1591 y += cy + ( (btnPtr->iBitmap > 0 ) ? 1496 1592 btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 /3; … … 1552 1648 continue; 1553 1649 1554 if (btnPtr->fsStyle & TBSTYLE_SEP) {1650 if (btnPtr->fsStyle & BTNS_SEP) { 1555 1651 if (PtInRect (&btnPtr->rect, *lpPt)) { 1556 1652 TRACE(" ON SEPARATOR %d!\n", i); … … 1605 1701 /* check index button */ 1606 1702 btnPtr = &infoPtr->buttons[nIndex]; 1607 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {1703 if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) { 1608 1704 if (btnPtr->fsState & TBSTATE_CHECKED) 1609 1705 return nIndex; … … 1614 1710 while (nRunIndex >= 0) { 1615 1711 btnPtr = &infoPtr->buttons[nRunIndex]; 1616 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {1712 if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) { 1617 1713 if (btnPtr->fsState & TBSTATE_CHECKED) 1618 1714 return nRunIndex; … … 1627 1723 while (nRunIndex < infoPtr->nNumButtons) { 1628 1724 btnPtr = &infoPtr->buttons[nRunIndex]; 1629 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {1725 if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) { 1630 1726 if (btnPtr->fsState & TBSTATE_CHECKED) 1631 1727 return nRunIndex; … … 1690 1786 return FALSE; 1691 1787 1788 /* UNDOCUMENTED: dialog hwnd immediately follows NMHDR */ 1789 nmtb.iItem = (int)hwnd; 1692 1790 /* Send TBN_INITCUSTOMIZE notification */ 1693 1791 if (TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, TBN_INITCUSTOMIZE) == 1694 1792 TBNRF_HIDEHELP) 1695 1793 { 1696 FIXME("TBNRF_HIDEHELP not supported\n"); 1794 TRACE("TBNRF_HIDEHELP requested\n"); 1795 ShowWindow(GetDlgItem(hwnd, IDC_HELP_BTN), SW_HIDE); 1697 1796 } 1698 1797 … … 1700 1799 for (i = 0; i < custInfo->tbInfo->nNumButtons; i++) 1701 1800 { 1702 btnInfo = (PCUSTOMBUTTON) COMCTL32_Alloc(sizeof(CUSTOMBUTTON));1801 btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON)); 1703 1802 memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); 1704 btnInfo->btn.fsStyle = TBSTYLE_SEP;1803 btnInfo->btn.fsStyle = BTNS_SEP; 1705 1804 btnInfo->bVirtual = FALSE; 1706 1805 LoadStringW (COMCTL32_hModule, IDS_SEPARATOR, btnInfo->text, 64); … … 1714 1813 1715 1814 /* insert separator button into 'available buttons' list */ 1716 btnInfo = (PCUSTOMBUTTON) COMCTL32_Alloc(sizeof(CUSTOMBUTTON));1815 btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON)); 1717 1816 memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); 1718 btnInfo->btn.fsStyle = TBSTYLE_SEP;1817 btnInfo->btn.fsStyle = BTNS_SEP; 1719 1818 btnInfo->bVirtual = FALSE; 1720 1819 btnInfo->bRemovable = TRUE; … … 1749 1848 if (index == -1) 1750 1849 { 1751 btnInfo = (PCUSTOMBUTTON) COMCTL32_Alloc(sizeof(CUSTOMBUTTON));1850 btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON)); 1752 1851 btnInfo->bVirtual = FALSE; 1753 1852 btnInfo->bRemovable = TRUE; … … 1764 1863 1765 1864 memcpy (&btnInfo->btn, &nmtb.tbButton, sizeof(TBBUTTON)); 1766 if (!(nmtb.tbButton.fsStyle & TBSTYLE_SEP))1865 if (!(nmtb.tbButton.fsStyle & BTNS_SEP)) 1767 1866 { 1768 1867 if (lstrlenW(nmtb.pszText)) … … 1781 1880 1782 1881 /* append 'virtual' separator button to the 'toolbar buttons' list */ 1783 btnInfo = (PCUSTOMBUTTON) COMCTL32_Alloc(sizeof(CUSTOMBUTTON));1882 btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON)); 1784 1883 memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); 1785 btnInfo->btn.fsStyle = TBSTYLE_SEP;1884 btnInfo->btn.fsStyle = BTNS_SEP; 1786 1885 btnInfo->bVirtual = TRUE; 1787 1886 btnInfo->bRemovable = FALSE; … … 1953 2052 1954 2053 /* insert into 'available button' list */ 1955 if (!(btnInfo->btn.fsStyle & TBSTYLE_SEP))2054 if (!(btnInfo->btn.fsStyle & BTNS_SEP)) 1956 2055 { 1957 2056 index = (int)SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_ADDSTRING, 0, 0); … … 1959 2058 } 1960 2059 else 1961 COMCTL32_Free (btnInfo);2060 Free (btnInfo); 1962 2061 } 1963 2062 } 1964 2063 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; 1965 2070 1966 2071 case IDOK: /* Add button */ … … 1994 2099 1995 2100 /* duplicate 'separator' button */ 1996 btnNew = (PCUSTOMBUTTON) COMCTL32_Alloc (sizeof(CUSTOMBUTTON));2101 btnNew = (PCUSTOMBUTTON)Alloc (sizeof(CUSTOMBUTTON)); 1997 2102 memcpy (btnNew, btnInfo, sizeof(CUSTOMBUTTON)); 1998 2103 btnInfo = btnNew; … … 2025 2130 { 2026 2131 btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, i, 0); 2027 COMCTL32_Free(btnInfo);2132 Free(btnInfo); 2028 2133 SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, 0, 0); 2029 2134 } … … 2036 2141 { 2037 2142 btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_GETITEMDATA, i, 0); 2038 COMCTL32_Free(btnInfo);2143 Free(btnInfo); 2039 2144 SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMDATA, i, 0); 2040 2145 } … … 2094 2199 2095 2200 /* draw image and text */ 2096 if ((btnInfo->btn.fsStyle & TBSTYLE_SEP) == 0) {2201 if ((btnInfo->btn.fsStyle & BTNS_SEP) == 0) { 2097 2202 HIMAGELIST himl = GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr, 2098 2203 btnInfo->btn.iBitmap)); … … 2199 2304 TRACE ("creating default image list!\n"); 2200 2305 2201 himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight,2202 ILC_COLOR| ILC_MASK, nButtons, 2);2306 himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, 2307 ILC_COLORDDB | ILC_MASK, nButtons, 2); 2203 2308 TOOLBAR_InsertImageList(&infoPtr->himlDef, &infoPtr->cimlDef, himlDef, 0); 2204 infoPtr->himlInt = himlDef;2309 infoPtr->himlInt = himlDef; 2205 2310 } 2206 2311 else { … … 2244 2349 DeleteDC (hdcBitmap); 2245 2350 2246 nIndex = ImageList_AddMasked (himlDef, hbmLoad, CLR_DEFAULT);2351 nIndex = ImageList_AddMasked (himlDef, hbmLoad, comctl32_color.clrBtnFace); 2247 2352 DeleteObject (hbmLoad); 2248 2353 } … … 2256 2361 MAKEINTRESOURCEA(IDB_STD_SMALL)); 2257 2362 nIndex = ImageList_AddMasked (himlDef, 2258 hbmLoad, CLR_DEFAULT);2363 hbmLoad, comctl32_color.clrBtnFace); 2259 2364 DeleteObject (hbmLoad); 2260 2365 break; … … 2264 2369 MAKEINTRESOURCEA(IDB_STD_LARGE)); 2265 2370 nIndex = ImageList_AddMasked (himlDef, 2266 hbmLoad, CLR_DEFAULT);2371 hbmLoad, comctl32_color.clrBtnFace); 2267 2372 DeleteObject (hbmLoad); 2268 2373 break; … … 2272 2377 MAKEINTRESOURCEA(IDB_VIEW_SMALL)); 2273 2378 nIndex = ImageList_AddMasked (himlDef, 2274 hbmLoad, CLR_DEFAULT);2379 hbmLoad, comctl32_color.clrBtnFace); 2275 2380 DeleteObject (hbmLoad); 2276 2381 break; … … 2280 2385 MAKEINTRESOURCEA(IDB_VIEW_LARGE)); 2281 2386 nIndex = ImageList_AddMasked (himlDef, 2282 hbmLoad, CLR_DEFAULT);2387 hbmLoad, comctl32_color.clrBtnFace); 2283 2388 DeleteObject (hbmLoad); 2284 2389 break; … … 2288 2393 MAKEINTRESOURCEA(IDB_HIST_SMALL)); 2289 2394 nIndex = ImageList_AddMasked (himlDef, 2290 hbmLoad, CLR_DEFAULT);2395 hbmLoad, comctl32_color.clrBtnFace); 2291 2396 DeleteObject (hbmLoad); 2292 2397 break; … … 2296 2401 MAKEINTRESOURCEA(IDB_HIST_LARGE)); 2297 2402 nIndex = ImageList_AddMasked (himlDef, 2298 hbmLoad, CLR_DEFAULT);2403 hbmLoad, comctl32_color.clrBtnFace); 2299 2404 DeleteObject (hbmLoad); 2300 2405 break; … … 2309 2414 { 2310 2415 hbmLoad = LoadBitmapA (lpAddBmp->hInst, (LPSTR)lpAddBmp->nID); 2311 nIndex = ImageList_AddMasked (himlDef, hbmLoad, CLR_DEFAULT);2416 nIndex = ImageList_AddMasked (himlDef, hbmLoad, comctl32_color.clrBtnFace); 2312 2417 DeleteObject (hbmLoad); 2313 2418 } … … 2317 2422 if (infoPtr->nNumBitmapInfos == 0) 2318 2423 { 2319 infoPtr->bitmaps = COMCTL32_Alloc(sizeof(TBITMAP_INFO));2424 infoPtr->bitmaps = Alloc(sizeof(TBITMAP_INFO)); 2320 2425 } 2321 2426 else 2322 2427 { 2323 2428 TBITMAP_INFO *oldBitmaps = infoPtr->bitmaps; 2324 infoPtr->bitmaps = COMCTL32_Alloc((infoPtr->nNumBitmapInfos + 1) * sizeof(TBITMAP_INFO));2429 infoPtr->bitmaps = Alloc((infoPtr->nNumBitmapInfos + 1) * sizeof(TBITMAP_INFO)); 2325 2430 memcpy(&infoPtr->bitmaps[0], &oldBitmaps[0], infoPtr->nNumBitmapInfos); 2326 2431 } … … 2349 2454 } 2350 2455 2351 InvalidateRect(hwnd, NULL, FALSE);2456 InvalidateRect(hwnd, NULL, TRUE); 2352 2457 2353 2458 return nIndex; … … 2370 2475 if (infoPtr->nNumButtons == 0) { 2371 2476 infoPtr->buttons = 2372 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);2477 Alloc (sizeof(TBUTTON_INFO) * nNewButtons); 2373 2478 } 2374 2479 else { 2375 2480 TBUTTON_INFO *oldButtons = infoPtr->buttons; 2376 2481 infoPtr->buttons = 2377 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);2482 Alloc (sizeof(TBUTTON_INFO) * nNewButtons); 2378 2483 memcpy (&infoPtr->buttons[0], &oldButtons[0], 2379 2484 nOldButtons * sizeof(TBUTTON_INFO)); 2380 COMCTL32_Free (oldButtons);2485 Free (oldButtons); 2381 2486 } 2382 2487 … … 2391 2496 btnPtr->fsStyle = lpTbb[nCount].fsStyle; 2392 2497 btnPtr->dwData = lpTbb[nCount].dwData; 2393 btnPtr->iString = lpTbb[nCount].iString; 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; 2394 2502 btnPtr->bHot = FALSE; 2395 2503 2396 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) {2504 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & BTNS_SEP)) { 2397 2505 TTTOOLINFOA ti; 2398 2506 … … 2413 2521 TOOLBAR_DumpToolbar (infoPtr, __LINE__); 2414 2522 2415 InvalidateRect(hwnd, NULL, FALSE);2523 InvalidateRect(hwnd, NULL, TRUE); 2416 2524 2417 2525 return TRUE; … … 2434 2542 if (infoPtr->nNumButtons == 0) { 2435 2543 infoPtr->buttons = 2436 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);2544 Alloc (sizeof(TBUTTON_INFO) * nNewButtons); 2437 2545 } 2438 2546 else { 2439 2547 TBUTTON_INFO *oldButtons = infoPtr->buttons; 2440 2548 infoPtr->buttons = 2441 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);2549 Alloc (sizeof(TBUTTON_INFO) * nNewButtons); 2442 2550 memcpy (&infoPtr->buttons[0], &oldButtons[0], 2443 2551 nOldButtons * sizeof(TBUTTON_INFO)); 2444 COMCTL32_Free (oldButtons);2552 Free (oldButtons); 2445 2553 } 2446 2554 … … 2455 2563 btnPtr->fsStyle = lpTbb[nCount].fsStyle; 2456 2564 btnPtr->dwData = lpTbb[nCount].dwData; 2457 btnPtr->iString = lpTbb[nCount].iString; 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; 2458 2569 btnPtr->bHot = FALSE; 2459 2570 2460 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) {2571 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & BTNS_SEP)) { 2461 2572 TTTOOLINFOW ti; 2462 2573 … … 2478 2589 TOOLBAR_DumpToolbar (infoPtr, __LINE__); 2479 2590 2480 InvalidateRect(hwnd, NULL, FALSE);2591 InvalidateRect(hwnd, NULL, TRUE); 2481 2592 2482 2593 return TRUE; … … 2502 2613 if (infoPtr->nNumStrings == 0) { 2503 2614 infoPtr->strings = 2504 COMCTL32_Alloc (sizeof(LPWSTR));2615 Alloc (sizeof(LPWSTR)); 2505 2616 } 2506 2617 else { 2507 2618 LPWSTR *oldStrings = infoPtr->strings; 2508 2619 infoPtr->strings = 2509 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2620 Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2510 2621 memcpy (&infoPtr->strings[0], &oldStrings[0], 2511 2622 sizeof(LPWSTR) * infoPtr->nNumStrings); 2512 COMCTL32_Free (oldStrings);2623 Free (oldStrings); 2513 2624 } 2514 2625 2515 /* COMCTL32_Alloc zeros out the allocated memory*/2626 /*Alloc zeros out the allocated memory*/ 2516 2627 Str_SetPtrAtoW (&infoPtr->strings[infoPtr->nNumStrings], szString ); 2517 2628 infoPtr->nNumStrings++; … … 2532 2643 if (infoPtr->nNumStrings == 0) { 2533 2644 infoPtr->strings = 2534 COMCTL32_Alloc (sizeof(LPWSTR));2645 Alloc (sizeof(LPWSTR)); 2535 2646 } 2536 2647 else { 2537 2648 LPWSTR *oldStrings = infoPtr->strings; 2538 2649 infoPtr->strings = 2539 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2650 Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2540 2651 memcpy (&infoPtr->strings[0], &oldStrings[0], 2541 2652 sizeof(LPWSTR) * infoPtr->nNumStrings); 2542 COMCTL32_Free (oldStrings);2653 Free (oldStrings); 2543 2654 } 2544 2655 … … 2580 2691 2581 2692 if (infoPtr->nNumStrings == 0) { 2582 infoPtr->strings = COMCTL32_Alloc (sizeof(LPWSTR));2693 infoPtr->strings = Alloc (sizeof(LPWSTR)); 2583 2694 } 2584 2695 else 2585 2696 { 2586 2697 LPWSTR *oldStrings = infoPtr->strings; 2587 infoPtr->strings = COMCTL32_Alloc(sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2698 infoPtr->strings = Alloc(sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2588 2699 memcpy(&infoPtr->strings[0], &oldStrings[0], 2589 2700 sizeof(LPWSTR) * infoPtr->nNumStrings); 2590 COMCTL32_Free(oldStrings);2701 Free(oldStrings); 2591 2702 } 2592 2703 2593 np= COMCTL32_StrChrW (p, L'|');2704 np=strchrW (p, '|'); 2594 2705 if (np!=NULL) { 2595 2706 len = np - p; … … 2601 2712 TRACE("len=%d %s\n", len, debugstr_w(p)); 2602 2713 infoPtr->strings[infoPtr->nNumStrings] = 2603 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));2714 Alloc (sizeof(WCHAR)*(len+1)); 2604 2715 lstrcpynW (infoPtr->strings[infoPtr->nNumStrings], p, len+1); 2605 2716 infoPtr->nNumStrings++; … … 2613 2724 if (infoPtr->nNumStrings == 0) { 2614 2725 infoPtr->strings = 2615 COMCTL32_Alloc (sizeof(LPWSTR));2726 Alloc (sizeof(LPWSTR)); 2616 2727 } 2617 2728 else { 2618 2729 LPWSTR *oldStrings = infoPtr->strings; 2619 2730 infoPtr->strings = 2620 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2731 Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2621 2732 memcpy (&infoPtr->strings[0], &oldStrings[0], 2622 2733 sizeof(LPWSTR) * infoPtr->nNumStrings); 2623 COMCTL32_Free (oldStrings);2734 Free (oldStrings); 2624 2735 } 2625 2736 … … 2642 2753 if (infoPtr->nNumStrings == 0) { 2643 2754 infoPtr->strings = 2644 COMCTL32_Alloc (sizeof(LPWSTR));2755 Alloc (sizeof(LPWSTR)); 2645 2756 } 2646 2757 else { 2647 2758 LPWSTR *oldStrings = infoPtr->strings; 2648 2759 infoPtr->strings = 2649 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));2760 Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1)); 2650 2761 memcpy (&infoPtr->strings[0], &oldStrings[0], 2651 2762 sizeof(LPWSTR) * infoPtr->nNumStrings); 2652 COMCTL32_Free (oldStrings);2763 Free (oldStrings); 2653 2764 } 2654 2765 … … 2700 2811 cx = infoPtr->nWidth; 2701 2812 2702 if ( dwStyle &CCS_NOMOVEY) {2813 if ((dwStyle & CCS_BOTTOM) == CCS_NOMOVEY) { 2703 2814 GetWindowRect(hwnd, &window_rect); 2704 2815 ScreenToClient(parent, (LPPOINT)&window_rect.left); 2705 2816 y = window_rect.top; 2706 2817 } 2818 if ((dwStyle & CCS_BOTTOM) == CCS_BOTTOM) { 2819 GetWindowRect(hwnd, &window_rect); 2820 y = parent_rect.bottom - ( window_rect.bottom - window_rect.top); 2821 } 2707 2822 } 2708 2823 … … 2721 2836 2722 2837 infoPtr->bAutoSize = TRUE; 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 */ 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 */ 2727 2841 infoPtr->bAutoSize = FALSE; 2728 2842 … … 2764 2878 INT nIndex; 2765 2879 2880 TRACE("button %d, iBitmap now %d\n", wParam, LOWORD(lParam)); 2881 2766 2882 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); 2767 2883 if (nIndex == -1) … … 2789 2905 2790 2906 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); 2907 2908 TRACE("hwnd=%p, btn index=%d, lParam=0x%08lx\n", hwnd, nIndex, lParam); 2909 2791 2910 if (nIndex == -1) 2792 2911 return FALSE; 2793 2912 2794 2913 btnPtr = &infoPtr->buttons[nIndex]; 2795 2796 if (!(btnPtr->fsStyle & TBSTYLE_CHECK))2797 return FALSE;2798 2914 2799 2915 bChecked = (btnPtr->fsState & TBSTATE_CHECKED) ? TRUE : FALSE; … … 2802 2918 btnPtr->fsState &= ~TBSTATE_CHECKED; 2803 2919 else { 2804 if (btnPtr->fsStyle & TBSTYLE_GROUP) {2920 if (btnPtr->fsStyle & BTNS_GROUP) { 2805 2921 nOldIndex = 2806 2922 TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, nIndex); … … 2815 2931 if( bChecked != LOWORD(lParam) ) 2816 2932 { 2817 if (nOldIndex != -1) 2818 { 2819 InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, 2820 TOOLBAR_HasText(infoPtr, &infoPtr->buttons[nOldIndex])); 2821 } 2933 if (nOldIndex != -1) 2934 InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, TRUE); 2822 2935 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 2823 2936 } … … 2857 2970 if (!(hRes = FindResourceA (COMCTL32_hModule, 2858 2971 MAKEINTRESOURCEA(IDD_TBCUSTOMIZE), 2859 RT_DIALOGA)))2972 (LPSTR)RT_DIALOGA))) 2860 2973 return FALSE; 2861 2974 … … 2887 3000 2888 3001 if ((infoPtr->hwndToolTip) && 2889 !(infoPtr->buttons[nIndex].fsStyle & TBSTYLE_SEP)) {3002 !(infoPtr->buttons[nIndex].fsStyle & BTNS_SEP)) { 2890 3003 TTTOOLINFOA ti; 2891 3004 … … 2900 3013 if (infoPtr->nNumButtons == 1) { 2901 3014 TRACE(" simple delete!\n"); 2902 COMCTL32_Free (infoPtr->buttons);3015 Free (infoPtr->buttons); 2903 3016 infoPtr->buttons = NULL; 2904 3017 infoPtr->nNumButtons = 0; … … 2909 3022 2910 3023 infoPtr->nNumButtons--; 2911 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);3024 infoPtr->buttons = Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons); 2912 3025 if (nIndex > 0) { 2913 3026 memcpy (&infoPtr->buttons[0], &oldButtons[0], … … 2920 3033 } 2921 3034 2922 COMCTL32_Free (oldButtons);3035 Free (oldButtons); 2923 3036 } 2924 3037 … … 2940 3053 2941 3054 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); 3055 3056 TRACE("hwnd=%p, btn index=%d, lParam=0x%08lx\n", hwnd, wParam, lParam); 3057 2942 3058 if (nIndex == -1) 2943 3059 return FALSE; … … 2956 3072 /* redraw the button only if the state of the button changed */ 2957 3073 if(bState != (btnPtr->fsState & TBSTATE_ENABLED)) 2958 { 2959 InvalidateRect(hwnd, &btnPtr->rect, 2960 TOOLBAR_HasText(infoPtr, btnPtr)); 2961 } 3074 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 2962 3075 2963 3076 return TRUE; … … 3047 3160 3048 3161 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 LRESULT3071 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;3094 3162 3095 3163 if (lpTbInfo->dwMask & TBIF_COMMAND) … … 3106 3174 lpTbInfo->fsStyle = btnPtr->fsStyle; 3107 3175 if (lpTbInfo->dwMask & TBIF_TEXT) { 3108 LPWSTR lpText = TOOLBAR_GetText(infoPtr,btnPtr); 3109 Str_GetPtrW (lpText,lpTbInfo->pszText,lpTbInfo->cchText); 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'; 3110 3235 } 3111 3236 … … 3173 3298 TOOLBAR_GetDisabledImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) 3174 3299 { 3175 return (LRESULT)GETDISIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), 0); 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); 3176 3303 } 3177 3304 … … 3182 3309 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 3183 3310 3311 TRACE("\n"); 3312 3184 3313 return infoPtr->dwExStyle; 3185 3314 } … … 3189 3318 TOOLBAR_GetHotImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) 3190 3319 { 3191 return (LRESULT)GETHOTIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), 0); 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); 3192 3323 } 3193 3324 … … 3211 3342 TOOLBAR_GetDefImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) 3212 3343 { 3213 return (LRESULT) GETDEFIMAGELIST(TOOLBAR_GetInfoPtr(hwnd), 0); 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); 3214 3347 } 3215 3348 … … 3432 3565 TBUTTON_INFO *btnPtr; 3433 3566 INT nIndex; 3567 DWORD oldState; 3434 3568 3435 3569 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); … … 3438 3572 3439 3573 btnPtr = &infoPtr->buttons[nIndex]; 3574 oldState = btnPtr->fsState; 3440 3575 if (LOWORD(lParam) == FALSE) 3441 3576 btnPtr->fsState &= ~TBSTATE_INDETERMINATE; … … 3443 3578 btnPtr->fsState |= TBSTATE_INDETERMINATE; 3444 3579 3445 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); 3580 if(oldState != btnPtr->fsState) 3581 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 3446 3582 3447 3583 return TRUE; … … 3484 3620 debugstr_a((LPSTR)lpTbb->iString)); 3485 3621 len = strlen((LPSTR)lpTbb->iString) + 2; 3486 ptr = COMCTL32_Alloc(len);3622 ptr = Alloc(len); 3487 3623 strcpy(ptr, (LPSTR)lpTbb->iString); 3488 3624 ptr[len - 1] = 0; /* ended by two '\0' */ 3489 3625 lpTbb->iString = TOOLBAR_AddStringA(hwnd, 0, (LPARAM)ptr); 3490 COMCTL32_Free(ptr);3626 Free(ptr); 3491 3627 } 3492 3628 … … 3499 3635 oldButtons = infoPtr->buttons; 3500 3636 infoPtr->nNumButtons++; 3501 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);3637 infoPtr->buttons = Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons); 3502 3638 /* pre insert copy */ 3503 3639 if (nIndex > 0) { … … 3519 3655 infoPtr->buttons[nIndex].iString = lpTbb->iString; 3520 3656 3521 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) {3657 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & BTNS_SEP)) { 3522 3658 TTTOOLINFOA ti; 3523 3659 … … 3539 3675 } 3540 3676 3541 COMCTL32_Free (oldButtons);3677 Free (oldButtons); 3542 3678 3543 3679 TOOLBAR_CalcToolbar (hwnd); … … 3584 3720 debugstr_w((LPWSTR)lpTbb->iString)); 3585 3721 len = strlenW((LPWSTR)lpTbb->iString) + 2; 3586 ptr = COMCTL32_Alloc(len*sizeof(WCHAR));3722 ptr = Alloc(len*sizeof(WCHAR)); 3587 3723 strcpyW(ptr, (LPWSTR)lpTbb->iString); 3588 3724 ptr[len - 1] = 0; /* ended by two '\0' */ 3589 3725 lpTbb->iString = TOOLBAR_AddStringW(hwnd, 0, (LPARAM)ptr); 3590 COMCTL32_Free(ptr);3726 Free(ptr); 3591 3727 } 3592 3728 … … 3599 3735 oldButtons = infoPtr->buttons; 3600 3736 infoPtr->nNumButtons++; 3601 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);3737 infoPtr->buttons = Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons); 3602 3738 /* pre insert copy */ 3603 3739 if (nIndex > 0) { … … 3619 3755 infoPtr->buttons[nIndex].iString = lpTbb->iString; 3620 3756 3621 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) {3757 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & BTNS_SEP)) { 3622 3758 TTTOOLINFOW ti; 3623 3759 … … 3639 3775 } 3640 3776 3641 COMCTL32_Free (oldButtons);3777 Free (oldButtons); 3642 3778 3643 3779 TOOLBAR_CalcToolbar (hwnd); … … 3736 3872 3737 3873 3738 /* << TOOLBAR_LoadImages >> */ 3739 /* << TOOLBAR_MapAccelerator >> */ 3740 /* << TOOLBAR_MarkButton >> */ 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 3741 3951 /* << TOOLBAR_MoveButton >> */ 3742 3952 … … 3748 3958 TBUTTON_INFO *btnPtr; 3749 3959 INT nIndex; 3960 DWORD oldState; 3750 3961 3751 3962 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); … … 3754 3965 3755 3966 btnPtr = &infoPtr->buttons[nIndex]; 3967 oldState = btnPtr->fsState; 3756 3968 if (LOWORD(lParam) == FALSE) 3757 3969 btnPtr->fsState &= ~TBSTATE_PRESSED; … … 3759 3971 btnPtr->fsState |= TBSTATE_PRESSED; 3760 3972 3761 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); 3973 if(oldState != btnPtr->fsState) 3974 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 3762 3975 3763 3976 return TRUE; 3764 3977 } 3765 3978 3766 3979 /* FIXME: there might still be some confusion her between number of buttons 3980 * and number of bitmaps */ 3767 3981 static LRESULT 3768 3982 TOOLBAR_ReplaceBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) … … 3772 3986 HBITMAP hBitmap; 3773 3987 int i = 0, nOldButtons = 0, pos = 0; 3988 int nOldBitmaps, nNewBitmaps; 3774 3989 HIMAGELIST himlDef = 0; 3775 3990 … … 3815 4030 return FALSE; 3816 4031 } 3817 3818 infoPtr->nNumBitmaps = infoPtr->nNumBitmaps - nOldButtons + lpReplace->nButtons; 4032 4033 himlDef = GETDEFIMAGELIST(infoPtr, 0); /* fixme: correct? */ 4034 nOldBitmaps = ImageList_GetImageCount(himlDef); 3819 4035 3820 4036 /* ImageList_Replace(GETDEFIMAGELIST(), pos, hBitmap, NULL); */ 3821 4037 3822 3823 himlDef = GETDEFIMAGELIST(infoPtr, 0); 3824 for (i = pos + nOldButtons - 1; i >= pos; i--) { 4038 for (i = pos + nOldBitmaps - 1; i >= pos; i--) 3825 4039 ImageList_Remove(himlDef, i); 3826 }3827 4040 3828 4041 { … … 3853 4066 DeleteDC (hdcBitmap); 3854 4067 3855 ImageList_AddMasked (himlDef, hbmLoad, CLR_DEFAULT); 4068 ImageList_AddMasked (himlDef, hbmLoad, comctl32_color.clrBtnFace); 4069 nNewBitmaps = ImageList_GetImageCount(himlDef); 3856 4070 DeleteObject (hbmLoad); 3857 4071 } 3858 4072 3859 InvalidateRect(hwnd, NULL, FALSE); 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); 3860 4079 3861 4080 return TRUE; … … 4174 4393 } 4175 4394 4395 /* This function differs a bit from what MSDN says it does: 4396 * 1. lParam contains extended style flags to OR with current style 4397 * (MSDN isn't clear on the OR bit) 4398 * 2. wParam appears to contain extended style flags to be reset 4399 * (MSDN says that this parameter is reserved) 4400 */ 4176 4401 static LRESULT 4177 4402 TOOLBAR_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) … … 4181 4406 4182 4407 dwTemp = 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 } 4408 infoPtr->dwExStyle &= ~wParam; 4409 infoPtr->dwExStyle |= (DWORD)lParam; 4410 4411 TRACE("new style 0x%08lx\n", infoPtr->dwExStyle); 4193 4412 4194 4413 if (infoPtr->dwExStyle & ~TBSTYLE_EX_ALL) 4195 4414 FIXME("Unknown Toolbar Extended Style 0x%08lx. Please report.\n", 4196 4415 (infoPtr->dwExStyle & ~TBSTYLE_EX_ALL)); 4416 4417 TOOLBAR_CalcToolbar (hwnd); 4418 4419 TOOLBAR_AutoSize(hwnd); 4420 4421 InvalidateRect(hwnd, NULL, TRUE); 4197 4422 4198 4423 return (LRESULT)dwTemp; … … 4210 4435 if (infoPtr->iVersion >= 5) 4211 4436 id = wParam; 4437 4438 TRACE("hwnd = %p, himl = %p, id = %d\n", hwnd, himl, id); 4212 4439 4213 4440 himlTemp = TOOLBAR_InsertImageList(&infoPtr->himlHot, … … 4238 4465 btnPtr = &infoPtr->buttons[(INT)wParam]; 4239 4466 btnPtr->bHot = TRUE; 4240 InvalidateRect (hwnd, &btnPtr->rect, 4241 TOOLBAR_HasText(infoPtr, btnPtr)); 4467 InvalidateRect (hwnd, &btnPtr->rect, TRUE); 4242 4468 } 4243 4469 if (nOldHotItem>=0) … … 4245 4471 btnPtr = &infoPtr->buttons[nOldHotItem]; 4246 4472 btnPtr->bHot = FALSE; 4247 InvalidateRect (hwnd, &btnPtr->rect, 4248 TOOLBAR_HasText(infoPtr, btnPtr)); 4473 InvalidateRect (hwnd, &btnPtr->rect, TRUE); 4249 4474 } 4250 4475 } … … 4281 4506 infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); 4282 4507 4283 /* FIXME: redraw ? */4284 4508 InvalidateRect(hwnd, NULL, TRUE); 4285 4509 … … 4335 4559 infoPtr->nMaxTextRows = (INT)wParam; 4336 4560 4561 TOOLBAR_CalcToolbar(hwnd); 4337 4562 return TRUE; 4338 4563 } 4339 4564 4340 4565 4566 /* MSDN gives slightly wrong info on padding. 4567 * 1. It is not only used on buttons with the BTNS_AUTOSIZE style 4568 * 2. It is not used to create a blank area between the edge of the button 4569 * and the text or image if TBSTYLE_LIST is set. It is used to control 4570 * the gap between the image and text. 4571 * 3. It is not applied to both sides. If TBSTYLE_LIST is set it is used 4572 * to control the bottom and right borders [with the border being 4573 * szPadding.cx - (GetSystemMetrics(SM_CXEDGE)+1)], otherwise the padding 4574 * is shared evenly on both sides of the button. 4575 */ 4341 4576 static LRESULT 4342 4577 TOOLBAR_SetPadding (HWND hwnd, WPARAM wParam, LPARAM lParam) … … 4348 4583 infoPtr->szPadding.cx = LOWORD((DWORD)lParam); 4349 4584 infoPtr->szPadding.cy = HIWORD((DWORD)lParam); 4350 FIXME("stub - nothing done with values,cx=%ld, cy=%ld\n",4585 TRACE("cx=%ld, cy=%ld\n", 4351 4586 infoPtr->szPadding.cx, infoPtr->szPadding.cy); 4352 4587 return (LRESULT) oldPad; … … 4391 4626 4392 4627 /* repaint toolbar */ 4393 InvalidateRect(hwnd, NULL, FALSE);4628 InvalidateRect(hwnd, NULL, TRUE); 4394 4629 } 4395 4630 … … 4423 4658 btnPtr->fsState = LOWORD(lParam); 4424 4659 TOOLBAR_CalcToolbar (hwnd); 4425 InvalidateRect(hwnd, 0, T OOLBAR_HasText(infoPtr, btnPtr));4660 InvalidateRect(hwnd, 0, TRUE); 4426 4661 return TRUE; 4427 4662 } … … 4431 4666 { 4432 4667 btnPtr->fsState = LOWORD(lParam); 4433 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, 4434 btnPtr)); 4668 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 4435 4669 } 4436 4670 … … 4442 4676 TOOLBAR_SetStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) 4443 4677 { 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 } 4678 SetWindowLongW(hwnd, GWL_STYLE, lParam); 4465 4679 4466 4680 return TRUE; … … 4472 4686 { 4473 4687 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 4688 4689 TRACE("hwnd=%p, hwndTooltip=%p, lParam=0x%lx\n", hwnd, (HWND)wParam, lParam); 4474 4690 4475 4691 if (infoPtr == NULL) … … 4521 4737 infoPtr->clrBtnHighlight = lParam->clrBtnHighlight; 4522 4738 infoPtr->clrBtnShadow = lParam->clrBtnShadow; 4523 InvalidateRect(hwnd, 0, 0);4739 InvalidateRect(hwnd, NULL, TRUE); 4524 4740 return 0; 4525 4741 } … … 4540 4756 } 4541 4757 4758 4759 static LRESULT 4760 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 else 4777 ERR("String index %d out of range (largest is %d)\n", iString, infoPtr->nNumStrings - 1); 4778 4779 return ret; 4780 } 4781 4782 4783 static LRESULT 4784 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 else 4804 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 it 4810 * 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 } 4542 4817 4543 4818 /*********************************************************************/ … … 4574 4849 btnPtr = &infoPtr->buttons[(INT)wParam]; 4575 4850 btnPtr->bHot = (no_hi) ? FALSE : TRUE; 4576 InvalidateRect (hwnd, &btnPtr->rect, 4577 TOOLBAR_HasText(infoPtr, btnPtr)); 4851 InvalidateRect (hwnd, &btnPtr->rect, TRUE); 4578 4852 } 4579 4853 if (nOldHotItem>=0) { 4580 4854 btnPtr = &infoPtr->buttons[nOldHotItem]; 4581 4855 btnPtr->bHot = FALSE; 4582 InvalidateRect (hwnd, &btnPtr->rect, 4583 TOOLBAR_HasText(infoPtr, btnPtr)); 4856 InvalidateRect (hwnd, &btnPtr->rect, TRUE); 4584 4857 } 4585 4858 GetFocus(); … … 4593 4866 } 4594 4867 4868 /* UNDOCUMENTED MESSAGE: This sets the toolbar global iListGap parameter 4869 * which controls the amount of spacing between the image and the text 4870 * 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 number 4889 * 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 } 4595 4898 4596 4899 static LRESULT … … 4623 4926 HWND hwndParent = GetParent(hwnd); 4624 4927 4625 InvalidateRect(hwnd, 0, 1);4626 4928 GetWindowRect(hwnd, &rc); 4627 4929 MapWindowPoints(0, hwndParent, (LPPOINT)&rc, 2); … … 4649 4951 } 4650 4952 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 4651 4961 4652 4962 static LRESULT … … 4656 4966 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); 4657 4967 LOGFONTA logFont; 4968 4969 TRACE("hwnd = %p\n", hwnd); 4658 4970 4659 4971 /* initialize info structure */ … … 4664 4976 4665 4977 infoPtr->nHeight = infoPtr->nButtonHeight + TOP_BORDER + BOTTOM_BORDER; 4666 infoPtr->nRows = 1;4667 4978 infoPtr->nMaxTextRows = 1; 4668 4979 infoPtr->cxMin = -1; … … 4676 4987 infoPtr->nOldHit = -1; 4677 4988 infoPtr->nHotItem = -2; /* It has to be initially different from nOldHit */ 4678 infoPtr->hwndNotify = GetParent (hwnd);4989 infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent; 4679 4990 infoPtr->bTransparent = (dwStyle & TBSTYLE_TRANSPARENT); 4680 4991 infoPtr->bBtnTranspnt = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_LIST)); … … 4686 4997 infoPtr->clrBtnHighlight = CLR_DEFAULT; 4687 4998 infoPtr->clrBtnShadow = CLR_DEFAULT; 4688 infoPtr->szPadding.cx = 7; 4689 infoPtr->szPadding.cy = 6; 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); 4690 5005 TOOLBAR_NotifyFormat(infoPtr, (WPARAM)hwnd, (LPARAM)NF_REQUERY); 4691 5006 … … 4729 5044 DestroyWindow (infoPtr->hwndToolTip); 4730 5045 5046 /* delete temporary buffer for tooltip text */ 5047 if (infoPtr->pszTooltipText) 5048 HeapFree(GetProcessHeap(), 0, infoPtr->pszTooltipText); 5049 4731 5050 /* delete button data */ 4732 5051 if (infoPtr->buttons) 4733 COMCTL32_Free (infoPtr->buttons);5052 Free (infoPtr->buttons); 4734 5053 4735 5054 /* delete strings */ … … 4738 5057 for (i = 0; i < infoPtr->nNumStrings; i++) 4739 5058 if (infoPtr->strings[i]) 4740 COMCTL32_Free (infoPtr->strings[i]);4741 4742 COMCTL32_Free (infoPtr->strings);5059 Free (infoPtr->strings[i]); 5060 5061 Free (infoPtr->strings); 4743 5062 } 4744 5063 … … 4756 5075 4757 5076 /* free toolbar info data */ 4758 COMCTL32_Free (infoPtr);5077 Free (infoPtr); 4759 5078 SetWindowLongA (hwnd, 0, 0); 4760 5079 … … 4864 5183 btnPtr->fsState |= TBSTATE_PRESSED; 4865 5184 4866 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, 4867 btnPtr)); 5185 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 4868 5186 } 4869 5187 else if (GetWindowLongA (hwnd, GWL_STYLE) & CCS_ADJUSTABLE) … … 4900 5218 4901 5219 /* for EX_DRAWDDARROWS style, click must be in the drop-down arrow rect */ 4902 if ((btnPtr->fsState & TBSTATE_ENABLED) && (btnPtr->fsStyle & TBSTYLE_DROPDOWN) && 4903 ((TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && PtInRect(&arrowRect, pt)) || 4904 (!TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle)))) 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)))))) 4905 5225 { 4906 5226 LRESULT res; … … 4916 5236 nmtb.cchText = 0; 4917 5237 nmtb.pszText = 0; 4918 memset(&nmtb.rcButton, 0, sizeof(RECT));5238 CopyRect(&nmtb.rcButton, &btnPtr->rect); 4919 5239 res = TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, 4920 5240 TBN_DROPDOWN); … … 4932 5252 4933 5253 if (btnPtr->fsState & TBSTATE_ENABLED) 4934 InvalidateRect(hwnd, &btnPtr->rect, T OOLBAR_HasText(infoPtr, btnPtr));5254 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 4935 5255 UpdateWindow(hwnd); 4936 5256 SetCapture (hwnd); … … 4979 5299 infoPtr->buttons[infoPtr->nHotItem].bHot = TRUE; 4980 5300 5301 if (0 <= infoPtr->nButtonDown) { 4981 5302 btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; 4982 5303 btnPtr->fsState &= ~TBSTATE_PRESSED; 4983 5304 4984 if (btnPtr->fsStyle & TBSTYLE_CHECK) {4985 if (btnPtr->fsStyle & TBSTYLE_GROUP) {5305 if (btnPtr->fsStyle & BTNS_CHECK) { 5306 if (btnPtr->fsStyle & BTNS_GROUP) { 4986 5307 nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, 4987 5308 nHit); … … 5001 5322 } 5002 5323 5003 if (nOldIndex != -1) 5004 { 5005 InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, 5006 TOOLBAR_HasText(infoPtr, &infoPtr->buttons[nOldIndex])); 5007 } 5324 if (nOldIndex != -1) 5325 InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, TRUE); 5008 5326 5009 5327 /* … … 5048 5366 TOOLBAR_SendNotify ((NMHDR *) &nmmouse, infoPtr, NM_CLICK); 5049 5367 } 5368 } 5050 5369 return 0; 5051 5370 } … … 5067 5386 5068 5387 if (btnPtr->fsState & TBSTATE_ENABLED) 5069 InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, 5070 btnPtr)); 5388 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 5071 5389 } 5072 5390 return 0; … … 5092 5410 rc1 = hotBtnPtr->rect; 5093 5411 InflateRect (&rc1, 1, 1); 5094 InvalidateRect (hwnd, &rc1, TOOLBAR_HasText(infoPtr, 5095 hotBtnPtr)); 5412 InvalidateRect (hwnd, &rc1, TRUE); 5096 5413 } 5097 5414 … … 5154 5471 if (infoPtr->nOldHit != nHit) 5155 5472 { 5156 /* Remove the effect of an old hot button if the button was enabled and was5473 /* Remove the effect of an old hot button if the button was 5157 5474 drawn with the hot button effect */ 5158 if(infoPtr->nOldHit >= 0 && infoPtr->nOldHit == infoPtr->nHotItem && 5159 (infoPtr->buttons[infoPtr->nOldHit].fsState & TBSTATE_ENABLED)) 5475 if(infoPtr->nOldHit >= 0 && infoPtr->nOldHit == infoPtr->nHotItem) 5160 5476 { 5161 5477 oldBtnPtr = &infoPtr->buttons[infoPtr->nOldHit]; … … 5170 5486 infoPtr->nHotItem = nHit; 5171 5487 5172 /* only enabled buttons show hot effect */ 5173 if(infoPtr->buttons[nHit].fsState & TBSTATE_ENABLED) 5174 { 5175 btnPtr->bHot = TRUE; 5176 } 5488 btnPtr->bHot = TRUE; 5177 5489 } 5178 5490 … … 5190 5502 /* now invalidate the old and new buttons so they will be painted */ 5191 5503 if (oldBtnPtr) 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)); 5504 InvalidateRect (hwnd, &oldBtnPtr->rect, TRUE); 5505 if (btnPtr) 5506 InvalidateRect(hwnd, &btnPtr->rect, TRUE); 5197 5507 5198 5508 if (infoPtr->bCaptured) { … … 5241 5551 5242 5552 /* allocate memory for info structure */ 5243 infoPtr = (TOOLBAR_INFO *) COMCTL32_Alloc (sizeof(TOOLBAR_INFO));5553 infoPtr = (TOOLBAR_INFO *)Alloc (sizeof(TOOLBAR_INFO)); 5244 5554 SetWindowLongA (hwnd, 0, (DWORD)infoPtr); 5245 5555 5246 5556 /* paranoid!! */ 5247 5557 infoPtr->dwStructSize = sizeof(TBBUTTON); 5558 infoPtr->nRows = 1; 5248 5559 5249 5560 /* fix instance handle, if the toolbar was created by CreateToolbarEx() */ … … 5339 5650 5340 5651 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 there 5690 * isn't enough space in buffer passed to us by the 5691 * 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 else 5707 { 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 there 5728 * isn't enough space in buffer passed to us by the 5729 * 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 automatically 5746 * 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 there 5758 * isn't enough space in buffer passed to us by the 5759 * 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 5341 5783 inline static LRESULT 5342 5784 TOOLBAR_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam) … … 5345 5787 LPNMHDR lpnmh = (LPNMHDR)lParam; 5346 5788 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; 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 } 5401 5829 } 5402 5830 … … 5418 5846 INT i; 5419 5847 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 5420 5853 if (lParam == NF_REQUERY) { 5421 i = SendMessageA( GetParent(infoPtr->hwndSelf),5854 i = SendMessageA(infoPtr->hwndNotify, 5422 5855 WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY); 5423 5856 if ((i < NFR_ANSI) || (i > NFR_UNICODE)) { … … 5467 5900 * *previous* status of the redraw flag (either 0 or 1) 5468 5901 * instead of the MSDN documented value of 0 if handled. 5469 * (For laughs see the "consist ancy" with same function5902 * (For laughs see the "consistency" with same function 5470 5903 * in rebar.) 5471 5904 * … … 5542 5975 cx = infoPtr->nWidth; 5543 5976 5544 if ( dwStyle &CCS_NOMOVEY) {5977 if ((dwStyle & CCS_BOTTOM) == CCS_NOMOVEY) { 5545 5978 GetWindowRect(hwnd, &window_rect); 5546 5979 ScreenToClient(parent, (LPPOINT)&window_rect.left); 5547 5980 y = window_rect.top; 5548 5981 } 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 } 5549 5987 } 5550 5988 … … 5565 6003 } 5566 6004 5567 SetWindowPos (hwnd, 0, parent_rect.left - x, parent_rect.top - y, 5568 cx, cy, uPosFlags | SWP_NOZORDER); 5569 } 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); 5570 6049 return 0; 5571 6050 } … … 5588 6067 (TBSTYLE_FLAT | TBSTYLE_LIST)); 5589 6068 TOOLBAR_CheckStyle (hwnd, lpStyle->styleNew); 5590 } 6069 6070 TRACE("new style 0x%08lx\n", lpStyle->styleNew); 6071 } 6072 6073 TOOLBAR_CalcToolbar(hwnd); 5591 6074 5592 6075 TOOLBAR_AutoSize (hwnd); 5593 6076 5594 InvalidateRect(hwnd, NULL, FALSE);6077 InvalidateRect(hwnd, NULL, TRUE); 5595 6078 5596 6079 return 0; … … 5611 6094 ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 5612 6095 { 6096 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); 6097 5613 6098 TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n", 5614 6099 hwnd, uMsg, /* SPY_GetMsgName(uMsg), */ wParam, lParam); … … 5726 6211 return TOOLBAR_GetState (hwnd, wParam, lParam); 5727 6212 6213 case TB_GETSTRINGA: 6214 return TOOLBAR_GetStringA (hwnd, wParam, lParam); 6215 6216 case TB_GETSTRINGW: 6217 return TOOLBAR_GetStringW (hwnd, wParam, lParam); 6218 5728 6219 case TB_GETSTYLE: 5729 6220 return TOOLBAR_GetStyle (hwnd, wParam, lParam); … … 5773 6264 return TOOLBAR_IsButtonPressed (hwnd, wParam, lParam); 5774 6265 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 */ 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 5782 6276 /* case TB_MOVEBUTTON: */ /* 4.71 */ 5783 6277 … … 5865 6359 return TOOLBAR_SetUnicodeFormat (hwnd, wParam, lParam); 5866 6360 6361 case TB_UNKWN45D: 6362 return TOOLBAR_Unkwn45D(hwnd, wParam, lParam); 6363 5867 6364 case TB_UNKWN45E: 5868 6365 return TOOLBAR_Unkwn45E (hwnd, wParam, lParam); 5869 6366 6367 case TB_UNKWN460: 6368 return TOOLBAR_Unkwn460(hwnd, wParam, lParam); 6369 6370 case TB_UNKWN462: 6371 return TOOLBAR_Unkwn462(hwnd, wParam, lParam); 6372 5870 6373 case TB_UNKWN463: 5871 6374 return TOOLBAR_Unkwn463 (hwnd, wParam, lParam); 5872 6375 6376 case TB_UNKWN464: 6377 return TOOLBAR_Unkwn464(hwnd, wParam, lParam); 5873 6378 5874 6379 /* Common Control Messages */ … … 5940 6445 5941 6446 case WM_NOTIFYFORMAT: 5942 TOOLBAR_NotifyFormatFake (hwnd, wParam, lParam);6447 return TOOLBAR_NotifyFormatFake (hwnd, wParam, lParam); 5943 6448 5944 6449 case WM_PAINT: … … 5964 6469 case WM_MEASUREITEM: 5965 6470 case WM_VKEYTOITEM: 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 } 6471 return SendMessageA (infoPtr->hwndNotify, uMsg, wParam, lParam); 5973 6472 5974 6473 /* We see this in Outlook Express 5.x and just does DefWindowProc */ … … 5996 6495 wndClass.cbClsExtra = 0; 5997 6496 wndClass.cbWndExtra = sizeof(TOOLBAR_INFO *); 5998 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);6497 wndClass.hCursor = LoadCursorA (0, (LPSTR)IDC_ARROWA); 5999 6498 wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); 6000 6499 wndClass.lpszClassName = TOOLBARCLASSNAMEA; … … 6023 6522 PIMLENTRY *pnies; 6024 6523 6025 c = (PIMLENTRY) COMCTL32_Alloc(sizeof(IMLENTRY));6524 c = (PIMLENTRY) Alloc(sizeof(IMLENTRY)); 6026 6525 c->id = id; 6027 6526 6028 pnies = COMCTL32_Alloc((*cies + 1) * sizeof(PIMLENTRY));6527 pnies = Alloc((*cies + 1) * sizeof(PIMLENTRY)); 6029 6528 memcpy(pnies, *pies, ((*cies) * sizeof(PIMLENTRY))); 6030 6529 pnies[*cies] = c; 6031 6530 (*cies)++; 6032 6531 6033 COMCTL32_Free(*pies);6532 Free(*pies); 6034 6533 *pies = pnies; 6035 6534 } … … 6047 6546 6048 6547 for (i = 0; i < *cies; i++) 6049 COMCTL32_Free((*pies)[i]);6050 6051 COMCTL32_Free(*pies);6548 Free((*pies)[i]); 6549 6550 Free(*pies); 6052 6551 6053 6552 *cies = 0;
Note:
See TracChangeset
for help on using the changeset viewer.