- Timestamp:
- Oct 5, 1999, 6:05:17 PM (26 years ago)
- Location:
- trunk/src/comctl32
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/header.c
r1125 r1139 1 /* $Id: header.c,v 1.1 2 1999-10-04 16:02:07cbratschi Exp $ */1 /* $Id: header.c,v 1.13 1999-10-05 16:05:16 cbratschi Exp $ */ 2 2 /* 3 3 * Header control … … 8 8 * 9 9 * TODO: 10 * - Imagelist support (partially).11 * - Callback items (under construction).12 10 * - Order list support. 13 11 * - Control specific cursors (over dividers). … … 15 13 * - Custom draw support (including Notifications). 16 14 * - Drag and Drop support (including Notifications). 17 * - Unicode support.18 15 * 19 16 * … … 499 496 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd); 500 497 RECT rect, rcTest; 501 INT iCount, width ;498 INT iCount, width,widthCount = 0; 502 499 BOOL bNoWidth; 503 500 … … 506 503 *pFlags = 0; 507 504 bNoWidth = FALSE; 508 if (PtInRect (&rect, *lpPt)) 509 { 510 if (infoPtr->uNumItem == 0) { 511 *pFlags |= HHT_NOWHERE; 512 *pItem = 1; 505 if (PtInRect(&rect,*lpPt)) 506 { 507 if (infoPtr->uNumItem == 0) 508 { 509 *pFlags |= HHT_NOWHERE; 510 *pItem = 1; 513 511 // TRACE (header, "NOWHERE\n"); 512 return; 513 } else 514 { 515 /* somewhere inside */ 516 for (iCount = 0; iCount < infoPtr->uNumItem; iCount++) 517 { 518 rect = infoPtr->items[iCount].rect; 519 width = rect.right - rect.left; 520 if (width == 0) 521 { 522 bNoWidth = TRUE; 523 widthCount = 0; 524 continue; 525 } else widthCount++; 526 if (widthCount > 1) bNoWidth = FALSE; 527 if (PtInRect(&rect,*lpPt)) 528 { 529 if (width <= 2 * DIVIDER_WIDTH) 530 { 531 *pFlags |= HHT_ONHEADER; 532 *pItem = iCount; 533 // TRACE (header, "ON HEADER %d\n", iCount); 534 return; 535 } 536 if (iCount > 0) 537 { 538 rcTest = rect; 539 rcTest.right = rcTest.left + DIVIDER_WIDTH; 540 if (PtInRect (&rcTest, *lpPt)) 541 { 542 if (bNoWidth) 543 { 544 *pFlags |= HHT_ONDIVOPEN; 545 *pItem = iCount - 1; 546 // TRACE (header, "ON DIVOPEN %d\n", *pItem); 547 return; 548 } else 549 { 550 *pFlags |= HHT_ONDIVIDER; 551 *pItem = iCount - 1; 552 // TRACE (header, "ON DIVIDER %d\n", *pItem); 553 return; 554 } 555 } 556 } 557 rcTest = rect; 558 rcTest.left = rcTest.right - DIVIDER_WIDTH; 559 if (PtInRect (&rcTest, *lpPt)) 560 { 561 *pFlags |= HHT_ONDIVIDER; 562 *pItem = iCount; 563 // TRACE (header, "ON DIVIDER %d\n", *pItem); 564 return; 565 } 566 567 *pFlags |= HHT_ONHEADER; 568 *pItem = iCount; 569 // TRACE (header, "ON HEADER %d\n", iCount); 514 570 return; 571 } 515 572 } 516 else { 517 /* somewhere inside */ 518 for (iCount = 0; iCount < infoPtr->uNumItem; iCount++) { 519 rect = infoPtr->items[iCount].rect; 520 width = rect.right - rect.left; 521 if (width == 0) { 522 bNoWidth = TRUE; 523 continue; 524 } 525 if (PtInRect (&rect, *lpPt)) { 526 if (width <= 2 * DIVIDER_WIDTH) { 527 *pFlags |= HHT_ONHEADER; 528 *pItem = iCount; 529 // TRACE (header, "ON HEADER %d\n", iCount); 530 return; 531 } 532 if (iCount > 0) { 533 rcTest = rect; 534 rcTest.right = rcTest.left + DIVIDER_WIDTH; 535 if (PtInRect (&rcTest, *lpPt)) { 536 if (bNoWidth) { 537 *pFlags |= HHT_ONDIVOPEN; 538 *pItem = iCount - 1; 539 // TRACE (header, "ON DIVOPEN %d\n", *pItem); 540 return; 541 } 542 else { 543 *pFlags |= HHT_ONDIVIDER; 544 *pItem = iCount - 1; 545 // TRACE (header, "ON DIVIDER %d\n", *pItem); 546 return; 547 } 548 } 549 } 550 rcTest = rect; 551 rcTest.left = rcTest.right - DIVIDER_WIDTH; 552 if (PtInRect (&rcTest, *lpPt)) { 553 *pFlags |= HHT_ONDIVIDER; 554 *pItem = iCount; 555 // TRACE (header, "ON DIVIDER %d\n", *pItem); 556 return; 557 } 558 559 *pFlags |= HHT_ONHEADER; 560 *pItem = iCount; 561 // TRACE (header, "ON HEADER %d\n", iCount); 562 return; 563 } 564 } 565 566 /* check for last divider part (on nowhere) */ 567 rect = infoPtr->items[infoPtr->uNumItem-1].rect; 568 rect.left = rect.right; 569 rect.right += DIVIDER_WIDTH; 570 if (PtInRect (&rect, *lpPt)) { 571 if (bNoWidth) { 572 *pFlags |= HHT_ONDIVOPEN; 573 *pItem = infoPtr->uNumItem - 1; 573 574 /* check for last divider part (on nowhere) */ 575 rect = infoPtr->items[infoPtr->uNumItem-1].rect; 576 rect.left = rect.right; 577 rect.right += DIVIDER_WIDTH; 578 if (widthCount > 0) bNoWidth = FALSE; 579 if (PtInRect (&rect, *lpPt)) 580 { 581 if (bNoWidth) 582 { 583 *pFlags |= HHT_ONDIVOPEN; 584 *pItem = infoPtr->uNumItem - 1; 574 585 // TRACE (header, "ON DIVOPEN %d\n", *pItem); 575 576 }577 else{578 579 586 return; 587 } else 588 { 589 *pFlags |= HHT_ONDIVIDER; 590 *pItem = infoPtr->uNumItem-1; 580 591 // TRACE (header, "ON DIVIDER %d\n", *pItem); 581 582 583 584 585 586 592 return; 593 } 594 } 595 596 *pFlags |= HHT_NOWHERE; 597 *pItem = 1; 587 598 // TRACE (header, "NOWHERE\n"); 588 return; 589 } 590 } 591 else { 592 if (lpPt->x < rect.left) { 599 return; 600 } 601 } else 602 { 603 if (lpPt->x < rect.left) 604 { 593 605 // TRACE (header, "TO LEFT\n"); 594 595 }596 else if (lpPt->x > rect.right){606 *pFlags |= HHT_TOLEFT; 607 } else if (lpPt->x > rect.right) 608 { 597 609 // TRACE (header, "TO LEFT\n"); 598 *pFlags |= HHT_TORIGHT; 599 } 600 601 if (lpPt->y < rect.top) { 610 *pFlags |= HHT_TORIGHT; 611 } 612 613 if (lpPt->y < rect.top) 614 { 602 615 // TRACE (header, "ABOVE\n"); 603 604 }605 else if (lpPt->y > rect.bottom){616 *pFlags |= HHT_ABOVE; 617 } else if (lpPt->y > rect.bottom) 618 { 606 619 // TRACE (header, "BELOW\n"); 607 608 620 *pFlags |= HHT_BELOW; 621 } 609 622 } 610 623 … … 1522 1535 { 1523 1536 SetCapture (hwnd); 1524 infoPtr->bCaptured = TRUE; 1525 infoPtr->bTracking = TRUE; 1526 infoPtr->iMoveItem = nItem; 1527 infoPtr->nOldWidth = infoPtr->items[nItem].cxy; 1537 infoPtr->bCaptured = TRUE; 1538 infoPtr->bTracking = TRUE; 1539 infoPtr->bTrackOpen = flags == HHT_ONDIVOPEN; 1540 infoPtr->iMoveItem = nItem; 1541 infoPtr->nOldWidth = infoPtr->items[nItem].cxy; 1528 1542 infoPtr->xTrackOffset = infoPtr->items[nItem].rect.right - pt.x; 1529 1543 … … 1624 1638 HDC hdc; 1625 1639 1626 pt.x = ( INT)LOWORD(lParam);1627 pt.y = ( INT)HIWORD(lParam);1640 pt.x = (SHORT)LOWORD(lParam); 1641 pt.y = (SHORT)HIWORD(lParam); 1628 1642 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem); 1629 1643 1630 if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK) )1644 if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK) &&!infoPtr->bCaptured) 1631 1645 { 1632 1646 INT newItem; … … 1668 1682 if (dwStyle & HDS_FULLDRAG) 1669 1683 { 1670 if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem)) 1671 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; 1672 else { 1673 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset; 1674 if (nWidth < MIN_ITEMWIDTH) 1675 nWidth = MIN_ITEMWIDTH; 1676 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth; 1677 HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, 1678 infoPtr->iMoveItem); 1679 } 1680 HEADER_SetItemBounds (hwnd,infoPtr->iMoveItem); 1681 HEADER_Refresh(hwnd); 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); 1682 1692 } 1683 else { 1684 hdc = GetDC (hwnd); 1685 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1686 infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset; 1687 if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left) 1688 infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left; 1689 infoPtr->items[infoPtr->iMoveItem].cxy = 1690 infoPtr->xOldTrack - infoPtr->items[infoPtr->iMoveItem].rect.left; 1691 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1692 ReleaseDC (hwnd, hdc); 1693 } 1694 1695 HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem); 1693 HEADER_SetItemBounds (hwnd,infoPtr->iMoveItem); 1694 HEADER_Refresh(hwnd); 1695 } else 1696 { 1697 hdc = GetDC (hwnd); 1698 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1699 infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset; 1700 if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH) 1701 infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left+MIN_ITEMWIDTH; 1702 infoPtr->items[infoPtr->iMoveItem].cxy = 1703 infoPtr->xOldTrack-infoPtr->items[infoPtr->iMoveItem].rect.left; 1704 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1705 ReleaseDC (hwnd, hdc); 1706 } 1707 1708 HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem); 1696 1709 // TRACE (header, "Tracking item %d!\n", infoPtr->iMoveItem); 1697 1710 } … … 1701 1714 } 1702 1715 1716 static LRESULT 1717 HEADER_KeyDown(HWND hwnd,WPARAM wParam,LPARAM lParam) 1718 { 1719 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); 1720 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 1721 HDC hdc; 1722 1723 if (wParam == VK_ESCAPE && infoPtr->bCaptured && infoPtr->bTracking) 1724 { 1725 infoPtr->bTracking = FALSE; 1726 1727 HEADER_SendHeaderNotify(hwnd,HDN_ENDTRACKA,infoPtr->iMoveItem); 1728 hdc = GetDC(hwnd); 1729 HEADER_DrawTrackLine(hwnd,hdc,infoPtr->xOldTrack); 1730 ReleaseDC(hwnd,hdc); 1731 if (dwStyle & HDS_FULLDRAG) 1732 { 1733 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; 1734 HEADER_Refresh(hwnd); 1735 } 1736 1737 infoPtr->bCaptured = FALSE; 1738 ReleaseCapture(); 1739 HEADER_SendSimpleNotify(hwnd,NM_RELEASEDCAPTURE); 1740 1741 return TRUE; 1742 } 1743 1744 return DefWindowProcA(WM_KEYDOWN,hwnd,wParam,lParam); 1745 } 1703 1746 1704 1747 static LRESULT … … 1738 1781 1739 1782 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem); 1783 1784 if (infoPtr->bCaptured) 1785 { 1786 if (infoPtr->bTracking) 1787 { 1788 if (infoPtr->bTrackOpen) SetCursor(infoPtr->hcurDivopen); 1789 else SetCursor(infoPtr->hcurDivider); 1790 } else SetCursor(infoPtr->hcurArrow); 1791 1792 return 0; 1793 } 1740 1794 1741 1795 if (flags == HHT_ONDIVIDER) … … 1872 1926 case WM_GETFONT: 1873 1927 return HEADER_GetFont (hwnd); 1928 1929 case WM_KEYDOWN: 1930 return HEADER_KeyDown(hwnd,wParam,lParam); 1874 1931 1875 1932 case WM_LBUTTONDBLCLK: -
trunk/src/comctl32/trackbar.c
r1100 r1139 1 /* $Id: trackbar.c,v 1. 19 1999-10-01 15:53:32cbratschi Exp $ */1 /* $Id: trackbar.c,v 1.20 1999-10-05 16:05:17 cbratschi Exp $ */ 2 2 /* 3 3 * Trackbar control … … 698 698 DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE); 699 699 RECT rcClient,rcChannel,rcSelection; 700 HBRUSH hBrush = CreateSolidBrush(infoPtr->clrBk);700 HBRUSH hBrush; 701 701 int i; 702 702 NMCUSTOMDRAW cdraw;
Note:
See TracChangeset
for help on using the changeset viewer.