GRAPH.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

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