Annotation of mstools/samples/sdktools/perfmon/graph.c, revision 1.1.1.1

1.1       root        1: /*****************************************************************************
                      2:  *
                      3:  *  Graph.c - This module handles the graphing window.
                      4:  *
                      5:  *  Microsoft Confidential
                      6:  *  Copyright (c) 1992-1993 Microsoft Corporation
                      7:  *
                      8:  *
                      9:  ****************************************************************************/
                     10: 
                     11: /*
                     12:    File Contents:
                     13: 
                     14:       This file contains the code for creating and manipulating the graph
                     15:       window. This window is a child of hWndMain and represents one of the
                     16:       three "views" of the program. The other views are log and alert.
                     17: 
                     18:       The graph window is actually just a container window, whose surface
                     19:       is completely filled by its children: hWndGraphDisplay, ,
                     20:       hWndGraphLegend, and hWndGraphStatus. Therefore much of this file is
                     21:       merely calls to the appropriate functions for these children.
                     22: 
                     23:       The graph window is responsible for the graph structure itself, 
                     24:       however. Conceptually this should be instance data for the graph
                     25:       window. Right now, however, there is only one window and only one
                     26:       graph structure. Nevertheless, we go through the GraphData(hWnd)
                     27:       function to get a pointer to the graph structure for the graph window.
                     28:       
                     29: */
                     30: 
                     31: 
                     32: //==========================================================================//
                     33: //                                  Includes                                //
                     34: //==========================================================================//
                     35: 
                     36: 
                     37: #include "perfmon.h"
                     38: #include "graph.h"
                     39: #include "grafdisp.h"
                     40: #include "legend.h"
                     41: #include "valuebar.h"
                     42: #include "utils.h"   // for WindowShow
                     43: 
                     44: 
                     45: //==========================================================================//
                     46: //                                  Constants                               //
                     47: //==========================================================================//
                     48: 
                     49: 
                     50: //=============================//
                     51: // Graph Class                 //
                     52: //=============================//
                     53: 
                     54: 
                     55: TCHAR   szGraphWindowClass[] = TEXT("PerfmonGraphClass") ;
                     56: #define dwGraphClassStyle           (CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS)
                     57: #define iGraphClassExtra            (0)
                     58: #define iGraphWindowExtra           (0)
                     59: #define dwGraphWindowStyle          (WS_CHILD)
                     60: 
                     61: 
                     62: 
                     63: //==========================================================================//
                     64: //                              Local Functions                             //
                     65: //==========================================================================//
                     66: 
                     67: 
                     68: void static OnCreate (HWND hWnd)
                     69:    {  // OnCreate
                     70:    hWndGraphDisplay = CreateGraphDisplayWindow (hWnd) ;
                     71:    hWndGraphLegend = CreateGraphLegendWindow (hWnd) ;
                     72:    hWndGraphStatus = CreateGraphStatusWindow (hWnd) ;
                     73:    }  // OnCreate
                     74: 
                     75: 
                     76: void static OnPaint (HWND hWnd)
                     77:    {
                     78:    HDC            hDC ;
                     79:    PAINTSTRUCT    ps ;
                     80: 
                     81:    hDC = BeginPaint (hWnd, &ps) ;
                     82:    EndPaint (hWnd, &ps) ;
                     83:    }
                     84: 
                     85: 
                     86: void static OnSize (HWND hWnd, int xWidth, int yHeight)
                     87:    {  // OnSize
                     88:    SizeGraphComponents (hWnd) ;
                     89:    }  // OnSize
                     90: 
                     91: 
                     92: //==========================================================================//
                     93: //                              Message Handlers                            //
                     94: //==========================================================================//
                     95: 
                     96: 
                     97: 
                     98: LRESULT APIENTRY GraphWndProc (HWND hWnd,
                     99:                                WORD wMsg,
                    100:                                DWORD wParam,
                    101:                                LONG lParam)
                    102:    {  // GraphWndProc
                    103:    BOOL           bCallDefProc ;
                    104:    LRESULT        lReturnValue ;
                    105: 
                    106: 
                    107:    bCallDefProc = FALSE ;
                    108:    lReturnValue = 0L ;
                    109: 
                    110:    switch (wMsg)
                    111:       {  // switch
                    112:       case WM_CREATE:
                    113:          OnCreate (hWnd) ;
                    114:          break ;
                    115: 
                    116:       case WM_LBUTTONDBLCLK:
                    117:          SendMessage (hWndMain, WM_LBUTTONDBLCLK, wParam, lParam) ;
                    118:          break ;
                    119: 
                    120:       case WM_PAINT:
                    121:          OnPaint (hWnd) ;
                    122:          break ;
                    123: 
                    124:       case WM_SIZE:
                    125:          OnSize (hWnd, LOWORD (lParam), HIWORD (lParam)) ;
                    126:          break ;
                    127: 
                    128:       default:
                    129:          bCallDefProc = TRUE ;
                    130:       }  // switch
                    131: 
                    132: 
                    133:    if (bCallDefProc)
                    134:       lReturnValue = DefWindowProc (hWnd, wMsg, wParam, lParam) ;
                    135: 
                    136:    return (lReturnValue);
                    137:    }  // GraphWndProc
                    138: 
                    139: 
                    140: 
                    141: BOOL GraphInitializeApplication (void)
                    142: /*
                    143:    Note:          There is no background brush set for the MainWindow
                    144:                   class so that the main window is never erased. The
                    145:                   client area of MainWindow is always covered by one
                    146:                   of the view windows. If we erase it, it would just
                    147:                   flicker needlessly.
                    148: */      
                    149:    {  // GraphInitializeApplication
                    150:    BOOL           bSuccess ;
                    151:    WNDCLASS       wc ;
                    152: 
                    153:    //=============================//
                    154:    // Register GraphWindow class  //
                    155:    //=============================//
                    156: 
                    157: 
                    158:    wc.style         = dwGraphClassStyle ;
                    159:    wc.lpfnWndProc   = (WNDPROC) GraphWndProc ;
                    160:    wc.hInstance     = hInstance ;
                    161:    wc.cbClsExtra    = iGraphWindowExtra ;
                    162:    wc.cbWndExtra    = iGraphClassExtra ;
                    163:    wc.hIcon         = NULL ;
                    164:    wc.hCursor       = LoadCursor(NULL, IDC_ARROW) ;
                    165:    wc.hbrBackground = NULL ;                          // see note above
                    166:    wc.lpszMenuName  = NULL ;
                    167:    wc.lpszClassName = szGraphWindowClass ;
                    168: 
                    169:    bSuccess = RegisterClass (&wc) ;
                    170: 
                    171: 
                    172:    //=============================//
                    173:    // Register Child classes      //
                    174:    //=============================//
                    175: 
                    176:    if (bSuccess)
                    177:       bSuccess = GraphDisplayInitializeApplication () ;
                    178: 
                    179:    if (bSuccess)
                    180:       bSuccess = GraphLegendInitializeApplication () ;
                    181:    
                    182:    if (bSuccess)
                    183:       bSuccess = GraphStatusInitializeApplication () ;
                    184: 
                    185:    return (bSuccess) ;
                    186:    }  // GraphInitializeApplication
                    187: 
                    188: 
                    189: HWND CreateGraphWindow (HWND hWndParent)
                    190: /*
                    191:    Effect:        Create the graph window. This window is a child of 
                    192:                   hWndMain and is a container for the graph data,
                    193:                   graph label, graph legend, and graph status windows.
                    194: 
                    195:    Note:          We dont worry about the size here, as this window
                    196:                   will be resized whenever the main window is resized.
                    197: 
                    198: */
                    199:    {
                    200:    return (CreateWindow (szGraphWindowClass,       // window class
                    201:                          NULL,                     // caption
                    202:                          dwGraphWindowStyle,       // style for window
                    203:                          0, 0,                     // initial position
                    204:                          0, 0,                     // initial size
                    205:                          hWndParent,               // parent
                    206:                          NULL,                     // menu
                    207:                          hInstance,               // program instance
                    208:                          NULL)) ;                  // user-supplied data                                              
                    209:    }
                    210: 
                    211: 
                    212: void SizeGraphComponents (HWND hWnd)
                    213: /*
                    214:    Effect:        Move and show the various components of the graph to
                    215:                   fill the size (xWidth x yHeight). Take into account
                    216:                   whether the user wants to show the legend or status
                    217:                   bars. Also take into account if we have room for these
                    218:                   items.
                    219: 
                    220:    Internals:     If the user doesn't want the status or legend windows,
                    221:                   they aren't shown. Also, if the user wanted the status
                    222:                   window but not the legend window, the status window is
                    223:                   not shown.
                    224: 
                    225:                   We may disregard the user's desire for the legend or
                    226:                   status bar if there is not room. In particular, a legend
                    227:                   window has a minimum width (LegendMinWidth ()) and a
                    228:                   minimum height (LegendMinHeight ()). These values are
                    229:                   fixed for a given session of perfmon. It also has a 
                    230:                   preferred height, which takes into consideration the 
                    231:                   size of the graph window and the number of items in
                    232:                   the legend. This value is returned by LegendHeight().
                    233:       
                    234:                   We don't show the legend if its minimum height would
                    235:                   take up more than half the graph height.
                    236: 
                    237:                   If we feel we don't have room for the legend, we don't
                    238:                   show the status window either.
                    239: 
                    240:    See Also:      LegendMinWidth, LegendMinHeight, LegendHeight, 
                    241:                   ValuebarHeight.
                    242: 
                    243:    Called By:     OnSize, any other function that may remove or add one
                    244:                   of the graph components.
                    245: */
                    246:    {  // SizeGraphComponents
                    247:    RECT           rectClient ;
                    248:    BOOL           bShowLegend ;
                    249:    BOOL           bShowStatus ;
                    250:    int            yStatusHeight ;
                    251:    int            yLegendHeight ;
                    252:    int            xWidth ;
                    253:    int            yHeight ;
                    254: 
                    255:    GetClientRect (hWnd, &rectClient) ;
                    256:    xWidth = rectClient.right - rectClient.left ;
                    257:    yHeight = rectClient.bottom - rectClient.top ;
                    258: 
                    259:    // if the graph window has no size, neither will its children.
                    260:    if (!xWidth || !yHeight)
                    261:       return ;
                    262: 
                    263:    //=============================//
                    264:    // Show the Legend Window?     //
                    265:    //=============================//
                    266: 
                    267:    if (!pGraphs->gOptions.bLegendChecked)
                    268:       bShowLegend = FALSE ;
                    269:    else if (xWidth < LegendMinWidth (hWndGraphLegend))
                    270:       bShowLegend = FALSE ;
                    271:    else if (yHeight < 5 * LegendMinHeight (hWndGraphLegend))
                    272:       bShowLegend = FALSE ;
                    273:    else
                    274:       bShowLegend = TRUE ;
                    275: 
                    276:    //=============================//
                    277:    // Show the Status Window?     //
                    278:    //=============================//
                    279: 
                    280:    if (!pGraphs->gOptions.bStatusBarChecked)
                    281:       bShowStatus = FALSE ;
                    282:    else if (!bShowLegend)
                    283:       bShowStatus = FALSE ;
                    284:    else
                    285:       bShowStatus = TRUE ;
                    286: 
                    287: 
                    288:    yStatusHeight = bShowStatus ? 
                    289:                      ValuebarHeight (hWndGraphStatus) : 0 ;
                    290:    yLegendHeight = bShowLegend ? 
                    291:                      LegendHeight (hWndGraphLegend, yHeight) : 0 ;
                    292: 
                    293: 
                    294:    //=============================//
                    295:    // Update the status window    //
                    296:    //=============================//
                    297: 
                    298:    if (bShowStatus)
                    299:       MoveWindow (hWndGraphStatus, 
                    300:                   0, yHeight - yStatusHeight - yLegendHeight,
                    301:                   xWidth, yStatusHeight,
                    302:                   TRUE) ;
                    303:    WindowShow (hWndGraphStatus, bShowStatus) ;
                    304: 
                    305: 
                    306:    //=============================//
                    307:    // Update the legend window    //
                    308:    //=============================//
                    309: 
                    310:    if (bShowLegend)
                    311:       MoveWindow (hWndGraphLegend,
                    312:                   0, yHeight - yLegendHeight,
                    313:                   xWidth, yLegendHeight,
                    314:                   TRUE) ;
                    315:    WindowShow (hWndGraphLegend, bShowLegend) ;
                    316: 
                    317: 
                    318:    //=============================//
                    319:    // Update the display window   //
                    320:    //=============================//
                    321: 
                    322:    MoveWindow (hWndGraphDisplay,
                    323:                0, 0,
                    324:                xWidth, yHeight - yStatusHeight - yLegendHeight,
                    325:                TRUE) ;
                    326:    SizeGraphDisplayComponents (hWndGraphDisplay) ;
                    327:    WindowInvalidate (hWndGraphDisplay) ;
                    328:    WindowShow (hWndGraphDisplay, TRUE) ;
                    329:    }  // SizeGraphComponents
                    330: 
                    331: 

unix.superglobalmegacorp.com

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