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

Windows编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  *
  3.  *  Perfmon.c - This is the WinMain module. It creates the main window and
  4.  *              the threads, and contains the main MainWndProc.
  5.  *
  6.  *  Microsoft Confidential
  7.  *  Copyright (c) 1992-1997 Microsoft Corporation
  8.  *
  9.  *  Authors -
  10.  *
  11.  *       Russ Blake
  12.  *       Mike Moskowitz
  13.  *       Hon-Wah Chan
  14.  *       Bob Watson
  15.  *
  16.  ****************************************************************************/
  17. //==========================================================================//
  18. //                                  Includes                                //
  19. //==========================================================================//
  20. #undef NOSYSCOMMANDS
  21. // DEFINE_GLOBALS will define all the globals listed in globals.h
  22. #define DEFINE_GLOBALS
  23. #include "perfmon.h"
  24. #include "command.h"
  25. #include "graph.h"
  26. #include "log.h"
  27. #include "alert.h"
  28. #include "report.h"     // for CreateReportWindow
  29. #include "legend.h"
  30. #include "init.h"
  31. #include "perfmops.h"
  32. #include "toolbar.h"    // for CreateToolbar
  33. #include "status.h"     // for CreatePMStatusWindow
  34. #include "utils.h"
  35. #include "fileopen.h"   // for FileOpen
  36. #define dwToolbarStyle     (WS_CHILD | WS_VISIBLE | TBS_NOCAPTION)
  37. extern TCHAR szInternational[] ;
  38. //==========================================================================//
  39. //                              Message Handlers                            //
  40. //==========================================================================//
  41. void static OnSize (HWND hWnd,
  42.                     WORD xWidth,
  43.                     WORD yHeight)
  44. /*
  45.    Effect:        Perform any actions needed when the main window is
  46.                   resized. In particular, size the four data windows,
  47.                   only one of which is visible right now.
  48. */
  49.    {  // OnSize
  50.    SizePerfmonComponents () ;
  51.    }
  52. void static OnCreate (HWND hWnd)
  53. /*
  54.    Effect:        Perform all actions needed when the main window is
  55.                   created. In particular, create the three data windows,
  56.                   and show one of them.
  57.    To Do:         Check for proper creation. If not possible, we will
  58.                   need to abort creation of the program.
  59.    Called By:     MainWndProc only, in response to a WM_CREATE message.
  60. */
  61.    {  // OnCreate
  62.    hWndGraph = CreateGraphWindow (hWnd) ;
  63. #ifdef ADVANCED_PERFMON
  64.    hWndLog = CreateLogWindow (hWnd) ;
  65.    hWndAlert = CreateAlertWindow (hWnd) ;
  66.    hWndReport = CreateReportWindow (hWnd) ;
  67. #endif
  68.    hWndStatus = CreatePMStatusWindow (hWnd) ;
  69.    CreateToolbarWnd (hWnd) ;
  70.    MinimumSize += WindowHeight (hWndToolbar) ;
  71.    Options.bMenubar = TRUE ;
  72.    Options.bToolbar = TRUE ;
  73.    Options.bStatusbar = TRUE;
  74.    Options.bAlwaysOnTop = FALSE ;
  75.    // initialize to chart view - HWC
  76.    iPerfmonView = IDM_VIEWCHART;
  77.    ShowWindow (PerfmonViewWindow (), SW_SHOWNORMAL) ;
  78.    }  // OnCreate
  79. //==========================================================================//
  80. //                             Exported Functions                           //
  81. //==========================================================================//
  82. void MenuBarHit (DWORD wParam)
  83. {
  84.    if (wParam == MENUCLOSING)
  85.       {
  86.       StatusLineReady (hWndStatus) ;
  87.       dwCurrentMenuID = 0 ;
  88.       }
  89.    else if (HIWORD(wParam) & MF_SYSMENU)
  90.       {
  91.       WORD   SystemMenuItem = 0 ;
  92.       switch (LOWORD (wParam))
  93.          {
  94.          case SC_RESTORE:
  95.             SystemMenuItem = IDM_SYSTEMRESTORE ;
  96.             break ;
  97.          case SC_SIZE:
  98.             SystemMenuItem = IDM_SYSTEMSIZE ;
  99.             break ;
  100.          case SC_MOVE:
  101.             SystemMenuItem = IDM_SYSTEMMOVE ;
  102.             break ;
  103.          case SC_MINIMIZE:
  104.             SystemMenuItem = IDM_SYSTEMMINIMIZE ;
  105.             break ;
  106.          case SC_MAXIMIZE:
  107.             SystemMenuItem = IDM_SYSTEMMAXIMIZE ;
  108.             break ;
  109.          case SC_CLOSE:
  110.             SystemMenuItem = IDM_SYSTEMCLOSE ;
  111.             break ;
  112.          case SC_TASKLIST:
  113.             SystemMenuItem = IDM_SYSTEMSWITCHTO ;
  114.             break ;
  115.          }
  116.       if (SystemMenuItem)
  117.          {
  118.          StatusLine (hWndStatus, SystemMenuItem) ;
  119.          dwCurrentMenuID = MenuIDToHelpID (SystemMenuItem) ;
  120.          }
  121.       }
  122.    else
  123.       {
  124.       StatusLine (hWndStatus, LOWORD (wParam)) ;
  125.       }
  126. }
  127. void OnDropFile (DWORD wParam)
  128.    {
  129.    TCHAR FileName [FilePathLen + 1] ;
  130.    LPTSTR         pFileNameStart ;
  131.    HANDLE         hFindFile ;
  132.    WIN32_FIND_DATA FindFileInfo ;
  133.    int            NameOffset ;
  134.    int            NumOfFiles = 0 ;
  135.    NumOfFiles = DragQueryFile ((HDROP) wParam, 0xffffffff, NULL, 0) ;
  136.    if (NumOfFiles > 0)
  137.       {
  138.       // we only open the first file for now
  139.       DragQueryFile((HDROP) wParam, 0, FileName, FilePathLen) ;
  140.       pFileNameStart = ExtractFileName (FileName) ;
  141.       NameOffset = pFileNameStart - FileName ;
  142.       // convert short filename to long NTFS filename if necessary
  143.       hFindFile = FindFirstFile (FileName, &FindFileInfo) ;
  144.       if (hFindFile && hFindFile != INVALID_HANDLE_VALUE)
  145.          {
  146.          // append the file name back to the path name
  147.          lstrcpy (&FileName[NameOffset], FindFileInfo.cFileName) ;
  148.          FindClose (hFindFile) ;
  149.          }
  150.       FileOpen (hWndMain, (int)0, (LPTSTR)FileName) ;
  151.       PrepareMenu (GetMenu (hWndMain));
  152.       }
  153.    DragFinish ((HDROP) wParam) ;
  154.    }
  155. LRESULT APIENTRY MainWndProc (HWND hWnd, 
  156.                               UINT message, 
  157.                               DWORD wParam, 
  158.                               LONG lParam)
  159.    {
  160.    LONG     lRetCode = 0L ;
  161.    BOOL     bCallDefWinProc = FALSE ;
  162.    switch (LOWORD (message))
  163.       {  // switch
  164.       case WM_LBUTTONDBLCLK:
  165.          ShowPerfmonMenu (!Options.bMenubar) ;
  166.          if (Options.bMenubar)
  167.             {
  168.             PrepareMenu (GetMenu (hWnd)) ;
  169.             }
  170.          break ;
  171.    case WM_COMMAND:
  172.       if (PerfmonCommand (hWnd,wParam,lParam))
  173.          return(0);
  174.          else
  175.             bCallDefWinProc = TRUE ;
  176.          break;
  177.       case WM_MENUSELECT:
  178.          MenuBarHit (wParam) ;
  179.          break ;
  180.       case WM_NCHITTEST:
  181.         /* if we have no title/menu bar, clicking and dragging the client
  182.          * area moves the window. To do this, return HTCAPTION.
  183.          * Note dragging not allowed if window maximized, or if caption
  184.          * bar is present.
  185.          */
  186.         wParam = DefWindowProc(hWnd, message, wParam, lParam);
  187.         if (!Options.bMenubar && 
  188.             (wParam == HTCLIENT) &&
  189.             !IsZoomed (hWndMain))
  190.            return HTCAPTION ;
  191.         else
  192.            return wParam ;
  193.         break ;
  194.       
  195.       case WM_SHOWWINDOW:
  196.          PrepareMenu (GetMenu (hWnd)) ;
  197.          break ;
  198.       case WM_SIZE:
  199.          OnSize (hWnd, LOWORD (lParam), HIWORD (lParam)) ;
  200.          break ;
  201.       case WM_GETMINMAXINFO:
  202.          {
  203.          MINMAXINFO   *pMinMax ;
  204.          pMinMax = (MINMAXINFO *) lParam ;
  205.          pMinMax->ptMinTrackSize.x = MinimumSize ;
  206.          pMinMax->ptMinTrackSize.y = MinimumSize ;
  207.          }
  208.          break ;
  209.       case WM_F1DOWN:
  210.          if (dwCurrentDlgID)
  211.             {
  212.             CallWinHelp (dwCurrentDlgID) ;
  213.             }
  214.          else if (dwCurrentMenuID)
  215.             {
  216.             CallWinHelp (dwCurrentMenuID) ;
  217.             dwCurrentMenuID = 0 ;
  218.             }
  219.          break ;
  220.       case WM_CREATE:
  221.          OnCreate (hWnd) ;
  222.          ViewChart (hWnd) ;
  223.          PrepareMenu (GetMenu (hWnd)) ;
  224.          break ;
  225.       case WM_DESTROY:
  226.          WinHelp (hWndMain, pszHelpFile, HELP_QUIT, 0) ;
  227.          PostQuitMessage (0);
  228.          break ;
  229.       case WM_QUERYENDSESSION:
  230.          // please shut it down
  231.          return (1) ;
  232.          break ;
  233.       case WM_ENDSESSION:
  234.          if (wParam == TRUE)
  235.             {
  236.             // close any log file before closing down
  237.             PerfmonClose (hWnd) ;
  238.             return (1) ;
  239.             }
  240.          else
  241.             bCallDefWinProc = TRUE ;
  242.          break ;
  243.       case WM_CLOSE:
  244.          PerfmonClose (hWnd) ;
  245.          break ;
  246.       case WM_ACTIVATE:
  247.          {
  248.          int   fActivate = LOWORD (wParam) ;
  249.          bPerfmonIconic = (BOOL) HIWORD (wParam) ;
  250.          if (bPerfmonIconic == 0 && fActivate != WA_INACTIVE)
  251.             {
  252.             // set focus on the Legend window
  253.             if (iPerfmonView == IDM_VIEWCHART)
  254.                {
  255.                SetFocus (hWndGraphLegend) ;
  256.                }
  257.             else if (iPerfmonView == IDM_VIEWALERT)
  258.                {
  259.                SetFocus (hWndAlertLegend) ;
  260.                }
  261.             else if (iPerfmonView == IDM_VIEWLOG)
  262.                {
  263.                SetFocus (hWndLogEntries) ;
  264.                }
  265.             else if (iPerfmonView == IDM_VIEWREPORT)
  266.                {
  267.                SetFocus (hWndReport) ;
  268.                }
  269.             }
  270.          }
  271.          break ;
  272.       case WM_SYSCOLORCHANGE:
  273.          DeletePerfmonSystemObjects () ;
  274.          CreatePerfmonSystemObjects () ;
  275.          WindowInvalidate (PerfmonViewWindow()) ;
  276.          break ;
  277.       case WM_WININICHANGE:
  278.          if (!lParam || strsamei((LPTSTR)lParam, szInternational))
  279.             {
  280.             GetDateTimeFormats () ;
  281.             }
  282.          break ;
  283.       case WM_DROPFILES:
  284.          OnDropFile (wParam) ;
  285.          return (0) ;
  286.          break ;
  287.       default:
  288.          bCallDefWinProc = TRUE ;
  289.       break;
  290.       }  // switch
  291.    if (bCallDefWinProc)
  292.       {
  293.       lRetCode = DefWindowProc (hWnd, message, wParam, lParam) ;
  294.       }
  295.    return (lRetCode);
  296.    }  // MainWndProc
  297. int PASCAL WinMain (HINSTANCE hCurrentInstance,
  298.              HINSTANCE hPrevInstance,
  299.                     LPSTR lpszCmdLine, 
  300.                     int nCmdShow)
  301.    {  // WinMain
  302.    MSG      msg;
  303.    if (!PerfmonInitialize (hCurrentInstance, hPrevInstance, 
  304.                            lpszCmdLine, nCmdShow))
  305.       return (FALSE) ;
  306.    DragAcceptFiles (hWndMain, TRUE) ;
  307.    while (GetMessage (&msg, NULL, 0, 0))
  308.       {
  309.       if (!TranslateAccelerator(hWndMain, hAccelerators, &msg))
  310.          {
  311.          TranslateMessage (&msg) ;
  312.          DispatchMessage (&msg) ;
  313.          }
  314.       }  // while
  315.    return(msg.wParam);
  316.    }
  317. DWORD FAR PASCAL MessageFilterProc (int nCode,
  318.                                     WPARAM wParam,
  319.                                     LPARAM lParam)
  320.    {
  321.    LPMSG lpMsg = (LPMSG)lParam ;
  322.    extern HHOOK lpMsgFilterProc ;
  323.    if (nCode < 0)
  324.       {
  325.       return FALSE ;
  326.       }
  327.    if (nCode == MSGF_DIALOGBOX || nCode == MSGF_MENU)
  328.       {
  329.       if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1)
  330.           {
  331.           PostMessage (hWndMain, WM_F1DOWN, nCode, 0L) ;
  332.           return TRUE ;
  333.           }
  334.       }
  335.    return (DefHookProc (nCode, wParam,
  336.               (DWORD)lpMsg,
  337.               &lpMsgFilterProc)) ;
  338.    }
  339. #if 0
  340. /***************************************/
  341. VOID ErrorExit(LPTSTR pszError,HWND hwnd)
  342. /***************************************/
  343. {
  344.     // NOTE: make sure all lgraph calls set StopQuerying.
  345.     if (hwnd)
  346.     {
  347.         MessageBox(NULL, pszError, nm_buf, MB_ICONHAND | MB_OK | MB_SYSTEMMODAL);
  348.         DestroyWindow(hwnd);
  349.     }
  350.     return;
  351. }
  352. #endif
  353. void SizePerfmonComponents (void) 
  354.    {
  355.    RECT           rectClient ;
  356.    int            xWidth, yHeight ;
  357.    int            yToolbarHeight ;
  358.    int            yStatusHeight ;
  359.    int            yViewHeight ;
  360.    GetClientRect (hWndMain, &rectClient) ;
  361.    xWidth = rectClient.right - rectClient.left ;
  362.    yHeight = rectClient.bottom - rectClient.top ;
  363.    if (Options.bToolbar)
  364.       {
  365.       SendMessage (hWndToolbar, WM_SIZE, 0, 0L) ;
  366.       }
  367.    yToolbarHeight = Options.bToolbar ? (WindowHeight (hWndToolbar) - 1) : 0 ;
  368.    yStatusHeight = Options.bStatusbar ? StatusHeight (hWndStatus) : 0 ;
  369.    if (Options.bStatusbar)
  370.       {
  371.       if (yToolbarHeight + yStatusHeight > yHeight)
  372.          {
  373.          // too small to display both toolbar and status bar
  374.          // just display part of the status bar
  375.          yStatusHeight = yHeight - yToolbarHeight ;
  376.          }
  377.       MoveWindow (hWndStatus, 
  378.                   0, yHeight - yStatusHeight, xWidth, yStatusHeight, TRUE) ;
  379.       //WindowInvalidate (hWndStatus) ;
  380.       }
  381.    //WindowInvalidate (hWndMain) ;
  382.    WindowShow (hWndStatus, Options.bStatusbar) ;
  383.    WindowShow (hWndToolbar, Options.bToolbar) ;
  384.    yViewHeight = yHeight - yStatusHeight - yToolbarHeight ;
  385.    MoveWindow (hWndGraph, 
  386.                0, yToolbarHeight, 
  387.                xWidth, yViewHeight, 
  388.                TRUE) ;
  389.    MoveWindow (hWndAlert, 
  390.                0, yToolbarHeight, 
  391.                xWidth, yViewHeight, 
  392.                TRUE) ;
  393.    MoveWindow (hWndLog, 
  394.                0, yToolbarHeight, 
  395.                xWidth, yViewHeight, 
  396.                TRUE) ;
  397.    MoveWindow (hWndReport, 
  398.                0, yToolbarHeight, 
  399.                xWidth, yViewHeight, 
  400.                TRUE) ;
  401.    }  // SizePerfmonComponents