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

1.1     ! root        1: #include "perfmon.h"
        !             2: #include "status.h"  // External declarations for this file
        !             3: #include <stdio.h>   // for sprintf.
        !             4: #include <stdarg.h>  // For ANSI variable args. Dont use UNIX <varargs.h>
        !             5: 
        !             6: #include "log.h"        // for LogCollecting
        !             7: #include "perfmops.h"   // for SmallFileSizeString
        !             8: #include "playback.h"   // for PlayingBackLog
        !             9: #include "utils.h"
        !            10: 
        !            11: //================================//
        !            12: // Options for PaintStatusBar     //
        !            13: //================================//
        !            14: #define     PaintText         1
        !            15: #define     PaintIcons        2
        !            16: #define     PaintBoundary     4
        !            17: #define     PaintAll          (PaintText + PaintIcons + PaintBoundary)
        !            18: 
        !            19: //==========================================================================//
        !            20: //                                  Constants                               //
        !            21: //==========================================================================//
        !            22: 
        !            23: #define szStatusClass          TEXT("PerfmonStatusClass")
        !            24: #define dwStatusClassStyle     (CS_HREDRAW | CS_VREDRAW | CS_OWNDC)
        !            25: #define iStatusClassExtra      (0)
        !            26: #define iStatusWindowExtra     (0)
        !            27: #define dwStatusWindowStyle    (WS_CHILD | WS_VISIBLE) 
        !            28: 
        !            29: 
        !            30: #define szAlertMax            TEXT(" 99 ")
        !            31: #define szAlertFormat         TEXT(" %2d ")
        !            32: #define szAlertOverflow       TEXT(" ++")
        !            33: 
        !            34: #define szLogMax              TEXT(" 9,999.9M ")
        !            35: 
        !            36: //==========================================================================//
        !            37: //                                Local Data                                //
        !            38: //==========================================================================//
        !            39: 
        !            40: 
        !            41: HDC            hStatusDC ;                   // for OWN_DC
        !            42: 
        !            43: HDC            hLogBitmapDC ;
        !            44: int            xLogBitmapWidth ;     
        !            45: int            yLogBitmapHeight ;
        !            46: 
        !            47: HDC            hAlertBitmapDC ;
        !            48: int            xAlertBitmapWidth ;     
        !            49: int            yAlertBitmapHeight ;     
        !            50: 
        !            51: int            yStatusHeight ;
        !            52: int            xStatusAlertWidth ;           // of alert bm and num alerts
        !            53: int            xStatusLogWidth ;             // of log bitmap and file size
        !            54: 
        !            55: int            szStatusLineLen ;             // no. of char. in szStatusLine
        !            56: TCHAR          szStatusLine [MessageLen+ResourceStringLen] ;
        !            57: TCHAR          szCurrentActivity [ResourceStringLen] ;
        !            58: TCHAR          szStatusFormat  [ResourceStringLen] ;
        !            59: TCHAR          szStatusFormat2 [ResourceStringLen] ;
        !            60: 
        !            61: HBITMAP        hBitmapAlertStatus ;
        !            62: HBITMAP        hBitmapLogStatus ;
        !            63: 
        !            64: 
        !            65: 
        !            66: //==========================================================================//
        !            67: //                                   Macros                                 //
        !            68: //==========================================================================//
        !            69: 
        !            70: 
        !            71: #define StatusTopMargin()     (2)
        !            72: #define StatusLeftMargin()    (2)
        !            73: 
        !            74: 
        !            75: //==========================================================================//
        !            76: //                              Local Functions                             //
        !            77: //==========================================================================//
        !            78: 
        !            79: 
        !            80: void DrawAlerts (HDC hDC,
        !            81:                  LPRECT lpRect)
        !            82:    {
        !            83:    TCHAR          szText [10] ;
        !            84:    RECT           rectText ;
        !            85:    int            yBitmapTop ;     
        !            86: 
        !            87:    if (!iUnviewedAlerts)
        !            88:       return ;
        !            89: 
        !            90:    yBitmapTop = lpRect->top +
        !            91:                 (lpRect->bottom - 
        !            92:                  lpRect->top - 
        !            93:                  yAlertBitmapHeight) / 2 ;
        !            94: 
        !            95:    SetTextColor (hDC, crLastUnviewedAlert) ;
        !            96: 
        !            97:    BitBlt (hDC,                           // DC for Destination surface
        !            98:       lpRect->right - xStatusAlertWidth,  // x pos for Destination surface
        !            99:       yBitmapTop,                         // y for Destination surface
        !           100:       xAlertBitmapWidth,                  // width of bitmap
        !           101:       yAlertBitmapHeight,                 // height of bitmap
        !           102:       hAlertBitmapDC,                     // DC for source surface
        !           103:       0, 0,                               // location in source surface
        !           104:       SRCCOPY) ;                          // ROP code
        !           105:    
        !           106:    SetTextColor (hDC, crBlack) ;
        !           107: 
        !           108:    if (iUnviewedAlerts > 99)
        !           109:       lstrcpy (szText, szAlertOverflow) ;
        !           110:    else
        !           111:       TSPRINTF (szText, szAlertFormat, iUnviewedAlerts) ;
        !           112: 
        !           113:    rectText.left = lpRect->right - xStatusAlertWidth + xAlertBitmapWidth ;
        !           114:    rectText.top = lpRect->top + 1 ;
        !           115:    rectText.right = lpRect->right - 1 ;
        !           116:    rectText.bottom = lpRect->bottom - 1 ;
        !           117: 
        !           118:    ExtTextOut (hDC, rectText.left, rectText.top, ETO_CLIPPED | ETO_OPAQUE,
        !           119:       &rectText, szText, lstrlen (szText), NULL) ;
        !           120: 
        !           121:    lpRect->right -= (xStatusAlertWidth + (xAlertBitmapWidth >> 2)) ;
        !           122:    }  // DrawAlerts
        !           123: 
        !           124: 
        !           125: void DrawLog (HDC hDC,
        !           126:               LPRECT lpRect)
        !           127:    {
        !           128:    TCHAR          szText [10] ;
        !           129:    RECT           rectText ;
        !           130:    int            yBitmapTop ;     
        !           131: 
        !           132:    if (!LogCollecting (hWndLog))
        !           133:       return ;
        !           134: 
        !           135:    yBitmapTop = lpRect->top +
        !           136:                 (lpRect->bottom - 
        !           137:                  lpRect->top - 
        !           138:                  yLogBitmapHeight) / 2 ;
        !           139:    BitBlt (hDC,                           // DC for Destination surface
        !           140:       lpRect->right - xStatusLogWidth,    // x pos for Destination surface
        !           141:       yBitmapTop,                         // y for Destination surface
        !           142:       xLogBitmapWidth,                    // width of bitmap
        !           143:       yLogBitmapHeight,                   // height of bitmap
        !           144:       hLogBitmapDC,                       // DC for source surface
        !           145:       0, 0,                               // location in source surface
        !           146:       SRCCOPY) ;                          // ROP code
        !           147: 
        !           148: 
        !           149:    SmallFileSizeString (LogFileSize (hWndLog), szText) ;
        !           150: 
        !           151:    rectText.left = lpRect->right - xStatusLogWidth +
        !           152:       xLogBitmapWidth + 1 ;
        !           153:    rectText.top = lpRect->top + 1 ;
        !           154:    rectText.right = lpRect->right - 1 ;
        !           155:    rectText.bottom = lpRect->bottom - 1 ;
        !           156: 
        !           157:    ExtTextOut (hDC, rectText.left, rectText.top, ETO_CLIPPED | ETO_OPAQUE,
        !           158:       &rectText, szText, lstrlen (szText), NULL) ;
        !           159: 
        !           160:    lpRect->right -= xStatusLogWidth ;
        !           161:    }  // DrawLog
        !           162: 
        !           163: 
        !           164: //==========================================================================//
        !           165: //                              Message Handlers                            //
        !           166: //==========================================================================//
        !           167: 
        !           168: 
        !           169: void static OnCreate (HWND hWnd)
        !           170: /*
        !           171:    Effect:        Perform any actions needed when a status window is created.
        !           172:                   In particular, set the instance data to initial values,
        !           173:                   determine the size and placement of the various elements
        !           174:                   of the status display.
        !           175: 
        !           176:    Called By:     StatusWndProc only, in response to a WM_CREATE message.
        !           177: */
        !           178:    {  // OnCreate
        !           179:    HDC            hDC ;
        !           180: 
        !           181: 
        !           182:    hBitmapAlertStatus = LoadBitmap (hInstance, idBitmapAlertStatus) ;
        !           183:    hBitmapLogStatus = LoadBitmap (hInstance, idBitmapLogStatus) ;
        !           184: 
        !           185:    hDC = hStatusDC = GetDC (hWnd) ;
        !           186:    SelectFont (hDC, hFontScales) ;
        !           187:    SetBkColor (hDC, ColorBtnFace) ;
        !           188:    SetTextAlign (hDC, TA_LEFT) ;
        !           189:    SetBkMode (hDC, OPAQUE) ;
        !           190: 
        !           191:    yStatusHeight = 2 * StatusTopMargin () + 
        !           192:                    FontHeight (hDC, TRUE) +
        !           193:                    2 * ThreeDPad ;
        !           194:    
        !           195:    // pre-load the log and alert bitmaps for perfmormance
        !           196:    xLogBitmapWidth = BitmapWidth (hBitmapLogStatus) ;
        !           197:    yLogBitmapHeight = BitmapHeight (hBitmapLogStatus) ;
        !           198:    xAlertBitmapWidth = BitmapWidth (hBitmapAlertStatus) ;
        !           199:    yAlertBitmapHeight = BitmapHeight (hBitmapAlertStatus) ;
        !           200: 
        !           201:    hLogBitmapDC = CreateCompatibleDC (hDC) ;
        !           202:    SelectObject (hLogBitmapDC, hBitmapLogStatus) ;
        !           203: 
        !           204:    hAlertBitmapDC = CreateCompatibleDC (hDC) ;
        !           205:    SelectObject (hAlertBitmapDC, hBitmapAlertStatus) ;
        !           206: 
        !           207: 
        !           208:    xStatusAlertWidth = xAlertBitmapWidth + 1 +
        !           209:                        TextWidth (hDC, szAlertMax) ;
        !           210:    xStatusLogWidth = xLogBitmapWidth +
        !           211:                      TextWidth (hDC, szLogMax) ;
        !           212: 
        !           213: 
        !           214:    StringLoad (IDS_CURRENTACTIVITY, szCurrentActivity) ;
        !           215:    StringLoad (IDS_STATUSFORMAT, szStatusFormat) ;
        !           216:    StringLoad (IDS_STATUSFORMAT2, szStatusFormat2) ;
        !           217: 
        !           218:    StatusLineReady (hWnd) ;
        !           219:    }  // OnCreate
        !           220: 
        !           221: void static OnDestroy (HWND hWnd)
        !           222:    {
        !           223:    if (hBitmapAlertStatus)
        !           224:       {
        !           225:       DeleteObject (hBitmapAlertStatus) ;
        !           226:       hBitmapAlertStatus = 0 ;
        !           227:       }
        !           228: 
        !           229:    if (hBitmapLogStatus)
        !           230:       {
        !           231:       DeleteObject (hBitmapLogStatus) ;
        !           232:       hBitmapLogStatus = 0 ;
        !           233:       }
        !           234:    ReleaseDC (hWnd, hStatusDC) ;
        !           235: 
        !           236:    }  // OnDestroy
        !           237: 
        !           238: void static PaintStatusBar (HWND hWnd, HDC hDC, int PaintOptions)
        !           239: /*
        !           240:    Effect:        Paint the invalid surface of hWnd. Draw each label, each
        !           241:                   recessed value box, and each value.
        !           242: 
        !           243:    Called By:     StatusWndProc only, in response to a WM_PAINT message.
        !           244: */
        !           245:    {
        !           246:    RECT           rectClient ;
        !           247: 
        !           248:    if (bPerfmonIconic)
        !           249:       {
        !           250:       // no need to draw anything if iconic
        !           251:       return ;
        !           252:       }
        !           253: 
        !           254:    GetClientRect (hWnd, &rectClient) ;
        !           255: 
        !           256:    RectContract (&rectClient, StatusTopMargin (), StatusLeftMargin ()) ;
        !           257:    
        !           258:    if (PaintOptions == PaintAll)
        !           259:       {
        !           260:       ThreeDConcave1 (hDC,
        !           261:                      rectClient.left, rectClient.top,
        !           262:                      rectClient.right, rectClient.bottom) ;
        !           263:       }
        !           264: 
        !           265:    rectClient.left += StatusLeftMargin () ;
        !           266: 
        !           267:    // Always draw the icons and need to draw log before Alerts!
        !           268:    DrawLog (hDC, &rectClient) ;
        !           269:    DrawAlerts (hDC, &rectClient) ;
        !           270: 
        !           271:    if (PaintOptions & PaintText)
        !           272:       {
        !           273:       rectClient.left += 1 ;
        !           274:       rectClient.top += 1 ;
        !           275:       rectClient.right -= 1 ;
        !           276:       rectClient.bottom -= 1 ;
        !           277:       ExtTextOut (hDC, rectClient.left, rectClient.top, ETO_CLIPPED | ETO_OPAQUE,
        !           278:          &rectClient, szStatusLine, szStatusLineLen, NULL) ;
        !           279:       }
        !           280: 
        !           281:    }  // PaintStatusBar
        !           282: 
        !           283: 
        !           284: 
        !           285: 
        !           286: LRESULT APIENTRY StatusWndProc (HWND hWnd,
        !           287:                                 WORD wMsg,
        !           288:                                 WPARAM wParam,
        !           289:                                 LPARAM lParam)
        !           290:    {  // StatusWndProc
        !           291:    BOOL           bCallDefProc ;
        !           292:    LRESULT        lReturnValue ;
        !           293:    HDC            hDC ;
        !           294:    PAINTSTRUCT    ps ;
        !           295: 
        !           296: 
        !           297:    bCallDefProc = FALSE ;
        !           298:    lReturnValue = 0L ;
        !           299: 
        !           300:    switch (wMsg)
        !           301:       {  // switch
        !           302:       case WM_PAINT:
        !           303:          hDC = BeginPaint (hWnd, &ps) ;
        !           304:          PaintStatusBar (hWnd, hDC, PaintAll) ;
        !           305:          EndPaint (hWnd, &ps) ;
        !           306:          break ;
        !           307: 
        !           308:       case WM_CREATE:
        !           309:          OnCreate (hWnd) ;
        !           310:          break ;
        !           311: 
        !           312:       case WM_DESTROY:
        !           313:          OnDestroy (hWnd) ;
        !           314:          break ;
        !           315: 
        !           316:       default:
        !           317:          bCallDefProc = TRUE ;
        !           318:       }  // switch
        !           319: 
        !           320: 
        !           321:    if (bCallDefProc)
        !           322:       lReturnValue = DefWindowProc (hWnd, wMsg, wParam, lParam) ;
        !           323: 
        !           324:    return (lReturnValue);
        !           325:    }  // StatusWndProc
        !           326: 
        !           327: 
        !           328: int StatusHeight (HWND hWnd)
        !           329: /*
        !           330:    Effect:        A status window has a preferred height, based on the font
        !           331:                   used in its display. Return the preferred height, determined
        !           332:                   when the window was created.
        !           333: 
        !           334:    Assert:        OnCreate has already been called, and it set 
        !           335:                   StatusData.yHeight.
        !           336: */  
        !           337:    {
        !           338:    return (yStatusHeight) ;
        !           339:    }
        !           340: 
        !           341: 
        !           342: 
        !           343: 
        !           344: HWND CreatePMStatusWindow (HWND hWnd)
        !           345:    {
        !           346:    return (CreateWindow (szStatusClass,       // class
        !           347:                          NULL,                // caption
        !           348:                          dwStatusWindowStyle, // window style
        !           349:                          0, 0,                // position
        !           350:                          0, 0,                // size
        !           351:                          hWnd,                // parent window
        !           352:                          NULL,                // menu
        !           353:                          hInstance,           // program instance
        !           354:                          NULL)) ;             // user-supplied data
        !           355:    }  // CreateStatusWindow
        !           356: 
        !           357: 
        !           358: 
        !           359: 
        !           360: BOOL StatusInitializeApplication (void)
        !           361: /*
        !           362:    Called By:     InitializeApplication only
        !           363: */
        !           364:    {
        !           365:    WNDCLASS       wc ;
        !           366: 
        !           367:    wc.style          = dwStatusClassStyle ;
        !           368:    wc.lpfnWndProc    = (WNDPROC) StatusWndProc ;
        !           369:    wc.hInstance      = hInstance ;
        !           370:    wc.cbClsExtra     = iStatusClassExtra ;
        !           371:    wc.cbWndExtra     = iStatusWindowExtra ;
        !           372:    wc.hIcon          = NULL ;
        !           373:    wc.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
        !           374:    wc.hbrBackground  = hbLightGray ;
        !           375:    wc.lpszMenuName   = NULL ;
        !           376:    wc.lpszClassName  = szStatusClass ;
        !           377: 
        !           378:    return (RegisterClass (&wc)) ;
        !           379:    }
        !           380:    
        !           381: BOOL _cdecl StatusLine (HWND hWnd,
        !           382:                         WORD wStringID, ...)
        !           383:    {
        !           384:    TCHAR          szFormat [MessageLen] ;
        !           385:    va_list        vaList ;
        !           386: 
        !           387:    if (wStringID == 0)
        !           388:       {
        !           389:       return (TRUE) ;
        !           390:       }
        !           391: 
        !           392:    strclr (szStatusLine) ;
        !           393: 
        !           394:    if (LoadString (hInstance, wStringID, szFormat, MessageLen))
        !           395:       {
        !           396:       va_start (vaList, wStringID) ;
        !           397:       wvsprintf (szStatusLine, szFormat, vaList) ;
        !           398:       va_end (vaList) ;
        !           399:       dwCurrentMenuID = MenuIDToHelpID (wStringID) ;
        !           400:       szStatusLineLen = lstrlen (szStatusLine) ;
        !           401:       }
        !           402:    else
        !           403:       {
        !           404:       dwCurrentMenuID = 0 ;
        !           405:       szStatusLineLen = 0 ;
        !           406:       }
        !           407:    PaintStatusBar (hWndStatus, hStatusDC, PaintText + PaintIcons) ;
        !           408: 
        !           409:    return (TRUE) ;
        !           410:    }  // StatusLine
        !           411: 
        !           412: 
        !           413: 
        !           414: void StatusLineReady (HWND hWnd)
        !           415:    {
        !           416:    int         stringLen ;
        !           417:    LPTSTR      pFileName = NULL ;
        !           418: 
        !           419:    TSPRINTF (szStatusLine, szStatusFormat, 
        !           420:              PlayingBackLog () ? 
        !           421:                PlaybackLog.szFileTitle : szCurrentActivity) ;
        !           422: 
        !           423:    switch (iPerfmonView)
        !           424:       {
        !           425:       case IDM_VIEWCHART:
        !           426:          pFileName = pChartFileName ;
        !           427:          break ;
        !           428: 
        !           429:       case IDM_VIEWALERT:
        !           430:          pFileName = pAlertFileName ;
        !           431:          break ;
        !           432: 
        !           433:       case IDM_VIEWLOG:
        !           434:          pFileName = pLogFileName ;
        !           435:          break ;
        !           436: 
        !           437:       case IDM_VIEWREPORT:
        !           438:          pFileName = pReportFileName ;
        !           439:          break ;
        !           440:       }
        !           441: 
        !           442:    if (pFileName)
        !           443:       {
        !           444:       stringLen = lstrlen (szStatusLine) ;
        !           445:       TSPRINTF (&szStatusLine[stringLen], szStatusFormat2, pFileName) ;
        !           446:       }
        !           447: 
        !           448:    szStatusLineLen = lstrlen (szStatusLine) ;
        !           449: 
        !           450:    PaintStatusBar (hWndStatus, hStatusDC, PaintText + PaintIcons) ;
        !           451:    }
        !           452: 
        !           453: 
        !           454: void StatusUpdateIcons (HWND hWndStatus)
        !           455:    {  
        !           456:    PaintStatusBar (hWndStatus, hStatusDC, PaintIcons) ;
        !           457:    }
        !           458: 

unix.superglobalmegacorp.com

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