#include "windows.h" /* required for all Windows applications */ #include "kiviat.h" /* specific to this program */ #include #include #define PI 3.14159265359 #define FIX_WERTE 5 static int howoften= 1000, werte_anzahl = 5, max_tasks = 100; static long max_mem, largest_block; HANDLE hInst; /* current instance */ int MyTimer; static long LastCall; static HBRUSH hRed, hGreen, hYellow; int PASCAL WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow) HANDLE hInstance; /* current instance */ HANDLE hPrevInstance; /* previous instance */ LPSTR lpCmdLine; /* command line */ int nCmdShow; /* show-window type (open/icon) */ { MSG msg; /* message */ if (!hPrevInstance) /* Other instances of app running? */ if (!InitApplication(hInstance)) /* Initialize shared things */ return (FALSE); /* Exits if unable to initialize */ /* Perform initializations that apply to a specific instance */ if (!InitInstance(hInstance, nCmdShow)) return (FALSE); /* Acquire and dispatch messages until a WM_QUIT message is received. */ while (GetMessage(&msg, /* message structure */ NULL, /* handle of window receiving the message */ NULL, /* lowest message to examine */ NULL)) /* highest message to examine */ { TranslateMessage(&msg); /* Translates virtual key codes */ DispatchMessage(&msg); /* Dispatches message to window */ } return (msg.wParam); /* Returns the value from PostQuitMessage */ } BOOL InitApplication(hInstance) HANDLE hInstance; /* current instance */ { WNDCLASS wc; /* Fill in window class structure with parameters that describe the */ /* main window. */ wc.style = NULL; /* Class style(s). */ wc.lpfnWndProc = MainWndProc; /* Function to retrieve messages for */ /* windows of this class. */ wc.cbClsExtra = 0; /* No per-class extra data. */ wc.cbWndExtra = 0; /* No per-window extra data. */ wc.hInstance = hInstance; /* Application that owns the class. */ wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; /* Name of menu resource in .RC file. */ wc.lpszClassName = "kiviatWClass"; /* Name used in call to CreateWindow. */ /* Register the window class and return success/failure code. */ return (RegisterClass(&wc)); } BOOL InitInstance(hInstance, nCmdShow) HANDLE hInstance; /* Current instance identifier. */ int nCmdShow; /* Param for first ShowWindow() call. */ { HWND hWnd; /* Main window handle. */ HMENU hSysMenu; /* Save the instance handle in static variable, which will be used in */ /* many subsequence calls from this application to Windows. */ hInst = hInstance; /* Create a main window for this application instance. */ hWnd = CreateWindow( "kiviatWClass", /* See RegisterClass() call. */ "Kiviat Graph", /* Text for window title bar. */ WS_OVERLAPPEDWINDOW | WS_ICONIC | WS_SYSMENU | WS_MINIMIZE, CW_USEDEFAULT, /* Default horizontal position. */ CW_USEDEFAULT, /* Default vertical position. */ CW_USEDEFAULT, /* Default width. */ CW_USEDEFAULT, /* Default height. */ NULL, /* Overlapped windows have no parent. */ NULL, /* Use the window class menu. */ hInstance, /* This instance owns this window. */ NULL /* Pointer not needed. */ ); /* If window could not be created, return "failure" */ if (!hWnd) return (FALSE); /* Make the window visible; update its client area; and return "success" */ hRed = CreateSolidBrush(RGB(255,0,0)); hGreen = CreateSolidBrush(RGB(0,255,0)); hYellow = CreateSolidBrush(RGB(255,255,0)); hSysMenu = GetSystemMenu(hWnd, FALSE); AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hSysMenu, MF_STRING, IDM_ABOUT, "About Kiviat"); AppendMenu(hSysMenu, MF_STRING, IDM_SETUP, "Setup..."); /* Initialize Variables */ max_mem = 1024l * (long)GetProfileInt(APPNAME, "MaxMem", 1024); howoften = GetProfileInt(APPNAME, "SampleRate", 1000); werte_anzahl = FIX_WERTE + GetProfileInt(APPNAME, "HardDrives", 1); max_tasks = GetProfileInt(APPNAME, "MaxTasks", 50); largest_block= 1024l * (long)GetProfileInt(APPNAME, "LargestBlock", 1024); LastCall = GetTickCount(); MyTimer = SetTimer(hWnd, 1, howoften, NULL); ShowWindow(hWnd, SW_MINIMIZE); /* Show the window */ UpdateWindow(hWnd); /* Sends WM_PAINT message */ return (TRUE); /* Returns the value from PostQuitMessage */ } static double GetSysInfo(int which) { static long all; switch (which) { case 0: /* Get Free Memory */ { long above, below; above = GetFreeSpace(GMEM_NOT_BANKED); below = GetFreeSpace(0); all = (above != below) ? above + below : below; return((double)all / (double)max_mem); } case 1: /* Largest Free Block */ { long n; n = GlobalCompact(0l); if (n > largest_block) return(1.0); else return((double)n / (double)largest_block); } case 2: /* Ticks */ { long NowCall, CallDiff; NowCall = GetTickCount(); CallDiff = NowCall - LastCall; return((double) howoften / (double)CallDiff); } case 3: /* Disk I/O Time */ { long start; int f; start = -GetTickCount(); f = _lcreat("kiviat.tmp", OF_WRITE | OF_SHARE_DENY_NONE); _lwrite(f, (LPSTR)"Kiviat - Graph, by Wolfgang Tremmel", 34); _lclose(f); unlink("kiviat.tmp"); start += GetTickCount(); start /= 300; return(1.0 / (double)(1+start)); } case 4: /* Tasks */ return((max_tasks - GetNumTasks()) / 100.0); default: /* Filespace on x */ { struct diskfree_t df; _dos_getdiskfree(which-2, &df); return((double)df.avail_clusters / (double)df.total_clusters); } } } static KiviatGraph(HWND hWnd) { HDC hDC, hDCw; PAINTSTRUCT paint; RECT winrect; int i; HRGN hRgn; HBITMAP hBitmap, hOldBitmap; double a= 0.0, b = 1.0; double *ww; ww = (double *) malloc(sizeof(double) * werte_anzahl); for (i = 0; i < werte_anzahl; i++) *(ww+i) = GetSysInfo(i); GetClientRect(hWnd, (LPRECT)&winrect); /* InvalidateRect(hWnd,(LPRECT)&winrect, TRUE); */ hDCw = GetDC(hWnd); hDC = CreateCompatibleDC(hDCw); hBitmap = CreateCompatibleBitmap(hDCw, winrect.right, winrect.bottom); hOldBitmap = SelectObject(hDC, hBitmap); PatBlt(hDC, 0, 0, winrect.right, winrect.bottom, WHITENESS); /* hDC = BeginPaint(hWnd, (LPPAINTSTRUCT)&paint); */ Ellipse(hDC, winrect.left, winrect.top, winrect.right, winrect.bottom); for (i = 0; i < werte_anzahl; i++) { int x1,y1, x2, y2, x3, y3, x4, y4; double w; /* MoveTo(hDC, (winrect.right-winrect.left)/2, (winrect.bottom-winrect.top)/2); */ /* w = GetSysInfo(i); */ w = *(ww + i); if (w > 0.75) SelectObject(hDC, hGreen); else if (w > 0.4) SelectObject(hDC, hYellow); else SelectObject(hDC, hRed); x1 = (winrect.right - (int)(winrect.right * w)) / 2; y1 = (winrect.bottom- (int)(winrect.bottom* w)) / 2; x2 = winrect.right - x1; y2 = winrect.bottom - y1; x3 = (int)((winrect.right*2) * a); /* (sin((2*PI/werte_anzahl)*i))); */ y3 = (int)((winrect.bottom*2) * b); /* (cos((2*PI/werte_anzahl)*i))); */ x4 = (int)((winrect.right*2) * (a = sin((2*PI/werte_anzahl)*(i+1)))); y4 = (int)((winrect.bottom*2) * (b = cos((2*PI/werte_anzahl)*(i+1)))); Pie(hDC, x1, y1, x2, y2, x3, y3, x4, y4); } BitBlt(hDCw, 0, 0, winrect.right, winrect.bottom, hDC, 0, 0, SRCCOPY); SelectObject(hDC, hOldBitmap); DeleteDC(hDC); ReleaseDC(hWnd, hDCw); DeleteObject(hBitmap); free(ww); /* EndPaint(hWnd, (LPPAINTSTRUCT)&paint); */ } long FAR PASCAL MainWndProc(hWnd, message, wParam, lParam) HWND hWnd; /* window handle */ unsigned message; /* type of message */ WORD wParam; /* additional information */ LONG lParam; /* additional information */ { FARPROC lpProc; /* pointer to the "About" function */ switch (message) { case WM_SYSCOMMAND: /* message: command from application menu */ switch(wParam) { case IDM_ABOUT: lpProc = MakeProcInstance(About, hInst); DialogBox(hInst, "AboutBox", hWnd, lpProc); FreeProcInstance(lpProc); break; case IDM_SETUP: lpProc = MakeProcInstance(Setup, hInst); DialogBox(hInst, "Setup", hWnd, lpProc); FreeProcInstance(lpProc); break; default: return (DefWindowProc(hWnd, message, wParam, lParam)); } break; /* case WM_PAINT: LastCall = GetTickCount(); */ case WM_TIMER: KillTimer(hWnd, 1); KiviatGraph(hWnd); MyTimer = SetTimer(hWnd, 1, howoften, NULL); LastCall = GetTickCount(); PostMessage(hWnd, WM_COMMAND, 9999, LastCall); break; case WM_DESTROY: /* message: window being destroyed */ PostQuitMessage(0); break; default: /* Passes it on if unproccessed */ return (DefWindowProc(hWnd, message, wParam, lParam)); } return (NULL); } BOOL FAR PASCAL About(hDlg, message, wParam, lParam) HWND hDlg; /* window handle of the dialog box */ unsigned message; /* type of message */ WORD wParam; /* message-specific information */ LONG lParam; { switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ return (TRUE); case WM_COMMAND: /* message: received a command */ if (wParam == IDOK /* "OK" box selected? */ || wParam == IDCANCEL) { /* System menu close command? */ EndDialog(hDlg, TRUE); /* Exits the dialog box */ return (TRUE); } break; } return (FALSE); /* Didn't process a message */ } BOOL FAR PASCAL Setup(hDlg, message, wParam, lParam) HWND hDlg; /* window handle of the dialog box */ unsigned message; /* type of message */ WORD wParam; /* message-specific information */ LONG lParam; { switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ SetDlgItemInt(hDlg, IDC_MEMORY, (int)(max_mem / 1024l), FALSE); SetDlgItemInt(hDlg, IDC_TIME, howoften, FALSE); SetDlgItemInt(hDlg, IDC_DRIVES, werte_anzahl - FIX_WERTE, FALSE); SetDlgItemInt(hDlg, IDC_TASKS, max_tasks, FALSE); SetDlgItemInt(hDlg, IDC_BLOCK, (int)(largest_block / 1024l), FALSE); return (TRUE); case WM_COMMAND: /* message: received a command */ if (wParam == IDOK) { BOOL ok; int t; char s[10]; t = GetDlgItemInt(hDlg, IDC_MEMORY, (BOOL FAR *)&ok, FALSE); if (ok) { sprintf(s,"%d",t); WriteProfileString(APPNAME,"MaxMem",(LPSTR)s); max_mem = 1024l * (long)t; } t = GetDlgItemInt(hDlg, IDC_BLOCK, (BOOL FAR *)&ok, FALSE); if (ok) { sprintf(s,"%d",t); WriteProfileString(APPNAME,"LargestBlock",(LPSTR)s); largest_block = 1024l * (long)t; } t = GetDlgItemInt(hDlg, IDC_TIME, (BOOL FAR *)&ok, FALSE); if (ok) { sprintf(s,"%d",t); WriteProfileString(APPNAME,"SampleRate",(LPSTR)s); howoften = t; } t = GetDlgItemInt(hDlg, IDC_DRIVES, (BOOL FAR *)&ok, FALSE); if (ok) { sprintf(s,"%d",t); WriteProfileString(APPNAME,"HardDrives",(LPSTR)s); werte_anzahl = t + FIX_WERTE; } t = GetDlgItemInt(hDlg, IDC_TASKS, (BOOL FAR *)&ok, FALSE); if (ok) { sprintf(s,"%d",t); WriteProfileString(APPNAME,"MaxTasks",(LPSTR)s); max_tasks = t; } EndDialog(hDlg, TRUE); return(TRUE); } else if (wParam == IDCANCEL) { EndDialog(hDlg, FALSE); return(TRUE); } break; } return (FALSE); /* Didn't process a message */ }