Annotation of mstools/samples/sdktools/perfmon/intrline.c, revision 1.1

1.1     ! root        1: /*
        !             2: ==============================================================================
        !             3: 
        !             4:   Application:
        !             5: 
        !             6:             Microsoft Windows NT (TM) Performance Monitor
        !             7: 
        !             8:   File:
        !             9:             intrline.c -- IntervalLine custom control.
        !            10: 
        !            11:   Copyright 1992, Microsoft Corporation. All Rights Reserved.
        !            12: ==============================================================================
        !            13: */
        !            14: 
        !            15: 
        !            16: /*
        !            17: 
        !            18: 
        !            19: Basic Information
        !            20: -----------------
        !            21:    
        !            22: An ILine (Interval Line) control is a horizontally-sliding device; the user 
        !            23: can slide the start position and end position independently by dragging 
        !            24: either "grab" bar, or move them simultaneously by dragging the center grab
        !            25: bar. An ILine control is used in the Input Log dialog of Perfmon, but could
        !            26: be used anywhere. The control allows the user to specify the start, end and 
        !            27: duration of playback within the range of previously-logged data.
        !            28: 
        !            29: 
        !            30: ILine Parts
        !            31: -----------
        !            32: 
        !            33:      iBeginValue                                            iEndValue
        !            34:      |      iStartValue                        iStopValue           |
        !            35:      |      |                                           |           |
        !            36:      v      v                                           v           v
        !            37:      +------+-+---------------------------------------+-+-----------+
        !            38:      |      |X|                                       |X|           |
        !            39:      |      |X|                                       |X|           |
        !            40:      +------+-+---------------------------------------+-+-----------+
        !            41:              ^                    ^                    ^
        !            42:              Start grab bar       Center grab bar      Stop grab bar
        !            43: 
        !            44: 
        !            45: ILine Terminology
        !            46: -----------------
        !            47: 
        !            48: All external routines are designated by the prefix ILine-.
        !            49: Internal routines are designated by the prefix IL-.
        !            50: 
        !            51: The suffix -Value represents an integer in the user-supplied domain.
        !            52: The suffix -Pixel represents an integer location on the screen.
        !            53: 
        !            54: Note that the range of the IntervalLine is represented by "Begin" and 
        !            55: "End", while the the currently selected interval is represented by
        !            56: "Start" and "Stop".
        !            57: 
        !            58: 
        !            59: Implementation Notes
        !            60: --------------------
        !            61: 
        !            62: ILine is a custom control, but does not have all the messages 
        !            63: normally associated with a full-fledged control type like "button". 
        !            64: In particular, it doesn't have a keyboard interface or ask it's parent
        !            65: for color choices. It also doesn't have the functions needed for interfacing
        !            66: with the dialog editor custom control menu.
        !            67: 
        !            68: An ILine control is designed to work with an integer range of values
        !            69: specified by the user of the control. These values should have meaning to
        !            70: the caller. The caller can specify the minimum value of the range 
        !            71: (iBeginValue), the maximum value of the range (iEndValue), and the current
        !            72: starting and stopping values (iStartValue and iStopValue). 
        !            73: 
        !            74: These values are set with a function-based interface. (ILSetXXX).
        !            75: 
        !            76: The code distinguishes between the *values* for the begin, end, start, and
        !            77: stop, and the *pixels* which represent locations on the control for these
        !            78: values.
        !            79: 
        !            80: Various bits of the control style allow for changing the control's 
        !            81: behavior.
        !            82: 
        !            83: To allow for multiple ILine controls, all data used by each ILine
        !            84: instance is allocated from the heap and associated with the control.
        !            85: The allocation is done in OnCreate and the freeing in OnDestroy. The
        !            86: instance data is contained in the ILINE structure. Each message handler
        !            87: retrieves this instance data with the ILData function.
        !            88: 
        !            89: 
        !            90: To Do:
        !            91: ------
        !            92: 
        !            93: Add a keyboard interface?
        !            94: Add a double click interface?
        !            95: Add a focus rect?
        !            96: Support WM_CTLCOLOR?
        !            97: 
        !            98: */      
        !            99: 
        !           100: 
        !           101: //==========================================================================//
        !           102: //                                  Includes                                //
        !           103: //==========================================================================//
        !           104: 
        !           105: 
        !           106: #include "perfmon.h"
        !           107: #include "utils.h"
        !           108: #include "intrline.h"
        !           109: #include "pmemory.h"        // for MemoryXXX (mallloc-type) routines
        !           110: 
        !           111: 
        !           112: //==========================================================================//
        !           113: //                                  Constants                               //
        !           114: //==========================================================================//
        !           115: 
        !           116: 
        !           117: #define dwILineClassStyle     (CS_HREDRAW | CS_VREDRAW)
        !           118: #define iILineClassExtra      (0)
        !           119: #define iILineWindowExtra     (sizeof (PILINE))
        !           120: #define dwILineWindowStyle    (WS_CHILD | WS_VISIBLE) 
        !           121: 
        !           122: 
        !           123: #define ILModeNone            0
        !           124: #define ILModeLeft            1
        !           125: #define ILModeCenter          2
        !           126: #define ILModeRight           3
        !           127: 
        !           128: 
        !           129: //==========================================================================//
        !           130: //                                  Typedefs                                //
        !           131: //==========================================================================//
        !           132: 
        !           133: 
        !           134: // The instance data for each IL window.  One of these is allocated for each
        !           135: // window in the window's OnCreate processing and free'd in OnDestroy.
        !           136: typedef struct ILINESTRUCT
        !           137:    {  // ILINE
        !           138:    int            iBeginValue ;        // user-supplied lowest range
        !           139:    int            iEndValue ;          // user-supplied highest range
        !           140:    int            iStartValue ;        // current start of selected interval
        !           141:    int            iStopValue ;         // current end of selected interval
        !           142:    int            iGranularityValue ;
        !           143:    int            iMinimumRangeValue ;
        !           144: 
        !           145:    RECT           rectBorder ;
        !           146:    RECT           rectLeftBk ;
        !           147:    RECT           rectLeftGrab ;
        !           148:    RECT           rectCenterGrab ;
        !           149:    RECT           rectRightGrab ;
        !           150:    RECT           rectRightBk ;
        !           151: 
        !           152:    HBRUSH         hBrushBk ;
        !           153: 
        !           154:    POINTS         ptsMouse ;
        !           155:    int            iMode ;              // who is being tracked?
        !           156:    } ILINE ;
        !           157: 
        !           158: typedef ILINE *PILINE ;
        !           159: 
        !           160: 
        !           161: //==========================================================================//
        !           162: //                                   Macros                                 //
        !           163: //==========================================================================//
        !           164: 
        !           165: 
        !           166: // Width of the start and stob grab bars
        !           167: #define ILGrabWidth()      \
        !           168:    (xScrollThumbWidth)
        !           169: 
        !           170: 
        !           171: // A rectangle is "drawable" if it has both nonzero width and height
        !           172: #define RectDrawable(lpRect)           \
        !           173:    ((lpRect->right - lpRect->left) &&  \
        !           174:     (lpRect->bottom - lpRect->top))
        !           175: 
        !           176: 
        !           177: //======================================//
        !           178: // ILine Accessor Macros                //
        !           179: //======================================//
        !           180: 
        !           181: // These macros reference fields in the ILine structure and should be
        !           182: // used in place of direct reference to the fields. This makes the code
        !           183: // easier to read and allows modification of the underlying structure.
        !           184: 
        !           185: // You can use these macros to both get and set the fields.
        !           186: 
        !           187: #define ILBegin(pILine)    \
        !           188:    (pILine->iBeginValue)
        !           189: 
        !           190: #define ILEnd(pILine)      \
        !           191:    (pILine->iEndValue)
        !           192: 
        !           193: #define ILStart(pILine)    \
        !           194:    (pILine->iStartValue)
        !           195: 
        !           196: #define ILStop(pILine)     \
        !           197:    (pILine->iStopValue)
        !           198: 
        !           199: #define ILMode(pILine)     \
        !           200:    (pILine->iMode)
        !           201: 
        !           202: 
        !           203: //======================================//
        !           204: // ILine Pseudo-Accessor Macros         //
        !           205: //======================================//
        !           206: 
        !           207: // These macros are used to get values which don't correspond to a single
        !           208: // field. You can get the value with these macros but can't set it.
        !           209: 
        !           210: #define ILWidth(pILine)    \
        !           211:    (pILine->rectBorder.right)
        !           212: 
        !           213: #define ILRange(pILine)    \
        !           214:    (ILEnd (pILine) - ILBegin (pILine))
        !           215: 
        !           216: #define ILStartPixel(pILine) \
        !           217:    (pILine->rectLeftGrab.left)
        !           218: 
        !           219: #define ILStopPixel(pILine)   \
        !           220:    (pILine->rectRightGrab.right)
        !           221: 
        !           222: 
        !           223: //==========================================================================//
        !           224: //                              Local Functions                             //
        !           225: //==========================================================================//
        !           226: 
        !           227: 
        !           228: void static ILNotifyChange (HWND hWnd,
        !           229:                             PILINE pILine)
        !           230:    {  // ILNotifyChange
        !           231:    HWND           hWndParent ;
        !           232: 
        !           233:    hWndParent = WindowParent (hWnd) ;
        !           234: 
        !           235:    if (hWndParent)
        !           236:       SendMessage (hWndParent, WM_COMMAND, 
        !           237:                    (WPARAM) WindowID (hWnd),
        !           238:                    (LPARAM) hWnd) ;
        !           239:    }  // ILNotifyChange
        !           240: 
        !           241: 
        !           242: BOOL ILGrabRect (IN PILINE pILine, 
        !           243:                  OUT LPRECT lpRect)
        !           244: /*
        !           245:    Effect:        Return in lpRect the rectangle representing the position
        !           246:                   of the grab bar currently being tracked.
        !           247: */
        !           248:    {  // ILGrabRect
        !           249:    switch (ILMode (pILine))
        !           250:       {  // switch
        !           251:       case ILModeLeft:
        !           252:          *lpRect = pILine->rectLeftGrab ;
        !           253:          return (TRUE) ;
        !           254:          break ;
        !           255: 
        !           256:       case ILModeRight:
        !           257:          *lpRect = pILine->rectRightGrab ;
        !           258:          return (TRUE) ;
        !           259:          break ;
        !           260: 
        !           261:       case ILModeCenter:
        !           262:          *lpRect = pILine->rectCenterGrab ;
        !           263:          return (TRUE) ;
        !           264:          break ;
        !           265: 
        !           266:       case ILModeNone:
        !           267:          lpRect->left = 0 ;
        !           268:          lpRect->top = 0 ;
        !           269:          lpRect->right = 0 ;
        !           270:          lpRect->bottom = 0 ;
        !           271:          return (FALSE) ;
        !           272:          break ;
        !           273:       }  // switch
        !           274:    }  // ILGrabRect
        !           275: 
        !           276: 
        !           277: PILINE ILData (HWND hWndIL)
        !           278:    {
        !           279:    return ((PILINE) GetWindowLong (hWndIL, 0)) ;
        !           280:    }
        !           281: 
        !           282: 
        !           283: PILINE AllocateILData (HWND hWndIL)
        !           284:    {
        !           285:    PILINE         pILine ;
        !           286: 
        !           287:    pILine = MemoryAllocate (sizeof (ILINE)) ;
        !           288:    SetWindowLong (hWndIL, 0, (LONG) pILine) ;
        !           289: 
        !           290:    return (pILine) ;
        !           291:    }
        !           292: 
        !           293: 
        !           294: void static DrawGrab (HDC hDC,
        !           295:                       LPRECT lpRectGrab,
        !           296:                       BOOL bDown)
        !           297:    {  // DrawGrab
        !           298:    if (!RectDrawable (lpRectGrab))
        !           299:       return ;
        !           300: 
        !           301:    if (bDown)
        !           302:       ThreeDConcave1 (hDC, 
        !           303:                      lpRectGrab->left,
        !           304:                      lpRectGrab->top,
        !           305:                      lpRectGrab->right,
        !           306:                      lpRectGrab->bottom) ;
        !           307:    else
        !           308:       ThreeDConvex1 (hDC, 
        !           309:                     lpRectGrab->left,
        !           310:                     lpRectGrab->top,
        !           311:                     lpRectGrab->right,
        !           312:                     lpRectGrab->bottom) ;
        !           313:    }  // DrawGrab
        !           314: 
        !           315: 
        !           316: int ILValueToPixel (PILINE pILine,
        !           317:                     int iValue)
        !           318:    {
        !           319:    int            xPixel ;
        !           320: 
        !           321:    if (ILRange (pILine))
        !           322:       xPixel = MulDiv (iValue, ILWidth (pILine), ILRange (pILine)) ;
        !           323:    else
        !           324:       xPixel = 0 ;
        !           325: 
        !           326:    return (PinExclusive (xPixel, 0, pILine->rectBorder.right)) ;
        !           327:    }
        !           328: 
        !           329: 
        !           330: int ILPixelToValue (PILINE pILine,
        !           331:                     int xPixel)
        !           332:    {
        !           333:    int            iValue ;
        !           334: 
        !           335:    if (ILWidth (pILine))
        !           336:       iValue = MulDiv (xPixel, ILRange (pILine), ILWidth (pILine)) ;
        !           337:    else
        !           338:       iValue = 0 ;
        !           339: 
        !           340:    return (PinInclusive (iValue, ILBegin (pILine), ILEnd (pILine))) ;
        !           341:    }
        !           342: 
        !           343: 
        !           344: void static ILCalcPositions (HWND hWnd,
        !           345:                              PILINE pILine)
        !           346: /*
        !           347:    Effect:        Determine and set all of the physical rectangles of ILine,
        !           348:                   based on the current size of the ILine window and the 
        !           349:                   current logical Start, Stop, Begin, and End values.
        !           350: */
        !           351:    {  // ILCalcPositions
        !           352:    int            xStart, xStop ;
        !           353:    int            yHeight ;
        !           354: 
        !           355:    GetClientRect (hWnd, &pILine->rectBorder) ;
        !           356:    yHeight = pILine->rectBorder.bottom ;
        !           357: 
        !           358:    xStart = ILValueToPixel (pILine, ILStart (pILine)) ;
        !           359:    xStop = ILValueToPixel (pILine, ILStop (pILine)) ;
        !           360: 
        !           361:    pILine->rectLeftBk.left = 1 ;
        !           362:    pILine->rectLeftBk.top = 1 ;
        !           363:    pILine->rectLeftBk.right = xStart ;
        !           364:    pILine->rectLeftBk.bottom = yHeight - 1 ;
        !           365: 
        !           366:    pILine->rectLeftGrab.left = xStart ;
        !           367:    pILine->rectLeftGrab.top = 1 ;
        !           368:    pILine->rectLeftGrab.right = xStart + ILGrabWidth () ;
        !           369:    pILine->rectLeftGrab.bottom = yHeight - 1 ;
        !           370: 
        !           371:    pILine->rectRightBk.left = xStop ;
        !           372:    pILine->rectRightBk.top = 1 ;
        !           373:    pILine->rectRightBk.right = pILine->rectBorder.right - 1 ;
        !           374:    pILine->rectRightBk.bottom = yHeight - 1 ;
        !           375: 
        !           376:    pILine->rectRightGrab.left = xStop - ILGrabWidth () ;
        !           377:    pILine->rectRightGrab.top = 1 ;
        !           378:    pILine->rectRightGrab.right = xStop ;
        !           379:    pILine->rectRightGrab.bottom = yHeight - 1 ;
        !           380: 
        !           381:    pILine->rectCenterGrab.left = pILine->rectLeftGrab.right ;
        !           382:    pILine->rectCenterGrab.top = 1 ;
        !           383:    pILine->rectCenterGrab.right = pILine->rectRightGrab.left ;
        !           384:    pILine->rectCenterGrab.bottom = yHeight - 1 ;
        !           385: 
        !           386:    if (pILine->rectLeftGrab.right > pILine->rectRightGrab.left)
        !           387:       {
        !           388:       pILine->rectLeftGrab.right = pILine->rectLeftGrab.left + 
        !           389:                                    (xStop - xStart) / 2 ;
        !           390:       pILine->rectRightGrab.left = pILine->rectLeftGrab.right ;
        !           391:       pILine->rectCenterGrab.left = 0 ;
        !           392:       pILine->rectCenterGrab.right = 0 ;
        !           393:       }
        !           394:    }  // ILCalcPositions
        !           395: 
        !           396: 
        !           397: void static ILDraw (HDC hDC, 
        !           398:                     PILINE pILine,     
        !           399:                     LPRECT lpRectUpdate)
        !           400: /*
        !           401:    Effect:        Draw the image of pILine on hDC.  Draw at least the 
        !           402:                   portions within rectUpdate.
        !           403: 
        !           404:    Called By:     OnPaint, OnMouseMove.
        !           405: */
        !           406:    {  // ILDraw
        !           407: 
        !           408:    //=============================//
        !           409:    // Draw Border                 //
        !           410:    //=============================//
        !           411:    
        !           412:    FrameRect (hDC, &pILine->rectBorder, GetStockObject (BLACK_BRUSH)) ;
        !           413: 
        !           414:    //=============================//
        !           415:    // Draw Background             //
        !           416:    //=============================//
        !           417: 
        !           418:    FillRect (hDC, &pILine->rectLeftBk, pILine->hBrushBk) ;
        !           419:    FillRect (hDC, &pILine->rectRightBk, pILine->hBrushBk) ;
        !           420: 
        !           421:    //=============================//
        !           422:    // Draw Range Grabs            //
        !           423:    //=============================//
        !           424: 
        !           425:    DrawGrab (hDC, &pILine->rectLeftGrab, 
        !           426:              ILMode (pILine) == ILModeLeft) ;
        !           427:    DrawGrab (hDC, &pILine->rectRightGrab,
        !           428:              ILMode (pILine) == ILModeRight) ;
        !           429: 
        !           430:    //=============================//
        !           431:    // Draw Center Grab            //
        !           432:    //=============================//
        !           433: 
        !           434:    DrawGrab (hDC, &pILine->rectCenterGrab,
        !           435:              ILMode (pILine) == ILModeCenter) ;
        !           436:    }  // ILDraw
        !           437: 
        !           438: 
        !           439: void ILPageLeftRight (HWND hWnd,
        !           440:                       PILINE pILine,
        !           441:                       BOOL bLeft)
        !           442:    {  // ILPageLeftRight
        !           443:    int            iStart, iStop, iMove ;
        !           444:    HDC            hDC ;
        !           445: 
        !           446:    iStart = ILStart (pILine) ;
        !           447:    iStop = ILStop (pILine) ;
        !           448: 
        !           449:    if (ILRange (pILine) >= 10)   
        !           450:       iMove = ILRange (pILine) / 10 ;
        !           451:    else
        !           452:       iMove = 1 ;
        !           453: 
        !           454:    if (bLeft)
        !           455:       iMove = -iMove ;
        !           456: 
        !           457:    iStart += iMove ;
        !           458:    iStop += iMove ;
        !           459: 
        !           460:    ILineSetStart (hWnd, iStart) ;
        !           461:    ILineSetStop (hWnd, iStop) ;
        !           462: 
        !           463:    hDC = GetDC (hWnd) ;
        !           464:    ILDraw (hDC, pILine, &pILine->rectBorder) ;
        !           465:    ReleaseDC (hWnd, hDC) ;
        !           466: 
        !           467:    ILNotifyChange (hWnd, pILine) ;
        !           468:    }  // ILPageLeftRight
        !           469: 
        !           470: 
        !           471: void StartGrab (HWND hWnd,
        !           472:                 PILINE pILine)
        !           473:    {  // StartGrab
        !           474:    RECT           rectUpdate ;
        !           475:    HDC            hDC ;
        !           476: 
        !           477:    SetCapture (hWnd) ;
        !           478:    ILGrabRect (pILine, &rectUpdate) ;
        !           479: 
        !           480:    hDC = GetDC (hWnd) ;
        !           481:    ILDraw (hDC, pILine, &rectUpdate) ;
        !           482:    ReleaseDC (hWnd, hDC) ;
        !           483:    }  // StartGrab
        !           484: 
        !           485: 
        !           486: void EndGrab (HWND hWnd,
        !           487:               PILINE pILine)
        !           488: /*
        !           489:    Internals:     Set the mode to null after getting the grab rectangle
        !           490:                   so ILGrabRect knows which grab bar to get.
        !           491: */
        !           492:    {
        !           493:    RECT           rectUpdate ;
        !           494:    HDC            hDC ;
        !           495: 
        !           496:    ReleaseCapture () ;
        !           497: 
        !           498:    ILGrabRect (pILine, &rectUpdate) ;
        !           499:    ILMode (pILine) = ILModeNone ;
        !           500: 
        !           501:    hDC = GetDC (hWnd) ;
        !           502:    ILDraw (hDC, pILine, &rectUpdate) ;
        !           503:    ReleaseDC  (hWnd, hDC) ;
        !           504:    }
        !           505: 
        !           506:    
        !           507: //==========================================================================//
        !           508: //                              Message Handlers                            //
        !           509: //==========================================================================//
        !           510: 
        !           511: 
        !           512: void static OnPaint (HWND hWnd)
        !           513:    {
        !           514:    PAINTSTRUCT    ps ;
        !           515:    HDC            hDC ;
        !           516:    PILINE         pILine ;
        !           517: 
        !           518:    pILine = ILData (hWnd) ;
        !           519:    hDC = BeginPaint (hWnd, &ps) ;
        !           520: 
        !           521:    ILDraw (hDC, pILine, &ps.rcPaint) ;
        !           522: 
        !           523:    EndPaint (hWnd, &ps) ;
        !           524:    }
        !           525: 
        !           526: 
        !           527: void static OnCreate (HWND hWnd)
        !           528:    {
        !           529:    PILINE         pILine ;
        !           530: 
        !           531:    pILine = AllocateILData (hWnd) ;
        !           532:    ILBegin (pILine) =  0 ;
        !           533:    ILEnd (pILine) =  100 ;
        !           534:    ILStart (pILine) =  0 ;
        !           535:    ILStop (pILine) = 100 ;
        !           536:    ILMode (pILine) = ILModeNone ;
        !           537: 
        !           538:    pILine->hBrushBk = CreateSolidBrush (crBlue) ;
        !           539:    ILCalcPositions (hWnd, pILine) ;
        !           540:    }
        !           541: 
        !           542: 
        !           543: void static OnDestroy (HWND hWnd)
        !           544:    {
        !           545:    PILINE         pILine ;
        !           546: 
        !           547:    pILine = ILData (hWnd) ;
        !           548: 
        !           549:    DeleteBrush (pILine->hBrushBk) ;
        !           550:    MemoryFree (pILine) ;
        !           551:    }
        !           552: 
        !           553: 
        !           554: void static OnLButtonUp (HWND hWnd)
        !           555:    {  // OnLButtonUp
        !           556:    PILINE         pILine ;
        !           557: 
        !           558:    pILine = ILData (hWnd) ;
        !           559: 
        !           560:    if (ILMode (pILine) == ILModeNone)
        !           561:       return ;
        !           562: 
        !           563:    EndGrab (hWnd, pILine) ;
        !           564:    }  // OnLButtonUp
        !           565: 
        !           566: 
        !           567: void static OnMouseMove (HWND hWnd,
        !           568:                          POINTS ptsMouse)
        !           569: /*
        !           570:    Effect:        Handle any actions needed when the mouse moves in the
        !           571:                   ILine hWnd's client area or while the mouse is captured.
        !           572:                   In particular, if we are tracking one of the grab bars, 
        !           573:                   determine if the mouse movement represents a logical value 
        !           574:                   change and move the grab bar accordingly.
        !           575: 
        !           576:    Called By:     ILineWndProc, in response to a WM_MOUSEMOVE message.
        !           577: 
        !           578:    See Also:      OnLButtonDown, OnLButtonUp.
        !           579: 
        !           580:    Note:          This function has multiple return points.
        !           581: 
        !           582:    Note:          Since we have captured the mouse, we receive mouse msgs
        !           583:                   even when the mouse is outside our client area, but still
        !           584:                   in client coordinates. Thus we can have negative mouse
        !           585:                   coordinates. That is why we convert the lParam of the
        !           586:                   mouse msg into a POINTS structure rather than 2 WORDS.
        !           587:                   
        !           588:                    
        !           589:    Internals:     Remember that an IntervalLine can only take on integral
        !           590:                   values in the user-supplied range. Therefore we do our
        !           591:                   movement calculation in user values, not pixels. We
        !           592:                   determine what the logical value would be for the previous
        !           593:                   (last mouse move) and current mouse position. If these
        !           594:                   LOGICAL values differ, we attempt an adjustment of the
        !           595:                   grab bar by that logical amount.  This way the grab 
        !           596:                   values assume on integral positions and the calculations
        !           597:                   are simplified. 
        !           598: 
        !           599:                   If we calculated by pixel movement, and then shifted the 
        !           600:                   bar into the nearest integal position, we would encounter 
        !           601:                   rounding problems. In particular, when tracking the center 
        !           602:                   grab bar, if we moved both start and stop by the same 
        !           603:                   amount of PIXELS, then converted to LOGICAL values, we 
        !           604:                   might find our center bar shrinking and growing while
        !           605:                   the bar moves.
        !           606: */
        !           607:    {
        !           608:    int            iMousePrevious, iMouseCurrent ;
        !           609:    int            iMouseMove ;
        !           610:    PILINE         pILine ;
        !           611:    HDC            hDC ;
        !           612: 
        !           613:    //=============================//
        !           614:    // Are we tracking?            //
        !           615:    //=============================//
        !           616: 
        !           617:    pILine = ILData (hWnd) ;
        !           618:    if (ILMode (pILine) == ILModeNone)
        !           619:       return ;
        !           620: 
        !           621:    //=============================//
        !           622:    // Calc LOGICAL mouse movement //
        !           623:    //=============================//
        !           624: 
        !           625:    ptsMouse.x = PinInclusive ((INT)ptsMouse.x, 
        !           626:                               (INT)pILine->rectBorder.left, 
        !           627:                               (INT)pILine->rectBorder.right) ;
        !           628: 
        !           629:    iMousePrevious = ILPixelToValue (pILine, pILine->ptsMouse.x) ;
        !           630:    iMouseCurrent = ILPixelToValue (pILine, ptsMouse.x) ;
        !           631: 
        !           632:    iMouseMove = iMouseCurrent - iMousePrevious ;
        !           633:    if (!iMouseMove)   
        !           634:       return ;
        !           635: 
        !           636:    //=============================//
        !           637:    // Move grab bar positions     //
        !           638:    //=============================//
        !           639: 
        !           640:    switch (ILMode (pILine))
        !           641:       {  // switch   
        !           642:       case ILModeLeft:
        !           643:          ILStart (pILine) += iMouseMove ;
        !           644:          ILStart (pILine) = min (ILStart (pILine), ILStop (pILine) - 1) ;
        !           645:          break ;
        !           646: 
        !           647:       case ILModeCenter:
        !           648:          // Before we slide the center grab bar we need to see if the 
        !           649:          // desired movement amount would send either end out of bounds,
        !           650:          // and reduce the movement accordingly.
        !           651: 
        !           652:          if (ILStart (pILine) + iMouseMove < ILBegin (pILine))
        !           653:             iMouseMove = ILBegin (pILine) - ILStart (pILine) ;
        !           654:          if (ILStop (pILine) + iMouseMove > ILEnd (pILine))
        !           655:             iMouseMove = ILEnd (pILine) - ILStop (pILine) ;
        !           656: 
        !           657:          ILStart (pILine) += iMouseMove ;
        !           658:          ILStop (pILine) += iMouseMove ;
        !           659:          break ;
        !           660: 
        !           661:       case ILModeRight:
        !           662:          ILStop (pILine) += iMouseMove ;
        !           663:          ILStop (pILine) = max (ILStart (pILine) + 1, ILStop (pILine)) ;
        !           664:          break ;
        !           665:       }  // switch
        !           666: 
        !           667: 
        !           668:    //=============================//
        !           669:    // Keep grab bars in range     //
        !           670:    //=============================//
        !           671: 
        !           672: 
        !           673:    ILStart (pILine) = PinInclusive (ILStart (pILine),
        !           674:                                     ILBegin (pILine), ILEnd (pILine)) ;
        !           675:    ILStop (pILine) = PinInclusive (ILStop (pILine),
        !           676:                                    ILBegin (pILine), ILEnd (pILine)) ;
        !           677: 
        !           678:    //=============================//
        !           679:    // Determine pixel pos, draw   //
        !           680:    //=============================//
        !           681: 
        !           682:    ILCalcPositions (hWnd, pILine) ;
        !           683: 
        !           684:    hDC = GetDC (hWnd) ;
        !           685:    ILDraw (hDC, pILine, &pILine->rectBorder) ;
        !           686:    ReleaseDC (hWnd, hDC) ;
        !           687: 
        !           688:    pILine->ptsMouse = ptsMouse ;
        !           689:    ILNotifyChange (hWnd, pILine) ;
        !           690:    }  // OnMouseMove
        !           691: 
        !           692: 
        !           693: void static OnLButtonDown (HWND hWnd, 
        !           694:                            POINTS ptsMouse)
        !           695:    {
        !           696:    PILINE         pILine ;
        !           697:    POINT          ptMouse ;
        !           698: 
        !           699:    pILine = ILData (hWnd) ;
        !           700: 
        !           701:    pILine->ptsMouse = ptsMouse ;
        !           702:    ptMouse.x = ptsMouse.x ;
        !           703:    ptMouse.y = ptsMouse.y ;
        !           704: 
        !           705:    if (PtInRect (&pILine->rectLeftBk, ptMouse))
        !           706:       ILPageLeftRight (hWnd, pILine, TRUE) ;
        !           707: 
        !           708:    else if (PtInRect (&pILine->rectRightBk, ptMouse))
        !           709:       ILPageLeftRight (hWnd, pILine, FALSE) ;
        !           710: 
        !           711:    else if (PtInRect (&pILine->rectLeftGrab, ptMouse))
        !           712:       {
        !           713:       ILMode (pILine) = ILModeLeft ;
        !           714:       StartGrab (hWnd, pILine) ;
        !           715:       }
        !           716: 
        !           717:    else if (PtInRect (&pILine->rectRightGrab, ptMouse))
        !           718:       {
        !           719:       ILMode (pILine) = ILModeRight ;
        !           720:       StartGrab (hWnd, pILine) ;
        !           721:       }
        !           722: 
        !           723:    else if (PtInRect (&pILine->rectCenterGrab, ptMouse))
        !           724:       {
        !           725:       ILMode (pILine) = ILModeCenter ;
        !           726:       StartGrab (hWnd, pILine) ;
        !           727:       }
        !           728:    }
        !           729: 
        !           730: 
        !           731: void static OnSize (HWND hWnd, WORD xWidth, WORD yHeight)
        !           732:    {  // OnSize
        !           733:    PILINE         pILine ;
        !           734: 
        !           735:    pILine = ILData (hWnd) ;
        !           736: 
        !           737:    ILCalcPositions (hWnd, pILine) ;
        !           738:    }  // OnSize
        !           739: 
        !           740: 
        !           741: //==========================================================================//
        !           742: //                             Exported Functions                           //
        !           743: //==========================================================================//
        !           744: 
        !           745: 
        !           746: LONG FAR PASCAL ILineWndProc (HWND hWnd,
        !           747:                               unsigned msg,
        !           748:                               WPARAM wParam,
        !           749:                               LONG lParam)
        !           750: /*
        !           751:    Note:          This function must be declared in the application's
        !           752:                   linker-definition file, perfmon.def file.
        !           753: */
        !           754:    {  // ILineWndProc
        !           755:    BOOL           bCallDefWindowProc ;
        !           756:    POINTS         ptsMouse ;
        !           757:    LONG           lReturnValue ;
        !           758: 
        !           759:    bCallDefWindowProc = FALSE ;
        !           760:    lReturnValue = 0L ;
        !           761: 
        !           762:    switch (msg)
        !           763:       {  // switch
        !           764:       case WM_CREATE:
        !           765:          OnCreate (hWnd) ;
        !           766:          break ;
        !           767: 
        !           768:       case WM_DESTROY:
        !           769:          OnDestroy (hWnd) ;
        !           770:          break ;
        !           771: 
        !           772:       case WM_LBUTTONDOWN:
        !           773:          // See the note in OnMouseMove for why we are using POINTS
        !           774:          ptsMouse = MAKEPOINTS (lParam) ;
        !           775:          OnLButtonDown (hWnd, ptsMouse) ;
        !           776:          break ;
        !           777: 
        !           778:       case WM_LBUTTONUP:
        !           779:          OnLButtonUp (hWnd) ;
        !           780:          break ;
        !           781: 
        !           782:       case WM_MOUSEMOVE:
        !           783:          // See the note in OnMouseMove for why we are using POINTS
        !           784:          ptsMouse = MAKEPOINTS (lParam) ;
        !           785:          OnMouseMove (hWnd, ptsMouse) ;
        !           786:          break ;
        !           787: 
        !           788:       case WM_PAINT:
        !           789:          OnPaint (hWnd) ;
        !           790:          break ;
        !           791: 
        !           792:       case WM_SIZE:
        !           793:          OnSize (hWnd, LOWORD (lParam), HIWORD (lParam)) ;
        !           794: 
        !           795:       default:
        !           796:          bCallDefWindowProc = TRUE ;
        !           797:       }  // switch
        !           798: 
        !           799:    if (bCallDefWindowProc)
        !           800:       lReturnValue = DefWindowProc (hWnd, msg, wParam, lParam) ;
        !           801: 
        !           802:    return (lReturnValue) ;
        !           803:    }  // ILineWndProc
        !           804: 
        !           805: 
        !           806: 
        !           807: BOOL ILineInitializeApplication (void)
        !           808: /*
        !           809:    Effect:        Perform all initializations required before an application
        !           810:                   can create an IntervalLine. In particular, register the 
        !           811:                   IntervalLine window class.
        !           812: 
        !           813:    Called By:     The application, in its InitializeApplication routine.
        !           814: 
        !           815:    Returns:       Whether the class could be registered.
        !           816: */
        !           817:    {  // ILineInitializeApplication
        !           818:    WNDCLASS       wc ;
        !           819: 
        !           820:    wc.style =           dwILineClassStyle ;
        !           821:    wc.lpfnWndProc =     ILineWndProc ;
        !           822:    wc.cbClsExtra =      iILineClassExtra ;
        !           823:    wc.cbWndExtra =      iILineWindowExtra ;
        !           824:    wc.hInstance =       hInstance ;
        !           825:    wc.hIcon =           NULL ;
        !           826:    wc.hCursor =         LoadCursor (NULL, IDC_ARROW) ;
        !           827:    wc.hbrBackground =   NULL ;
        !           828:    wc.lpszMenuName =    NULL ;
        !           829:    wc.lpszClassName =   szILineClass ;
        !           830: 
        !           831:    return (RegisterClass (&wc)) ;
        !           832:    }  // ILineInitializeApplication
        !           833: 
        !           834: 
        !           835: void ILineSetRange (HWND hWnd, int iBegin, int iEnd)
        !           836:    {  // ILineSetRange
        !           837:    PILINE         pILine ;
        !           838: 
        !           839:    pILine = ILData (hWnd) ;
        !           840: 
        !           841:    ILBegin (pILine) = iBegin ;
        !           842:    ILEnd (pILine) = iEnd ;
        !           843: 
        !           844:    ILCalcPositions (hWnd, pILine) ;
        !           845:    }  // ILineSetRange
        !           846: 
        !           847: 
        !           848: void ILineSetStart (HWND hWnd, int iStart)
        !           849:    {  // ILineSetStart
        !           850:    PILINE         pILine ;
        !           851: 
        !           852:    pILine = ILData (hWnd) ;
        !           853: 
        !           854:    iStart = PinInclusive (iStart, ILBegin (pILine), ILEnd (pILine)) ;
        !           855:    ILStart (pILine) = iStart ;
        !           856: 
        !           857:    ILCalcPositions (hWnd, pILine) ;
        !           858:    }  // ILineSetStart
        !           859: 
        !           860: 
        !           861: 
        !           862: void ILineSetStop (HWND hWnd, int iStop)
        !           863:    {  // ILineSetStop
        !           864:    PILINE         pILine ;
        !           865: 
        !           866:    pILine = ILData (hWnd) ;
        !           867: 
        !           868:    iStop = PinInclusive (iStop, ILBegin (pILine), ILEnd (pILine)) ;
        !           869:    ILStop (pILine) = iStop ;
        !           870: 
        !           871:    ILCalcPositions (hWnd, pILine) ;
        !           872:    }  // ILineSetStop
        !           873: 
        !           874: 
        !           875: int ILineXStart (HWND hWnd)
        !           876:    {
        !           877:    PILINE         pILine ;
        !           878: 
        !           879:    pILine = ILData (hWnd) ;
        !           880: 
        !           881:    return (pILine->rectLeftGrab.left) ;
        !           882:    }
        !           883: 
        !           884: 
        !           885: int ILineXStop (HWND hWnd)
        !           886:    {
        !           887:    PILINE         pILine ;
        !           888: 
        !           889:    pILine = ILData (hWnd) ;
        !           890: 
        !           891:    return (pILine->rectRightGrab.right) ;
        !           892:    }
        !           893: 
        !           894: 
        !           895: int ILineStart (HWND hWnd)
        !           896:    {
        !           897:    PILINE         pILine ;
        !           898: 
        !           899:    pILine = ILData (hWnd) ;
        !           900: 
        !           901:    return  (ILStart (pILine)) ;
        !           902:    }
        !           903: 
        !           904: 
        !           905: int ILineStop (HWND hWnd)
        !           906:    {
        !           907:    PILINE         pILine ;
        !           908: 
        !           909:    pILine = ILData (hWnd) ;
        !           910: 
        !           911:    return  (ILStop (pILine)) ;
        !           912:    }
        !           913: 
        !           914: 
        !           915: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.