248 lines
7.3 KiB
C
248 lines
7.3 KiB
C
|
/*****************************************************************************
|
||
|
*
|
||
|
* Graph.c - This module handles the graphing window.
|
||
|
*
|
||
|
* Microsoft Confidential
|
||
|
* Copyright (c) 1992-1993 Microsoft Corporation
|
||
|
*
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
/*
|
||
|
File Contents:
|
||
|
|
||
|
This file contains the code for creating and manipulating the graph
|
||
|
window. This window is a child of hWndMain and represents one of the
|
||
|
three "views" of the program. The other views are log and alert.
|
||
|
|
||
|
The graph window is actually just a container window, whose surface
|
||
|
is completely filled by its children: hWndGraphLegend and hWndGraphStatus.
|
||
|
Therefore much of this file is merely calls to the appropriate
|
||
|
functions for these children.
|
||
|
|
||
|
The graph window is responsible for the graph structure itself,
|
||
|
however. Conceptually this should be instance data for the graph
|
||
|
window. Right now, however, there is only one window and only one
|
||
|
graph structure. Nevertheless, we go through the GraphData(hWnd)
|
||
|
function to get a pointer to the graph structure for the graph window.
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
//==========================================================================//
|
||
|
// Includes //
|
||
|
//==========================================================================//
|
||
|
|
||
|
|
||
|
#include "setedit.h"
|
||
|
#include "graph.h"
|
||
|
#include "legend.h"
|
||
|
// #include "valuebar.h"
|
||
|
#include "utils.h" // for WindowShow
|
||
|
#include "grafdata.h" // for InsertGraph, et al.
|
||
|
|
||
|
|
||
|
//==========================================================================//
|
||
|
// Constants //
|
||
|
//==========================================================================//
|
||
|
|
||
|
|
||
|
//=============================//
|
||
|
// Graph Class //
|
||
|
//=============================//
|
||
|
|
||
|
|
||
|
TCHAR szGraphWindowClass[] = TEXT("PerfmonGraphClass") ;
|
||
|
#define dwGraphClassStyle (CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS)
|
||
|
#define iGraphClassExtra (0)
|
||
|
#define iGraphWindowExtra (0)
|
||
|
#define dwGraphWindowStyle (WS_CHILD)
|
||
|
|
||
|
|
||
|
|
||
|
//==========================================================================//
|
||
|
// Local Functions //
|
||
|
//==========================================================================//
|
||
|
|
||
|
|
||
|
void static OnCreate (HWND hWnd)
|
||
|
{ // OnCreate
|
||
|
// hWndGraphDisplay = CreateGraphDisplayWindow (hWnd) ;
|
||
|
InsertGraph(0) ;
|
||
|
hWndGraphLegend = CreateGraphLegendWindow (hWnd) ;
|
||
|
// hWndGraphStatus = CreateGraphStatusWindow (hWnd) ;
|
||
|
} // OnCreate
|
||
|
|
||
|
|
||
|
void static OnPaint (HWND hWnd)
|
||
|
{
|
||
|
HDC hDC ;
|
||
|
PAINTSTRUCT ps ;
|
||
|
|
||
|
hDC = BeginPaint (hWnd, &ps) ;
|
||
|
EndPaint (hWnd, &ps) ;
|
||
|
}
|
||
|
|
||
|
|
||
|
void static OnSize (HWND hWnd, int xWidth, int yHeight)
|
||
|
{ // OnSize
|
||
|
SizeGraphComponents (hWnd) ;
|
||
|
} // OnSize
|
||
|
|
||
|
|
||
|
//==========================================================================//
|
||
|
// Message Handlers //
|
||
|
//==========================================================================//
|
||
|
|
||
|
|
||
|
|
||
|
LRESULT
|
||
|
APIENTRY
|
||
|
GraphWndProc (
|
||
|
HWND hWnd,
|
||
|
UINT wMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{ // GraphWndProc
|
||
|
BOOL bCallDefProc ;
|
||
|
LRESULT lReturnValue ;
|
||
|
|
||
|
|
||
|
bCallDefProc = FALSE ;
|
||
|
lReturnValue = 0L ;
|
||
|
|
||
|
switch (wMsg) { // switch
|
||
|
case WM_CREATE:
|
||
|
OnCreate (hWnd) ;
|
||
|
break ;
|
||
|
|
||
|
case WM_LBUTTONDBLCLK:
|
||
|
SendMessage (hWndMain, WM_LBUTTONDBLCLK, wParam, lParam) ;
|
||
|
break ;
|
||
|
|
||
|
case WM_PAINT:
|
||
|
OnPaint (hWnd) ;
|
||
|
break ;
|
||
|
|
||
|
case WM_SIZE:
|
||
|
OnSize (hWnd, LOWORD (lParam), HIWORD (lParam)) ;
|
||
|
break ;
|
||
|
|
||
|
default:
|
||
|
bCallDefProc = TRUE ;
|
||
|
} // switch
|
||
|
|
||
|
|
||
|
if (bCallDefProc)
|
||
|
lReturnValue = DefWindowProc (hWnd, wMsg, wParam, lParam) ;
|
||
|
|
||
|
return (lReturnValue);
|
||
|
} // GraphWndProc
|
||
|
|
||
|
|
||
|
|
||
|
BOOL GraphInitializeApplication (void)
|
||
|
/*
|
||
|
Note: There is no background brush set for the MainWindow
|
||
|
class so that the main window is never erased. The
|
||
|
client area of MainWindow is always covered by one
|
||
|
of the view windows. If we erase it, it would just
|
||
|
flicker needlessly.
|
||
|
*/
|
||
|
{ // GraphInitializeApplication
|
||
|
BOOL bSuccess ;
|
||
|
WNDCLASS wc ;
|
||
|
|
||
|
//=============================//
|
||
|
// Register GraphWindow class //
|
||
|
//=============================//
|
||
|
|
||
|
|
||
|
wc.style = dwGraphClassStyle ;
|
||
|
wc.lpfnWndProc = GraphWndProc ;
|
||
|
wc.hInstance = hInstance ;
|
||
|
wc.cbClsExtra = iGraphWindowExtra ;
|
||
|
wc.cbWndExtra = iGraphClassExtra ;
|
||
|
wc.hIcon = NULL ;
|
||
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW) ;
|
||
|
wc.hbrBackground = NULL ; // see note above
|
||
|
wc.lpszMenuName = NULL ;
|
||
|
wc.lpszClassName = szGraphWindowClass ;
|
||
|
|
||
|
bSuccess = RegisterClass (&wc) ;
|
||
|
|
||
|
|
||
|
//=============================//
|
||
|
// Register Child classes //
|
||
|
//=============================//
|
||
|
|
||
|
// if (bSuccess)
|
||
|
// bSuccess = GraphDisplayInitializeApplication () ;
|
||
|
|
||
|
if (bSuccess)
|
||
|
bSuccess = GraphLegendInitializeApplication () ;
|
||
|
|
||
|
// if (bSuccess)
|
||
|
// bSuccess = GraphStatusInitializeApplication () ;
|
||
|
|
||
|
return (bSuccess) ;
|
||
|
} // GraphInitializeApplication
|
||
|
|
||
|
|
||
|
HWND CreateGraphWindow (HWND hWndParent)
|
||
|
/*
|
||
|
Effect: Create the graph window. This window is a child of
|
||
|
hWndMain and is a container for the graph data,
|
||
|
graph label, graph legend, and graph status windows.
|
||
|
|
||
|
Note: We dont worry about the size here, as this window
|
||
|
will be resized whenever the main window is resized.
|
||
|
|
||
|
*/
|
||
|
{
|
||
|
return (CreateWindow (szGraphWindowClass, // window class
|
||
|
NULL, // caption
|
||
|
dwGraphWindowStyle, // style for window
|
||
|
0, 0, // initial position
|
||
|
0, 0, // initial size
|
||
|
hWndParent, // parent
|
||
|
NULL, // menu
|
||
|
hInstance, // program instance
|
||
|
NULL)) ; // user-supplied data
|
||
|
}
|
||
|
|
||
|
|
||
|
void SizeGraphComponents (HWND hWnd)
|
||
|
/*
|
||
|
Effect: Move and show the various components of the graph to
|
||
|
fill the size (xWidth x yHeight).
|
||
|
|
||
|
Called By: OnSize, any other function that may remove or add one
|
||
|
of the graph components.
|
||
|
*/
|
||
|
{ // SizeGraphComponents
|
||
|
RECT rectClient ;
|
||
|
int xWidth ;
|
||
|
int yHeight ;
|
||
|
|
||
|
GetClientRect (hWnd, &rectClient) ;
|
||
|
xWidth = rectClient.right - rectClient.left ;
|
||
|
yHeight = rectClient.bottom - rectClient.top ;
|
||
|
|
||
|
// if the graph window has no size, neither will its children.
|
||
|
if (!xWidth || !yHeight)
|
||
|
return ;
|
||
|
|
||
|
//=============================//
|
||
|
// Update the legend window //
|
||
|
//=============================//
|
||
|
|
||
|
MoveWindow (hWndGraphLegend,
|
||
|
0, 0,
|
||
|
xWidth, yHeight,
|
||
|
TRUE) ;
|
||
|
WindowShow (hWndGraphLegend, TRUE) ;
|
||
|
} // SizeGraphComponents
|
||
|
|
||
|
|