Annotation of mstools/samples/sdktools/perfmon/status.c, revision 1.1.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.