Changeset 1156 for trunk/src/comctl32/header.c
- Timestamp:
- Oct 6, 1999, 5:41:11 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/header.c
r1141 r1156 1 /* $Id: header.c,v 1.1 4 1999-10-05 16:54:24cbratschi Exp $ */1 /* $Id: header.c,v 1.15 1999-10-06 15:41:10 cbratschi Exp $ */ 2 2 /* 3 3 * Header control … … 10 10 * - Order list support. 11 11 * - Control specific cursors (over dividers). 12 * - Hottrack support (partially).13 12 * - Custom draw support (including Notifications). 14 13 * - Drag and Drop support (including Notifications). 14 * - HDS_FILTERBAR 15 15 * 16 16 * … … 27 27 28 28 29 #define __HDM_LAYOUT_HACK__30 31 32 29 #define VERT_BORDER 4 33 30 #define DIVIDER_WIDTH 10 … … 35 32 #define ITEM_FRAMESIZE 2 36 33 #define TEXT_MARGIN 3 34 #define TIMER_ID 1 35 #define TIMER_MS 200 37 36 38 37 #define HEADER_GetInfoPtr(hwnd) ((HEADER_INFO *)GetWindowLongA(hwnd,0)) … … 368 367 } 369 368 369 static void 370 HEADER_DrawTrackLine (HWND hwnd, HDC hdc, INT x) 371 { 372 RECT rect; 373 HPEN hOldPen; 374 INT oldRop; 375 376 GetClientRect (hwnd, &rect); 377 378 rect.left = x; 379 rect.right = x+1; 380 InvertRect(hdc,&rect); 381 /* //CB: Odin bug!!! This code doesn't work: 382 hOldPen = SelectObject (hdc, GetStockObject (BLACK_PEN)); 383 oldRop = SetROP2 (hdc, R2_XORPEN); 384 MoveToEx (hdc, x, rect.top, NULL); 385 LineTo (hdc, x, rect.bottom); 386 SetROP2 (hdc, oldRop); 387 SelectObject (hdc, hOldPen); 388 */ 389 } 370 390 371 391 static void … … 373 393 { 374 394 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd); 395 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 375 396 HFONT hFont, hOldFont; 376 397 RECT rect; … … 402 423 { 403 424 rect.left = x; 404 if ( GetWindowLongA (hwnd, GWL_STYLE)& HDS_BUTTONS)425 if (dwStyle & HDS_BUTTONS) 405 426 DrawEdge (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT); 406 427 else … … 409 430 410 431 SelectObject (hdc, hOldFont); 432 433 if (infoPtr->bCaptured && infoPtr->bTracking && !(dwStyle & HDS_FULLDRAG)) HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack); 411 434 } 412 435 … … 467 490 } 468 491 } 469 470 471 static void472 HEADER_ForceItemBounds (HWND hwnd, INT cy)473 {474 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);475 HEADER_ITEM *phdi;476 int i, x;477 478 if (infoPtr->uNumItem == 0)479 return;480 481 x = 0;482 for (i = 0; i < infoPtr->uNumItem; i++) {483 phdi = &infoPtr->items[i];484 phdi->rect.top = 0;485 phdi->rect.bottom = cy;486 phdi->rect.left = x;487 phdi->rect.right = phdi->rect.left + phdi->cxy;488 x = phdi->rect.right;489 }490 }491 492 492 493 493 static void … … 627 627 } 628 628 629 630 static void631 HEADER_DrawTrackLine (HWND hwnd, HDC hdc, INT x)632 {633 RECT rect;634 HPEN hOldPen;635 INT oldRop;636 637 GetClientRect (hwnd, &rect);638 639 rect.left = x;640 rect.right = x+1;641 InvertRect(hdc,&rect);642 /* //CB: Odin bug!!! This code doesn't work:643 hOldPen = SelectObject (hdc, GetStockObject (BLACK_PEN));644 oldRop = SetROP2 (hdc, R2_XORPEN);645 MoveToEx (hdc, x, rect.top, NULL);646 LineTo (hdc, x, rect.bottom);647 SetROP2 (hdc, oldRop);648 SelectObject (hdc, hOldPen);649 */650 }651 652 629 static BOOL 653 630 HEADER_SendSimpleNotify (HWND hwnd, UINT code) … … 663 640 } 664 641 665 666 642 static BOOL 667 HEADER_SendHeaderNotify (HWND hwnd, UINT code, INT iItem)668 { 669 HEADER_INFO *infoPtr = HEADER_GetInfoPtr 643 HEADER_SendHeaderNotifyA(HWND hwnd,UINT code,INT iItem,INT iButton) 644 { 645 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); 670 646 NMHEADERA nmhdr; 671 647 HDITEMA nmitem; 648 char* text; 649 BOOL res; 650 651 if (infoPtr->items[iItem].pszText) 652 { 653 INT len = lstrlenW(infoPtr->items[iItem].pszText); 654 655 if (len > 0) 656 { 657 text = COMCTL32_Alloc(len+1); 658 lstrcpyWtoA(text,infoPtr->items[iItem].pszText); 659 } else text = NULL; 660 } else text = NULL; 672 661 673 662 nmhdr.hdr.hwndFrom = hwnd; 674 nmhdr.hdr.idFrom = GetWindowLongA (hwnd,GWL_ID);663 nmhdr.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID); 675 664 nmhdr.hdr.code = code; 676 nmhdr.iItem = iItem;665 nmhdr.iItem = iItem; 677 666 nmhdr.iButton = 0; 678 nmhdr.pitem = &nmitem; 679 nmitem.mask = 0; 680 nmitem.cxy = infoPtr->items[iItem].cxy; 681 nmitem.hbm = infoPtr->items[iItem].hbm; 682 nmitem.pszText = NULL; 683 nmitem.cchTextMax = 0; 684 /* nmitem.pszText = infoPtr->items[iItem].pszText; */ 685 /* nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax; */ 686 nmitem.fmt = infoPtr->items[iItem].fmt; 687 nmitem.lParam = infoPtr->items[iItem].lParam; 688 nmitem.iOrder = infoPtr->items[iItem].iOrder; 689 nmitem.iImage = infoPtr->items[iItem].iImage; 690 691 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY, 692 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr); 693 } 694 667 nmhdr.pitem = &nmitem; 668 669 nmitem.mask = 0; 670 nmitem.cxy = infoPtr->items[iItem].cxy; 671 nmitem.hbm = infoPtr->items[iItem].hbm; 672 nmitem.pszText = text; 673 nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax; 674 nmitem.fmt = infoPtr->items[iItem].fmt; 675 nmitem.lParam = infoPtr->items[iItem].lParam; 676 nmitem.iImage = infoPtr->items[iItem].iImage; 677 nmitem.iOrder = infoPtr->items[iItem].iOrder; 678 nmitem.type = infoPtr->items[iItem].type; 679 nmitem.pvFilter = infoPtr->items[iItem].pvFilter; 680 681 res = (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr); 682 683 if (text) COMCTL32_Free(text); 684 685 return res; 686 } 695 687 696 688 static BOOL 697 HEADER_SendClickNotify (HWND hwnd, UINT code, INT iItem) 689 HEADER_SendHeaderNotifyW(HWND hwnd,UINT code,INT iItem,INT iButton) 690 { 691 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); 692 NMHEADERW nmhdr; 693 HDITEMW nmitem; 694 695 nmhdr.hdr.hwndFrom = hwnd; 696 nmhdr.hdr.idFrom = GetWindowLongW(hwnd,GWL_ID); 697 nmhdr.hdr.code = code; 698 nmhdr.iItem = iItem; 699 nmhdr.iButton = 0; 700 nmhdr.pitem = &nmitem; 701 702 nmitem.mask = 0; 703 nmitem.cxy = infoPtr->items[iItem].cxy; 704 nmitem.hbm = infoPtr->items[iItem].hbm; 705 nmitem.pszText = infoPtr->items[iItem].pszText; 706 nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax; 707 nmitem.fmt = infoPtr->items[iItem].fmt; 708 nmitem.lParam = infoPtr->items[iItem].lParam; 709 nmitem.iImage = infoPtr->items[iItem].iImage; 710 nmitem.iOrder = infoPtr->items[iItem].iOrder; 711 nmitem.type = infoPtr->items[iItem].type; 712 nmitem.pvFilter = infoPtr->items[iItem].pvFilter; 713 714 return (BOOL)SendMessageW(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr); 715 } 716 717 static BOOL 718 HEADER_SendItemChanging(HWND hwnd,INT iItem) 719 { 720 if (IsWindowUnicode(GetParent(hwnd))) 721 return HEADER_SendHeaderNotifyA(hwnd,HDN_ITEMCHANGINGA,iItem,0); 722 else 723 return HEADER_SendHeaderNotifyW(hwnd,HDN_ITEMCHANGINGW,iItem,0); 724 } 725 726 static BOOL 727 HEADER_SendItemChanged(HWND hwnd,INT iItem) 728 { 729 if (IsWindowUnicode(GetParent(hwnd))) 730 return HEADER_SendHeaderNotifyA(hwnd,HDN_ITEMCHANGEDA,iItem,0); 731 else 732 return HEADER_SendHeaderNotifyW(hwnd,HDN_ITEMCHANGEDW,iItem,0); 733 } 734 735 static BOOL 736 HEADER_SendItemDblClick(HWND hwnd,INT iItem,INT iButton) 737 { 738 if (IsWindowUnicode(GetParent(hwnd))) 739 return HEADER_SendHeaderNotifyA(hwnd,HDN_ITEMDBLCLICKA,iItem,iButton); 740 else 741 return HEADER_SendHeaderNotifyW(hwnd,HDN_ITEMDBLCLICKW,iItem,iButton); 742 } 743 744 static BOOL 745 HEADER_SendDividerDblClick(HWND hwnd,INT iItem,INT iButton) 746 { 747 if (IsWindowUnicode(GetParent(hwnd))) 748 return HEADER_SendHeaderNotifyA(hwnd,HDN_DIVIDERDBLCLICKA,iItem,iButton); 749 else 750 return HEADER_SendHeaderNotifyW(hwnd,HDN_DIVIDERDBLCLICKW,iItem,iButton); 751 } 752 753 static BOOL 754 HEADER_SendBeginTrack(HWND hwnd,INT iItem,INT iButton) 755 { 756 if (IsWindowUnicode(GetParent(hwnd))) 757 return HEADER_SendHeaderNotifyA(hwnd,HDN_BEGINTRACKA,iItem,iButton); 758 else 759 return HEADER_SendHeaderNotifyW(hwnd,HDN_BEGINTRACKW,iItem,iButton); 760 } 761 762 static BOOL 763 HEADER_SendEndTrack(HWND hwnd,INT iItem,INT iButton) 764 { 765 if (IsWindowUnicode(GetParent(hwnd))) 766 return HEADER_SendHeaderNotifyA(hwnd,HDN_ENDTRACKA,iItem,iButton); 767 else 768 return HEADER_SendHeaderNotifyW(hwnd,HDN_ENDTRACKW,iItem,iButton); 769 } 770 771 static BOOL 772 HEADER_SendTrack(HWND hwnd,INT iItem) 773 { 774 if (IsWindowUnicode(GetParent(hwnd))) 775 return HEADER_SendHeaderNotifyA(hwnd,HDN_TRACKA,iItem,0); 776 else 777 return HEADER_SendHeaderNotifyW(hwnd,HDN_TRACKW,iItem,0); 778 } 779 780 static BOOL 781 HEADER_SendClickNotifyA(HWND hwnd,UINT code,INT iItem,INT iButton) 698 782 { 699 783 NMHEADERA nmhdr; 700 784 701 785 nmhdr.hdr.hwndFrom = hwnd; 702 nmhdr.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID); 703 nmhdr.hdr.code = code; 704 nmhdr.iItem = iItem; 705 nmhdr.iButton = 0; 706 nmhdr.pitem = NULL; 707 708 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY, 709 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr); 786 nmhdr.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID); 787 nmhdr.hdr.code = code; 788 nmhdr.iItem = iItem; 789 nmhdr.iButton = iButton; 790 nmhdr.pitem = NULL; 791 792 return (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr); 793 } 794 795 static BOOL 796 HEADER_SendClickNotifyW(HWND hwnd,UINT code,INT iItem,INT iButton) 797 { 798 NMHEADERW nmhdr; 799 800 nmhdr.hdr.hwndFrom = hwnd; 801 nmhdr.hdr.idFrom = GetWindowLongW(hwnd,GWL_ID); 802 nmhdr.hdr.code = code; 803 nmhdr.iItem = iItem; 804 nmhdr.iButton = iButton; 805 nmhdr.pitem = NULL; 806 807 return (BOOL)SendMessageW(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr); 808 } 809 810 static BOOL 811 HEADER_SendItemClick(HWND hwnd,INT iItem,INT iButton) 812 { 813 if (IsWindowUnicode(GetParent(hwnd))) 814 return HEADER_SendClickNotifyA(hwnd,HDN_ITEMCLICKA,iItem,iButton); 815 else 816 return HEADER_SendClickNotifyW(hwnd,HDN_ITEMCLICKW,iItem,iButton); 817 } 818 819 static BOOL 820 HEADER_SendDragNotify(HWND hwnd,UINT code,INT iItem,INT iButton) 821 { 822 NMHEADERA nmhdr; 823 824 nmhdr.hdr.hwndFrom = hwnd; 825 nmhdr.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID); 826 nmhdr.hdr.code = code; 827 nmhdr.iItem = iItem; 828 nmhdr.iButton = iButton; 829 nmhdr.pitem = NULL; 830 831 return (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr); 832 } 833 834 static BOOL 835 HEADER_SendFilterBtnClick(HWND hwnd,INT iItem,RECT iRect) 836 { 837 NMHDFILTERBTNCLICK nmhdr; 838 839 nmhdr.hdr.hwndFrom = hwnd; 840 nmhdr.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID); 841 nmhdr.hdr.code = HDN_FILTERBTNCLICK; 842 nmhdr.iItem = iItem; 843 nmhdr.rc = iRect; 844 845 return (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr); 846 } 847 848 static BOOL 849 HEADER_SendFilterChange(HWND hwnd,INT iItem) 850 { 851 NMHEADERA nmhdr; 852 853 nmhdr.hdr.hwndFrom = hwnd; 854 nmhdr.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID); 855 nmhdr.hdr.code = HDN_FILTERCHANGE; 856 nmhdr.iItem = iItem; 857 nmhdr.iButton = 0; 858 nmhdr.pitem = NULL; 859 860 return (BOOL)SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.hdr.idFrom,(LPARAM)&nmhdr); 710 861 } 711 862 … … 743 894 744 895 static LRESULT 745 HEADER_CreateDragImage (HWND hwnd, WPARAM wParam)896 HEADER_CreateDragImage(HWND hwnd,WPARAM wParam,LPARAM lParam) 746 897 { 747 898 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); … … 1201 1352 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd); 1202 1353 LPHDLAYOUT lpLayout = (LPHDLAYOUT)lParam; 1354 1355 if (!lpLayout) return FALSE; 1203 1356 1204 1357 lpLayout->pwpos->hwnd = hwnd; … … 1217 1370 // lpLayout->pwpos->cx, lpLayout->pwpos->cy); 1218 1371 1219 HEADER_ForceItemBounds (hwnd, lpLayout->pwpos->cy);1220 1221 /* hack */1222 #ifdef __HDM_LAYOUT_HACK__1223 MoveWindow (lpLayout->pwpos->hwnd, lpLayout->pwpos->x, lpLayout->pwpos->y,1224 lpLayout->pwpos->cx, lpLayout->pwpos->cy, TRUE);1225 #endif1226 1227 1372 return TRUE; 1228 1373 } … … 1258 1403 1259 1404 // TRACE (header, "[nItem=%d]\n", nItem); 1260 1261 if (HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGINGA,nItem)) return FALSE; 1405 if (HEADER_SendItemChanging(hwnd,nItem)) return FALSE; 1262 1406 1263 1407 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem]; … … 1307 1451 } 1308 1452 1309 HEADER_Send HeaderNotify(hwnd,HDN_ITEMCHANGEDA,nItem);1453 HEADER_SendItemChanged(hwnd,nItem); 1310 1454 1311 1455 HEADER_SetItemBounds(hwnd,0); … … 1331 1475 // TRACE (header, "[nItem=%d]\n", nItem); 1332 1476 1333 if (HEADER_Send HeaderNotify(hwnd,HDN_ITEMCHANGINGW,nItem)) return FALSE;1477 if (HEADER_SendItemChanging(hwnd,nItem)) return FALSE; 1334 1478 1335 1479 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem]; … … 1379 1523 } 1380 1524 1381 HEADER_Send HeaderNotify(hwnd,HDN_ITEMCHANGEDW,nItem);1525 HEADER_SendItemChanged(hwnd,nItem); 1382 1526 1383 1527 HEADER_SetItemBounds(hwnd,0); … … 1416 1560 infoPtr->hcurDivider = LoadCursorA (0, IDC_SIZEWEA); 1417 1561 infoPtr->hcurDivopen = LoadCursorA (0, IDC_SIZENSA); 1562 infoPtr->bCaptured = FALSE; 1418 1563 infoPtr->bPressed = FALSE; 1419 1564 infoPtr->bTracking = FALSE; 1565 infoPtr->bDragDrop = FALSE; 1566 infoPtr->bTimer = FALSE; 1420 1567 infoPtr->iMoveItem = 0; 1421 infoPtr->himl = 0; 1422 infoPtr->iHotItem = -1; 1568 infoPtr->himl = 0; 1569 infoPtr->dragImage = 0; 1570 infoPtr->iHotItem = -1; 1423 1571 infoPtr->xBmpMargin = 3*GetSystemMetrics(SM_CXEDGE); 1424 infoPtr->bUnicode = IsWindowUnicode 1572 infoPtr->bUnicode = IsWindowUnicode(hwnd); 1425 1573 1426 1574 hdc = GetDC (0); … … 1492 1640 1493 1641 if ((GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) && (flags == HHT_ONHEADER)) 1494 HEADER_Send HeaderNotify (hwnd, HDN_ITEMDBLCLICKA, nItem);1642 HEADER_SendItemDblClick(hwnd,nItem,0); 1495 1643 else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) 1496 HEADER_Send HeaderNotify (hwnd, HDN_DIVIDERDBLCLICKA, nItem);1644 HEADER_SendDividerDblClick(hwnd,nItem,0); 1497 1645 1498 1646 return 0; … … 1510 1658 HDC hdc; 1511 1659 1512 pt.x = ( INT)LOWORD(lParam);1513 pt.y = ( INT)HIWORD(lParam);1660 pt.x = (SHORT)LOWORD(lParam); 1661 pt.y = (SHORT)HIWORD(lParam); 1514 1662 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem); 1515 1663 … … 1529 1677 1530 1678 // TRACE (header, "Pressed item %d!\n", nItem); 1531 } 1532 else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) 1533 { 1534 if (!(HEADER_SendHeaderNotify (hwnd, HDN_BEGINTRACKA, nItem))) 1679 } else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) 1680 { 1681 if (!(HEADER_SendBeginTrack(hwnd,nItem,0))) 1535 1682 { 1536 1683 SetCapture (hwnd); … … 1568 1715 HDC hdc; 1569 1716 1570 pt.x = ( INT)LOWORD(lParam);1571 pt.y = ( INT)HIWORD(lParam);1717 pt.x = (SHORT)LOWORD(lParam); 1718 pt.y = (SHORT)HIWORD(lParam); 1572 1719 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem); 1573 1720 1574 1721 if (infoPtr->bPressed) 1575 1722 { 1576 if ( (nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER))1723 if (PtInRect(&infoPtr->items[infoPtr->iMoveItem].rect,pt)) 1577 1724 { 1578 1725 infoPtr->items[infoPtr->iMoveItem].bDown = FALSE; 1579 hdc = GetDC 1580 HEADER_RefreshItem (hwnd, hdc,infoPtr->iMoveItem);1581 ReleaseDC (hwnd,hdc);1582 1583 HEADER_Send ClickNotify (hwnd, HDN_ITEMCLICKA, infoPtr->iMoveItem);1726 hdc = GetDC(hwnd); 1727 HEADER_RefreshItem(hwnd,hdc,infoPtr->iMoveItem); 1728 ReleaseDC(hwnd,hdc); 1729 1730 HEADER_SendItemClick(hwnd,infoPtr->iMoveItem,0); 1584 1731 } 1585 1732 // TRACE (header, "Released item %d!\n", infoPtr->iMoveItem); 1586 1733 infoPtr->bPressed = FALSE; 1587 } 1588 else if (infoPtr->bTracking) 1734 } else if (infoPtr->bTracking) 1589 1735 { 1590 1736 // TRACE (header, "End tracking item %d!\n", infoPtr->iMoveItem); 1591 1737 infoPtr->bTracking = FALSE; 1592 1738 1593 HEADER_Send HeaderNotify (hwnd, HDN_ENDTRACKA, infoPtr->iMoveItem);1739 HEADER_SendEndTrack(hwnd,infoPtr->iMoveItem,0); 1594 1740 1595 1741 if (!(dwStyle & HDS_FULLDRAG)) … … 1598 1744 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1599 1745 ReleaseDC (hwnd, hdc); 1600 if (HEADER_Send HeaderNotify (hwnd, HDN_ITEMCHANGINGA,infoPtr->iMoveItem))1746 if (HEADER_SendItemChanging(hwnd,infoPtr->iMoveItem)) 1601 1747 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; 1602 1748 else … … 1608 1754 { 1609 1755 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth; 1610 HEADER_Send HeaderNotify (hwnd, HDN_ITEMCHANGEDA,infoPtr->iMoveItem);1756 HEADER_SendItemChanged(hwnd,infoPtr->iMoveItem); 1611 1757 1612 1758 HEADER_SetItemBounds (hwnd,infoPtr->iMoveItem); … … 1618 1764 } 1619 1765 1620 if (infoPtr->bCaptured) { 1621 infoPtr->bCaptured = FALSE; 1622 ReleaseCapture (); 1623 HEADER_SendSimpleNotify (hwnd, NM_RELEASEDCAPTURE); 1766 if (infoPtr->bCaptured) 1767 { 1768 infoPtr->bCaptured = FALSE; 1769 ReleaseCapture(); 1770 HEADER_SendSimpleNotify(hwnd,NM_RELEASEDCAPTURE); 1624 1771 } 1625 1772 … … 1642 1789 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem); 1643 1790 1644 if ( (dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK) &&!infoPtr->bCaptured)1791 if (dwStyle & HDS_BUTTONS && dwStyle & HDS_HOTTRACK) //CB: check with no buttons 1645 1792 { 1646 1793 INT newItem; 1647 1794 1648 if ( flags & (HHT_ONHEADER | HHT_ONDIVIDER | HHT_ONDIVOPEN))1649 newItem = nItem;1795 if (infoPtr->bCaptured && infoPtr->bPressed && PtInRect(&infoPtr->items[infoPtr->iMoveItem].rect,pt)) 1796 newItem = infoPtr->iMoveItem; 1650 1797 else 1651 newItem = -1; 1798 { 1799 if (flags & (HHT_ONHEADER | HHT_ONDIVIDER | HHT_ONDIVOPEN)) 1800 newItem = nItem; 1801 else 1802 newItem = -1; 1803 } 1652 1804 if (newItem != infoPtr->iHotItem) 1653 1805 { 1654 INT oldItem = infoPtr->iHotItem;1655 1656 1806 infoPtr->iHotItem = newItem; 1657 1807 HEADER_Refresh(hwnd); 1658 1808 } 1809 if (!infoPtr->bTimer && infoPtr->iHotItem != -1) 1810 { 1811 infoPtr->bTimer = TRUE; 1812 SetTimer(hwnd,TIMER_ID,TIMER_MS,NULL); 1813 } else if (infoPtr->bTimer && infoPtr->iHotItem == -1) 1814 { 1815 KillTimer(hwnd,TIMER_ID); 1816 infoPtr->bTimer = FALSE; 1817 } 1659 1818 } 1660 1819 1661 1820 if (infoPtr->bCaptured) 1662 1821 { 1663 if (infoPtr->bPressed) 1822 if (infoPtr->bPressed) 1823 { 1824 if (dwStyle & HDS_DRAGDROP && (infoPtr->bDragDrop || !HEADER_SendDragNotify(hwnd,HDN_BEGINDRAG,infoPtr->iMoveItem,0))) 1664 1825 { 1665 BOOL newDown; 1666 1667 if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER)) 1668 newDown = TRUE; 1669 else 1670 newDown = FALSE; 1671 1672 if (newDown != infoPtr->items[infoPtr->iMoveItem].bDown) 1673 { 1674 infoPtr->items[infoPtr->iMoveItem].bDown = newDown; 1675 hdc = GetDC (hwnd); 1676 HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem); 1677 ReleaseDC (hwnd, hdc); 1678 } 1679 // TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem); 1680 } else if (infoPtr->bTracking) 1826 if (!infoPtr->bDragDrop) 1827 { 1828 infoPtr->bDragDrop = TRUE; 1829 infoPtr->dragImage = (HIMAGELIST)HEADER_CreateDragImage(hwnd,0,0); 1830 } 1831 //CB:todo 1832 } else 1681 1833 { 1682 if (dwStyle & HDS_FULLDRAG) 1834 BOOL newDown; 1835 1836 if (PtInRect(&infoPtr->items[infoPtr->iMoveItem].rect,pt)) 1837 newDown = TRUE; 1838 else 1839 newDown = FALSE; 1840 1841 if (newDown != infoPtr->items[infoPtr->iMoveItem].bDown) 1683 1842 { 1684 if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem)) 1685 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; 1686 else 1687 { 1688 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset; 1689 if (nWidth < MIN_ITEMWIDTH) nWidth = MIN_ITEMWIDTH; 1690 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth; 1691 HEADER_SendHeaderNotify(hwnd,HDN_ITEMCHANGEDA,infoPtr->iMoveItem); 1692 } 1693 HEADER_SetItemBounds (hwnd,infoPtr->iMoveItem); 1694 HEADER_Refresh(hwnd); 1695 } else 1696 { 1697 INT lastPos = infoPtr->xOldTrack; 1698 1843 infoPtr->items[infoPtr->iMoveItem].bDown = newDown; 1699 1844 hdc = GetDC (hwnd); 1700 infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset; 1701 if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH) 1702 infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH; 1703 infoPtr->items[infoPtr->iMoveItem].cxy = 1704 infoPtr->xOldTrack-infoPtr->items[infoPtr->iMoveItem].rect.left; 1705 if (lastPos != infoPtr->xOldTrack) 1706 { 1707 HEADER_DrawTrackLine(hwnd,hdc,lastPos); 1708 HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack); 1709 } 1845 HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem); 1710 1846 ReleaseDC (hwnd, hdc); 1711 1847 } 1712 1713 HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem); 1848 } 1849 // TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem); 1850 } else if (infoPtr->bTracking) 1851 { 1852 if (dwStyle & HDS_FULLDRAG) 1853 { 1854 if (HEADER_SendItemChanging(hwnd,infoPtr->iMoveItem)) 1855 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; 1856 else 1857 { 1858 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset; 1859 if (nWidth < MIN_ITEMWIDTH) nWidth = MIN_ITEMWIDTH; 1860 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth; 1861 HEADER_SendItemChanged(hwnd,infoPtr->iMoveItem); 1862 } 1863 HEADER_SetItemBounds (hwnd,infoPtr->iMoveItem); 1864 HEADER_Refresh(hwnd); 1865 } else 1866 { 1867 INT lastPos = infoPtr->xOldTrack; 1868 1869 hdc = GetDC (hwnd); 1870 infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset; 1871 if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH) 1872 infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH; 1873 infoPtr->items[infoPtr->iMoveItem].cxy = 1874 infoPtr->xOldTrack-infoPtr->items[infoPtr->iMoveItem].rect.left; 1875 if (lastPos != infoPtr->xOldTrack) 1876 { 1877 HEADER_DrawTrackLine(hwnd,hdc,lastPos); 1878 HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack); 1879 } 1880 ReleaseDC (hwnd, hdc); 1881 } 1882 1883 HEADER_SendTrack(hwnd,infoPtr->iMoveItem); 1714 1884 // TRACE (header, "Tracking item %d!\n", infoPtr->iMoveItem); 1715 1885 } 1716 1886 } 1717 1887 1718 1888 return 0; 1889 } 1890 1891 static LRESULT 1892 HEADER_Size(HWND hwnd,WPARAM wParam,LPARAM lParam) 1893 { 1894 HEADER_SetItemBounds(hwnd,0); 1895 1896 return DefWindowProcA(hwnd,WM_SIZE,wParam,lParam); 1897 } 1898 1899 static LRESULT 1900 HEADER_Timer(HWND hwnd,WPARAM wParam,LPARAM lParam) 1901 { 1902 POINT point; 1903 RECT rect; 1904 1905 GetCursorPos(&point); 1906 ScreenToClient(hwnd,&point); 1907 GetClientRect(hwnd,&rect); 1908 if (!PtInRect(&rect,point)) 1909 { 1910 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); 1911 1912 infoPtr->iHotItem = -1; 1913 infoPtr->bTimer = FALSE; 1914 HEADER_Refresh(hwnd); 1915 1916 KillTimer(hwnd,TIMER_ID); 1917 } 1918 1919 return 0; 1719 1920 } 1720 1921 … … 1730 1931 infoPtr->bTracking = FALSE; 1731 1932 1732 HEADER_Send HeaderNotify(hwnd,HDN_ENDTRACKA,infoPtr->iMoveItem);1933 HEADER_SendEndTrack(hwnd,infoPtr->iMoveItem,0); 1733 1934 hdc = GetDC(hwnd); 1734 1935 HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack); … … 1748 1949 1749 1950 return DefWindowProcA(WM_KEYDOWN,hwnd,wParam,lParam); 1951 } 1952 1953 static LRESULT 1954 HEADER_CaptureChanged(HWND hwnd,WPARAM wParam,LPARAM lParam) 1955 { 1956 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); 1957 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 1958 HDC hdc; 1959 1960 if (infoPtr->bCaptured && infoPtr->bTracking) 1961 { 1962 infoPtr->bTracking = FALSE; 1963 1964 HEADER_SendEndTrack(hwnd,infoPtr->iMoveItem,0); 1965 hdc = GetDC(hwnd); 1966 HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack); 1967 ReleaseDC(hwnd,hdc); 1968 if (dwStyle & HDS_FULLDRAG) 1969 { 1970 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; 1971 HEADER_Refresh(hwnd); 1972 } 1973 } 1974 1975 return 0; 1750 1976 } 1751 1977 … … 1828 2054 ReleaseDC (0, hdc); 1829 2055 1830 if (lParam) { 1831 HEADER_ForceItemBounds (hwnd, infoPtr->nHeight); 1832 HEADER_Refresh(hwnd); 1833 } 2056 if (lParam) HEADER_Refresh(hwnd); 1834 2057 1835 2058 return 0; … … 1846 2069 1847 2070 case HDM_CREATEDRAGIMAGE: 1848 return HEADER_CreateDragImage (hwnd, wParam);2071 return HEADER_CreateDragImage (hwnd,wParam,lParam); 1849 2072 1850 2073 case HDM_DELETEITEM: … … 1917 2140 return HEADER_SetUnicodeFormat (hwnd, wParam); 1918 2141 2142 case WM_CAPTURECHANGED: 2143 return HEADER_CaptureChanged(hwnd,wParam,lParam); 2144 1919 2145 case WM_CREATE: 1920 2146 return HEADER_Create (hwnd, wParam, lParam); … … 1960 2186 case WM_SETFONT: 1961 2187 return HEADER_SetFont (hwnd, wParam, lParam); 2188 2189 case WM_SIZE: 2190 return HEADER_Size(hwnd,wParam,lParam); 2191 2192 case WM_TIMER: 2193 return HEADER_Timer(hwnd,wParam,lParam); 1962 2194 1963 2195 default:
Note:
See TracChangeset
for help on using the changeset viewer.