Changeset 1139 for trunk/src


Ignore:
Timestamp:
Oct 5, 1999, 6:05:17 PM (26 years ago)
Author:
cbratschi
Message:

* empty log message *

Location:
trunk/src/comctl32
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/comctl32/header.c

    r1125 r1139  
    1 /* $Id: header.c,v 1.12 1999-10-04 16:02:07 cbratschi Exp $ */
     1/* $Id: header.c,v 1.13 1999-10-05 16:05:16 cbratschi Exp $ */
    22/*
    33 *  Header control
     
    88 *
    99 *  TODO:
    10  *   - Imagelist support (partially).
    11  *   - Callback items (under construction).
    1210 *   - Order list support.
    1311 *   - Control specific cursors (over dividers).
     
    1513 *   - Custom draw support (including Notifications).
    1614 *   - Drag and Drop support (including Notifications).
    17  *   - Unicode support.
    1815 *
    1916 *
     
    499496    HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
    500497    RECT rect, rcTest;
    501     INT  iCount, width;
     498    INT  iCount, width,widthCount = 0;
    502499    BOOL bNoWidth;
    503500
     
    506503    *pFlags = 0;
    507504    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;
    513511//          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);
    514570            return;
     571          }
    515572        }
    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;
    574585//                  TRACE (header, "ON DIVOPEN %d\n", *pItem);
    575                     return;
    576                 }
    577                 else {
    578                     *pFlags |= HHT_ONDIVIDER;
    579                     *pItem = infoPtr->uNumItem-1;
     586            return;
     587          } else
     588          {
     589            *pFlags |= HHT_ONDIVIDER;
     590            *pItem = infoPtr->uNumItem-1;
    580591//                  TRACE (header, "ON DIVIDER %d\n", *pItem);
    581                     return;
    582                 }
    583             }
    584 
    585             *pFlags |= HHT_NOWHERE;
    586             *pItem = 1;
     592            return;
     593          }
     594        }
     595
     596        *pFlags |= HHT_NOWHERE;
     597        *pItem = 1;
    587598//          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      {
    593605//         TRACE (header, "TO LEFT\n");
    594            *pFlags |= HHT_TOLEFT;
    595         }
    596         else if (lpPt->x > rect.right) {
     606        *pFlags |= HHT_TOLEFT;
     607      } else if (lpPt->x > rect.right)
     608      {
    597609//          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      {
    602615//          TRACE (header, "ABOVE\n");
    603             *pFlags |= HHT_ABOVE;
    604         }
    605         else if (lpPt->y > rect.bottom) {
     616        *pFlags |= HHT_ABOVE;
     617      } else if (lpPt->y > rect.bottom)
     618      {
    606619//          TRACE (header, "BELOW\n");
    607             *pFlags |= HHT_BELOW;
    608         }
     620        *pFlags |= HHT_BELOW;
     621      }
    609622    }
    610623
     
    15221535        {
    15231536            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;
    15281542            infoPtr->xTrackOffset = infoPtr->items[nItem].rect.right - pt.x;
    15291543
     
    16241638    HDC   hdc;
    16251639
    1626     pt.x = (INT)LOWORD(lParam);
    1627     pt.y = (INT)HIWORD(lParam);
     1640    pt.x = (SHORT)LOWORD(lParam);
     1641    pt.y = (SHORT)HIWORD(lParam);
    16281642    HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
    16291643
    1630     if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK))
     1644    if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK) &&!infoPtr->bCaptured)
    16311645    {
    16321646        INT newItem;
     
    16681682          if (dwStyle & HDS_FULLDRAG)
    16691683          {
    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);
    16821692            }
    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);
    16961709//          TRACE (header, "Tracking item %d!\n", infoPtr->iMoveItem);
    16971710        }
     
    17011714}
    17021715
     1716static LRESULT
     1717HEADER_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}
    17031746
    17041747static LRESULT
     
    17381781
    17391782    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    }
    17401794
    17411795    if (flags == HHT_ONDIVIDER)
     
    18721926        case WM_GETFONT:
    18731927            return HEADER_GetFont (hwnd);
     1928
     1929        case WM_KEYDOWN:
     1930            return HEADER_KeyDown(hwnd,wParam,lParam);
    18741931
    18751932        case WM_LBUTTONDBLCLK:
  • trunk/src/comctl32/trackbar.c

    r1100 r1139  
    1 /* $Id: trackbar.c,v 1.19 1999-10-01 15:53:32 cbratschi Exp $ */
     1/* $Id: trackbar.c,v 1.20 1999-10-05 16:05:17 cbratschi Exp $ */
    22/*
    33 * Trackbar control
     
    698698    DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE);
    699699    RECT rcClient,rcChannel,rcSelection;
    700     HBRUSH hBrush = CreateSolidBrush(infoPtr->clrBk);
     700    HBRUSH hBrush;
    701701    int i;
    702702    NMCUSTOMDRAW cdraw;
Note: See TracChangeset for help on using the changeset viewer.