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

1.1     ! root        1: /*
        !             2: ==============================================================================
        !             3: 
        !             4:   Application:
        !             5: 
        !             6:             Microsoft Windows NT (TM) Performance Monitor
        !             7: 
        !             8:   File:
        !             9:             status.c - Status window procedure and supporting routines.
        !            10: 
        !            11:             This file contains code creating the status window, which is
        !            12:             a child of the legend window. The status window shows the 
        !            13:             time duration of the chart, and the last, avg, min and max
        !            14:             of the currently-selected chart line.
        !            15: 
        !            16: 
        !            17:   Copyright 1992, Microsoft Corporation. All Rights Reserved.
        !            18: ==============================================================================
        !            19: */
        !            20: 
        !            21: 
        !            22: //==========================================================================//
        !            23: //                                  Includes                                //
        !            24: //==========================================================================//
        !            25: 
        !            26: 
        !            27: #include <stdio.h>
        !            28: #include <stdlib.h>   // for mbstowcs
        !            29: 
        !            30: 
        !            31: #include "perfmon.h"
        !            32: #include "valuebar.h"
        !            33: 
        !            34: #include "grafdata.h"      // for CurrentGraphLine
        !            35: #include "graph.h"
        !            36: #include "playback.h"      // for PlayingBackLog
        !            37: #include "legend.h"
        !            38: #include "utils.h"
        !            39: 
        !            40: 
        !            41: 
        !            42: //==========================================================================//
        !            43: //                                  Constants                               //
        !            44: //==========================================================================//
        !            45: HDC   hVBarDC ;
        !            46: 
        !            47: #define szGraphStatusClass          TEXT("PerfmonGraphStatusClass")
        !            48: #define dwGraphStatusClassStyle     (CS_HREDRAW | CS_VREDRAW | CS_OWNDC)
        !            49: #define iGraphStatusClassExtra      (0)
        !            50: #define iGraphStatusWindowExtra     (0)
        !            51: #define dwGraphStatusWindowStyle    (WS_CHILD | WS_VISIBLE) 
        !            52: 
        !            53: 
        !            54: #define szStatusValueFormat         TEXT("%10.3f")
        !            55: #define szStatusMediumnValueFormat  TEXT("%10.0f")
        !            56: #define szStatusLargeValueFormat    TEXT("%10.4e")
        !            57: #define eStatusValueTooLarge        ((FLOAT) 1.0E+20)
        !            58: #define eStatusValueMax             ((FLOAT) 999999.999)
        !            59: #define eStatusLargeValueMax        ((FLOAT) 9999999999.0)
        !            60: 
        !            61: 
        !            62: #define szValueTooHigh              TEXT("+ + + +")
        !            63: #define szValueTooLow               TEXT("- - - -")
        !            64: 
        !            65: #define StatusLastElt               0
        !            66: #define StatusAvgElt                1
        !            67: #define StatusMinElt                2
        !            68: #define StatusMaxElt                3
        !            69: #define StatusTimeElt               4
        !            70: 
        !            71: #define StatusNumElts               5
        !            72: 
        !            73: #define StatusDrawAvg(hDC, eValue, bForceRedraw)   \
        !            74:    DrawStatusValue (hDC, StatusAvgElt, eValue, bForceRedraw)
        !            75: 
        !            76: #define StatusDrawMax(hDC, eValue, bForceRedraw)   \
        !            77:    DrawStatusValue (hDC, StatusMaxElt, eValue, bForceRedraw)
        !            78: 
        !            79: #define StatusDrawMin(hDC, eValue, bForceRedraw)   \
        !            80:    DrawStatusValue (hDC, StatusMinElt, eValue, bForceRedraw)
        !            81: 
        !            82: //==========================================================================//
        !            83: //                                  Typedefs                                //
        !            84: //==========================================================================//
        !            85: 
        !            86: 
        !            87: typedef struct StatusEltStruct
        !            88:    {
        !            89:    TCHAR          szText [20] ;
        !            90:    int            xTextPos ;
        !            91:    int            xValuePos ;
        !            92:    FLOAT          eValue ;
        !            93:    } StatusEltType ;
        !            94: 
        !            95: 
        !            96: // This structure represents the "instance data" for a StatusWindow. The
        !            97: // information is collected in a structure to ease the conversion of this
        !            98: // code when later adding multiple graph windows. For now, one copy of this
        !            99: // struct is defined as local data to this file.
        !           100: typedef struct StatusDataStruct
        !           101:    {
        !           102:    StatusEltType  aElts [StatusNumElts] ;
        !           103:    SIZE           sizeValue ;
        !           104:    int            yHeight ;
        !           105:    } StatusDataType ;
        !           106: 
        !           107: 
        !           108: 
        !           109: //==========================================================================//
        !           110: //                                Local Data                                //
        !           111: //==========================================================================//
        !           112: 
        !           113: 
        !           114: StatusDataType    StatusData ;
        !           115: 
        !           116: 
        !           117: //==========================================================================//
        !           118: //                                   Macros                                 //
        !           119: //==========================================================================//
        !           120: 
        !           121: 
        !           122: #define StatusTopMargin()     (2)
        !           123: #define StatusBottomMargin()  (4)
        !           124: 
        !           125: #define StatusLeftMargin()    (3)
        !           126: #define StatusTextMargin()    (5 + ThreeDPad)
        !           127: #define StatusValueMargin()   (3 + ThreeDPad)
        !           128: 
        !           129: 
        !           130: //==========================================================================//
        !           131: //                              Local Functions                             //
        !           132: //==========================================================================//
        !           133: 
        !           134: 
        !           135: void DrawStatusValue (HDC hDC,
        !           136:                       int iEltOffset,
        !           137:                       FLOAT eValue,
        !           138:                       BOOL bForceRedraw)
        !           139: /*
        !           140:    Called By:     StatusDrawTime, StatusDrawLast, StatusDrawAvg,
        !           141:                   StatusDrawMin, StatusDrawMax.
        !           142: */
        !           143:    {  // DrawStatusValue
        !           144:    RECT           rectValue ;
        !           145:    TCHAR          szValue [20] ;
        !           146: 
        !           147:    if (!bForceRedraw && eValue == StatusData.aElts[iEltOffset].eValue)
        !           148:       return ;
        !           149:    StatusData.aElts[iEltOffset].eValue = eValue ;
        !           150: 
        !           151:    rectValue.left = StatusData.aElts[iEltOffset].xValuePos ;
        !           152:    rectValue.top = StatusTopMargin () + ThreeDPad + 1;
        !           153:    rectValue.right = rectValue.left + StatusData.sizeValue.cx ;
        !           154:    rectValue.bottom = rectValue.top + StatusData.sizeValue.cy ;
        !           155: 
        !           156: 
        !           157:    if (eValue > eStatusValueMax)
        !           158:       {
        !           159:       if (eValue > eStatusValueTooLarge)
        !           160:          {
        !           161:          lstrcpy (szValue, szValueTooHigh) ;
        !           162:          }
        !           163:       else
        !           164:          {
        !           165:          TSPRINTF (szValue,
        !           166:             (eValue > eStatusLargeValueMax) ? szStatusLargeValueFormat :
        !           167:             szStatusMediumnValueFormat,
        !           168:             eValue) ;
        !           169:          }
        !           170:       }
        !           171:    else if (eValue < -eStatusValueMax)
        !           172:       lstrcpy (szValue, szValueTooLow) ;
        !           173:    else 
        !           174:       TSPRINTF (szValue, szStatusValueFormat, eValue) ;
        !           175: 
        !           176:    ExtTextOut (hDC, rectValue.right, rectValue.top, ETO_OPAQUE, &rectValue,
        !           177:                szValue, lstrlen (szValue), NULL) ;
        !           178:    }  // DrawStatusValue
        !           179: 
        !           180: 
        !           181: //==========================================================================//
        !           182: //                              Message Handlers                            //
        !           183: //==========================================================================//
        !           184: 
        !           185: 
        !           186: //void static OnCreate (HWND hWnd)
        !           187: void OnVBarCreate (HWND hWnd)
        !           188: /*
        !           189:    Effect:        Perform any actions needed when a status window is created.
        !           190:                   In particular, set the instance data to initial values,
        !           191:                   determine the size and placement of the various elements
        !           192:                   of the status display.
        !           193: 
        !           194:    Called By:     GraphStatusWndProc only, in response to a WM_CREATE message.
        !           195: */
        !           196:    {  // OnCreate
        !           197:    TCHAR          szValue [20] ;
        !           198:    HDC            hDC ;
        !           199:    int            iLen ;
        !           200:    int            i ;
        !           201: 
        !           202: 
        !           203:    hDC = hVBarDC = GetDC (hWnd) ;
        !           204:    SelectFont (hDC, hFontScales) ;
        !           205:    SetBkColor (hDC, ColorBtnFace) ;
        !           206:    SetTextAlign (hDC, TA_RIGHT | TA_TOP) ;
        !           207: 
        !           208:    //=============================//
        !           209:    // Load Text Labels            //
        !           210:    //=============================//
        !           211: 
        !           212:    StringLoad (IDS_STATUSLAST, StatusData.aElts[StatusLastElt].szText) ;
        !           213:    StringLoad (IDS_STATUSAVG, StatusData.aElts[StatusAvgElt].szText) ;
        !           214:    StringLoad (IDS_STATUSMIN, StatusData.aElts[StatusMinElt].szText) ;
        !           215:    StringLoad (IDS_STATUSMAX, StatusData.aElts[StatusMaxElt].szText) ;
        !           216:    StringLoad (IDS_STATUSTIME, StatusData.aElts[StatusTimeElt].szText) ;
        !           217: 
        !           218:    //=============================//
        !           219:    // Determine Status Height     //
        !           220:    //=============================//
        !           221: 
        !           222:    StatusData.yHeight = StatusTopMargin () + 
        !           223:                         StatusBottomMargin () +
        !           224:                         FontHeight (hDC, TRUE) +
        !           225:                         2 * ThreeDPad ;
        !           226: 
        !           227:    //=============================//
        !           228:    // Set position/size of elts   //
        !           229:    //=============================//
        !           230: 
        !           231:    // Determine the bounding box for each status value by using a max value.
        !           232:    iLen = TSPRINTF (szValue, szStatusLargeValueFormat, -eStatusValueMax) ;
        !           233: 
        !           234:    GetTextExtentPoint (hDC, szValue, lstrlen(szValue), &StatusData.sizeValue) ;
        !           235:    for (i = 0 ;
        !           236:         i < StatusNumElts ;
        !           237:         i++)
        !           238:       {  // for
        !           239:       StatusData.aElts[i].eValue = (FLOAT) 0.0 ;
        !           240: 
        !           241:       if (i)
        !           242:          StatusData.aElts[i].xTextPos = 
        !           243:             StatusTextMargin () + 
        !           244:             StatusData.aElts[i - 1].xValuePos +
        !           245:             StatusData.sizeValue.cx ;
        !           246:       else
        !           247:          StatusData.aElts[i].xTextPos = StatusLeftMargin () ;
        !           248:       StatusData.aElts[i].xValuePos = StatusData.aElts[i].xTextPos +
        !           249:                                      StatusValueMargin () +
        !           250:                                      TextWidth (hDC, StatusData.aElts[i].szText) ;
        !           251:       }  // for
        !           252:    }  // OnCreate
        !           253: 
        !           254: 
        !           255: 
        !           256: void static OnPaint (HWND hWnd)
        !           257: /*
        !           258:    Effect:        Paint the invalid surface of hWnd. Draw each label, each
        !           259:                   recessed value box, and each value.
        !           260: 
        !           261:    Called By:     GraphStatusWndProc only, in response to a WM_PAINT message.
        !           262: */
        !           263:    {
        !           264:    HDC            hDC ;
        !           265:    PAINTSTRUCT    ps ;
        !           266:    RECT           rectClient ;
        !           267:    int            i ;
        !           268:    PLINESTRUCT    pLine;
        !           269: 
        !           270:    hDC = BeginPaint (hWnd, &ps) ;
        !           271:    SetBkMode (hDC, TRANSPARENT) ;
        !           272: 
        !           273:    GetClientRect (hWnd, &rectClient) ;
        !           274:    HLine (hDC, GetStockObject (BLACK_PEN), 
        !           275:           rectClient.left, rectClient.right,
        !           276:           rectClient.bottom - 1) ;
        !           277: 
        !           278:    if ((pGraphs->gOptions.bStatusBarChecked) &&
        !           279:        (pGraphs->gOptions.bLegendChecked))
        !           280:       {  // if
        !           281:       UINT  hPrevTextAlign = SetTextAlign (hDC, TA_LEFT | TA_TOP) ;
        !           282: 
        !           283:       for (i = 0 ;
        !           284:            i < StatusNumElts ;
        !           285:            i++)
        !           286:          {  // for
        !           287:          // Draw the label
        !           288:          TextOut (hDC, StatusData.aElts[i].xTextPos, StatusTopMargin () + ThreeDPad,
        !           289:                   StatusData.aElts[i].szText,
        !           290:                   lstrlen (StatusData.aElts[i].szText)) ;
        !           291: 
        !           292:          // Draw the recesed value box
        !           293:          ThreeDConcave1 (hDC,
        !           294:                         StatusData.aElts[i].xValuePos - ThreeDPad,
        !           295:                         StatusTopMargin (),
        !           296:                         StatusData.aElts[i].xValuePos + StatusData.sizeValue.cx + ThreeDPad,
        !           297:                         StatusTopMargin () + StatusData.sizeValue.cy + 2 * ThreeDPad ) ;
        !           298:          }  // for
        !           299: 
        !           300:       // restore TextAlign for drawing values
        !           301:       SetTextAlign (hDC, hPrevTextAlign) ;
        !           302: 
        !           303:       // Draw the values themselves
        !           304: 
        !           305:       pLine = CurrentGraphLine (hWndGraph) ;
        !           306:       StatusDrawTime (hDC, TRUE) ;
        !           307: 
        !           308:       StatusDrawLast (hDC, pLine, TRUE) ;
        !           309: 
        !           310:       if (pLine)
        !           311:          {
        !           312:          StatusDrawAvg (hDC, pLine->lnAveValue, TRUE) ;
        !           313:          StatusDrawMin (hDC, pLine->lnMinValue, TRUE) ;
        !           314:          StatusDrawMax (hDC, pLine->lnMaxValue, TRUE) ;
        !           315:          }
        !           316:       else
        !           317:          {
        !           318:          StatusDrawAvg (hVBarDC,  (FLOAT)0.0, TRUE) ;
        !           319:          StatusDrawMax (hVBarDC,  (FLOAT)0.0, TRUE) ;
        !           320:          StatusDrawMin (hVBarDC,  (FLOAT)0.0, TRUE) ;
        !           321:          }
        !           322:       }  // if
        !           323: 
        !           324:    EndPaint (hWnd, &ps) ;
        !           325:    }  // StatusPaint
        !           326: 
        !           327: 
        !           328: //==========================================================================//
        !           329: //                             Exported Functions                           //
        !           330: //==========================================================================//
        !           331: 
        !           332: 
        !           333: 
        !           334: void StatusDrawTime (HDC hDC, BOOL bForceRedraw)
        !           335: /*
        !           336:    Called By:     StatusTimer, StatusPaint.
        !           337: */
        !           338:    {  // StatusDrawTime
        !           339:    FLOAT          eTimeSeconds ;
        !           340: 
        !           341:    if (PlayingBackLog ())
        !           342:       eTimeSeconds = (FLOAT) PlaybackSelectedSeconds () ;
        !           343:    else
        !           344:       eTimeSeconds = pGraphs->gOptions.eTimeInterval *
        !           345:                      (FLOAT) pGraphs->gMaxValues;
        !           346: 
        !           347:    DrawStatusValue (hDC, StatusTimeElt, eTimeSeconds, bForceRedraw) ;
        !           348:    }  // StatusDrawTime
        !           349: 
        !           350: 
        !           351: void StatusDrawLast (HDC hDC, PLINESTRUCT pLine, BOOL bForceRedraw)
        !           352: /*
        !           353:    Called By:     StatusTimer, StatusPaint.
        !           354: */
        !           355:    {
        !           356:    INT            iKnownValue ;
        !           357:    int            iMaxValues ;
        !           358:    FLOAT          eValue ;
        !           359: 
        !           360:    if (!pLine)
        !           361:       eValue = (FLOAT) 0.0 ;
        !           362:    else
        !           363:       {
        !           364:       iKnownValue = pGraphs->gKnownValue ;
        !           365:       iMaxValues  = pGraphs->gMaxValues ;
        !           366:       eValue = pLine->lnValues [iKnownValue % iMaxValues] ;
        !           367:       }
        !           368: 
        !           369:    DrawStatusValue (hDC, StatusLastElt, eValue, bForceRedraw) ;
        !           370:    }
        !           371: 
        !           372: #if 0
        !           373: void StatusDrawAvg (HDC hDC, PLINESTRUCT pLine, BOOL bForceRedraw)
        !           374: /*
        !           375:    Called By:     StatusTimer, StatusPaint.
        !           376: */
        !           377:    {
        !           378:    FLOAT          eValue ;
        !           379: 
        !           380:    if (!pLine)
        !           381:       eValue = (FLOAT) 0.0 ;
        !           382:    else
        !           383:       eValue = pLine->lnAveValue ;
        !           384: 
        !           385:    DrawStatusValue (hDC, StatusAvgElt, eValue, bForceRedraw) ;
        !           386:    }
        !           387: 
        !           388: 
        !           389: void StatusDrawMax (HDC hDC, PLINESTRUCT pLine, BOOL bForceRedraw)
        !           390: /*
        !           391:    Called By:     StatusTimer, StatusPaint.
        !           392: */
        !           393:    {
        !           394:    FLOAT          eValue ;
        !           395: 
        !           396:    if (!pLine)
        !           397:       eValue = (FLOAT) 0.0 ;
        !           398:    else
        !           399:       eValue = pLine->lnMaxValue ;
        !           400: 
        !           401:    DrawStatusValue (hDC, StatusMaxElt, eValue, bForceRedraw) ;
        !           402:    }
        !           403: 
        !           404: 
        !           405: void StatusDrawMin (HDC hDC, PLINESTRUCT pLine, BOOL bForceRedraw) 
        !           406: /*
        !           407:    Called By:     StatusTimer, StatusPaint.
        !           408: */
        !           409:    {
        !           410:    FLOAT          eValue ;
        !           411: 
        !           412:    if (!pLine)
        !           413:       eValue = (FLOAT) 0.0 ;
        !           414:    else
        !           415:       eValue = pLine->lnMinValue ;
        !           416: 
        !           417:    DrawStatusValue (hDC, StatusMinElt, eValue, bForceRedraw) ;
        !           418:    }
        !           419: #endif
        !           420: 
        !           421: 
        !           422: LRESULT APIENTRY GraphStatusWndProc (HWND hWnd,
        !           423:                                      WORD wMsg,
        !           424:                                      WPARAM wParam,
        !           425:                                      LPARAM lParam)
        !           426:    {  // GraphStatusWndProc
        !           427:    BOOL           bCallDefProc ;
        !           428:    LRESULT        lReturnValue ;
        !           429: 
        !           430: 
        !           431:    bCallDefProc = FALSE ;
        !           432:    lReturnValue = 0L ;
        !           433: 
        !           434:    switch (wMsg)
        !           435:       {  // switch
        !           436:       case WM_CREATE:
        !           437:          //OnCreate (hWnd) ;
        !           438:          OnVBarCreate (hWnd) ;
        !           439:          break ;
        !           440: 
        !           441: 
        !           442:       case WM_PAINT:
        !           443:          OnPaint (hWnd) ;
        !           444:          break ;
        !           445: 
        !           446:       case WM_DESTROY:
        !           447:          ReleaseDC (hWnd, hVBarDC) ;
        !           448:          break ;
        !           449: 
        !           450:       default:
        !           451:          bCallDefProc = TRUE ;
        !           452:       }  // switch
        !           453: 
        !           454: 
        !           455:    if (bCallDefProc)
        !           456:       lReturnValue = DefWindowProc (hWnd, wMsg, wParam, lParam) ;
        !           457: 
        !           458:    return (lReturnValue);
        !           459:    }  // GraphStatusWndProc
        !           460: 
        !           461: 
        !           462: int ValuebarHeight (HWND hWnd)
        !           463: /*
        !           464:    Effect:        A status window has a preferred height, based on the font
        !           465:                   used in its display. Return the preferred height, determined
        !           466:                   when the window was created.
        !           467: 
        !           468:    Assert:        OnCreate has already been called, and it set 
        !           469:                   StatusData.yHeight.
        !           470: */  
        !           471:    {
        !           472:    return (StatusData.yHeight) ;
        !           473:    }
        !           474: 
        !           475: 
        !           476: void StatusTimer (HWND hWnd, BOOL bForceRedraw)
        !           477: /*
        !           478:    Effect:        Perform any status-window actions necessary when a timer 
        !           479:                   tick has been received. In particular, update (redraw)
        !           480:                   any of the changed values in the status bar.
        !           481: 
        !           482:    Internals:     Each of these called functions compares the value to be
        !           483:                   displayed with the previous value and doesn't draw if the 
        !           484:                   values are equal.
        !           485: */
        !           486:    {  // StatusTimer
        !           487:    PLINESTRUCT pLine;
        !           488: 
        !           489:    
        !           490: 
        !           491:    pLine = CurrentGraphLine (hWndGraph) ;
        !           492: 
        !           493:    StatusDrawLast (hVBarDC, pLine, bForceRedraw) ;
        !           494: 
        !           495:    if (pLine)
        !           496:       {
        !           497:       StatusDrawAvg (hVBarDC, pLine->lnAveValue, bForceRedraw) ;
        !           498:       StatusDrawMin (hVBarDC, pLine->lnMinValue, bForceRedraw) ;
        !           499:       StatusDrawMax (hVBarDC, pLine->lnMaxValue, bForceRedraw) ;
        !           500:       }
        !           501:    else
        !           502:       {
        !           503:       StatusDrawAvg (hVBarDC,  (FLOAT)0.0, bForceRedraw) ;
        !           504:       StatusDrawMax (hVBarDC,  (FLOAT)0.0, bForceRedraw) ;
        !           505:       StatusDrawMin (hVBarDC,  (FLOAT)0.0, bForceRedraw) ;
        !           506:       }
        !           507:    }  // StatusTimer
        !           508: 
        !           509: 
        !           510: 
        !           511: HWND CreateGraphStatusWindow (HWND hWndGraph)
        !           512:    {
        !           513:    return (CreateWindow (szGraphStatusClass,       // class
        !           514:                          NULL,                     // caption
        !           515:                          dwGraphStatusWindowStyle, // window style
        !           516:                          0, 0,                     // position
        !           517:                          0, 0,                     // size
        !           518:                          hWndGraph,                // parent window
        !           519:                          NULL,                     // menu
        !           520:                          hInstance,               // program instance
        !           521:                          NULL)) ;                  // user-supplied data
        !           522:    }
        !           523: 
        !           524: 
        !           525: 
        !           526: 
        !           527: BOOL GraphStatusInitializeApplication (void)
        !           528: /*
        !           529:    Called By:     GraphInitializeApplication only
        !           530: */
        !           531:    {
        !           532:    WNDCLASS       wc ;
        !           533: 
        !           534:    wc.style          = dwGraphStatusClassStyle ;
        !           535:    wc.lpfnWndProc    = (WNDPROC) GraphStatusWndProc ;
        !           536:    wc.hInstance      = hInstance ;
        !           537:    wc.cbClsExtra     = iGraphStatusClassExtra ;
        !           538:    wc.cbWndExtra     = iGraphStatusWindowExtra ;
        !           539:    wc.hIcon          = NULL ;
        !           540:    wc.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
        !           541:    wc.hbrBackground  = hbLightGray ;
        !           542:    wc.lpszMenuName   = NULL ;
        !           543:    wc.lpszClassName  = szGraphStatusClass ;
        !           544: 
        !           545:    return (RegisterClass (&wc)) ;
        !           546:    }
        !           547:    
        !           548:    
        !           549: 

unix.superglobalmegacorp.com

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