cms.c
/*--------------------------------------------------------
CMS.C -- SPII MIC2 Calibrator Control Program
L. R. Erickson, Apr. 1994
--------------------------------------------------------*/
#include <windows.h>
#include <stdlib.h>
#include "cms.h"
// File Globals
static HANDLE statglobhCMSPrevInst ; // Need for prev instance check
// with message box.
static char statglobszSetupClass [] = "CMSSetupChild" ;
static char statglobszDataAcqClass [] = "CMSDataAcqChild" ;
static char statglobszOpsClass [] = "CMSOpsChild" ;
//*********** Start of WinMain **************************************
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
static char szFrameClass [] = "MdiFrame" ;
HANDLE hAccel ;
HWND hwndFrame, hwndClient ;
MSG msg ;
WNDCLASS wndclass ;
globhCMSInst = hInstance ;
statglobhCMSPrevInst = hPrevInstance ;
if (!hPrevInstance)
{
// Register the frame window class
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = FrameWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = COLOR_APPWORKSPACE + 1 ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szFrameClass ;
RegisterClass (&wndclass) ;
// Register the Setup child window class
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE ;
wndclass.lpfnWndProc = CMSSetupWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof (LOCALHANDLE) ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = statglobszSetupClass ;
RegisterClass (&wndclass) ;
// Register the Data Acquisiton child window class
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE ;
wndclass.lpfnWndProc = CMSDataAcqWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof (LOCALHANDLE) ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = statglobszDataAcqClass ;
RegisterClass (&wndclass) ;
// Register the Operation child window class
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE ;
wndclass.lpfnWndProc = CMSOpsWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof (LOCALHANDLE) ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = statglobszOpsClass ;
RegisterClass (&wndclass) ;
} // Endif !hPrevInstance
// Load accelerator table
hAccel = LoadAccelerators (globhCMSInst, "CMSAccel") ;
// Create the frame window
hwndFrame = CreateWindow (szFrameClass, "CMS Cal Control",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
hwndClient = GetWindow (hwndFrame, GW_CHILD) ;
ShowWindow (hwndFrame, SW_SHOWMAXIMIZED) ;
UpdateWindow (hwndFrame) ;
// Enter the MDI modified message loop
while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel (hwndClient, &msg) &&
!TranslateAccelerator (hwndFrame, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return msg.wParam ;
}
//*********** End of WinMain **************************************
//*********** Start of FrameWndProc **********************************
long FAR PASCAL _export FrameWndProc (HWND hwnd, UINT message, UINT wParam,
LONG lParam)
{
static HWND hwndClient ;
static cxChild ;
static cyChild ;
CLIENTCREATESTRUCT clientcreate ;
FARPROC lpfnEnum ;
HWND hwndChild ;
MDICREATESTRUCT mdicreate ;
RECT rect ;
HDC hdc ;
TEXTMETRIC tm ;
switch (message)
{
case WM_CREATE: // Create the client window
// Have to wait till here to bail out if other
// copy 'cause need an hwnd to pop a message box.
if (statglobhCMSPrevInst)
{
MessageBox (hwnd,
"Only one CMS program can run at a time!",
"CMS Calibrator Control",
MB_ICONEXCLAMATION | MB_OK) ;
PostQuitMessage (0) ;
return 0 ;
}
clientcreate.hWindowMenu = NULL ;
clientcreate.idFirstChild = IDM_FIRSTCHILD ;
hwndClient = CreateWindow ("MDICLIENT", NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
0, 0, 0, 0, hwnd, 1, globhCMSInst,
(LPSTR) &clientcreate) ;
// Get system fixed font size
hdc = GetDC (hwnd) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
GetTextMetrics (hdc, &tm) ;
globcxCharSpace = tm.tmAveCharWidth ;
globcyCharSpace = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc) ;
//Set up time
SetInternational () ;
//Start a timer
SetTimer (hwnd, ID_CLOCKTIMER, 1000, NULL) ;
// Start Setup window
PostMessage (hwnd, WM_COMMAND, ID_MAKESETUPWIN, 0L) ;
// Find out how many data points.
SetNumDataPts () ;
return 0 ;
case WM_COMMAND:
switch (wParam)
{
case ID_MAKESETUPWIN: // Create a Data Display
// child window
// Get startup client size
GetClientRect (hwndClient, &rect) ;
cxChild = rect.right - (NUM_WINDOWS *
(3 * globcxCharSpace)) ;
cyChild = rect.bottom - (NUM_WINDOWS *
(( 3 * globcyCharSpace) / 2)) ;
mdicreate.szClass = statglobszSetupClass ;
mdicreate.szTitle = "CMS Startup" ;
mdicreate.hOwner = globhCMSInst ;
mdicreate.x = (SETUP_WIN_NUM -1) *
( 2 * globcxCharSpace) ;
mdicreate.y = (SETUP_WIN_NUM -1) * globcyCharSpace ;
mdicreate.cx = cxChild ;
mdicreate.cy = cyChild ;
mdicreate.style = 0 ;
mdicreate.lParam = NULL ;
hwndChild = (HWND) SendMessage (hwndClient,
WM_MDICREATE, 0,
(long) (LPMDICREATESTRUCT) &mdicreate) ;
return 0 ;
case ID_MAKEDATAWIN: // Create a Data Display
// child window
mdicreate.szClass = statglobszDataAcqClass ;
mdicreate.szTitle = "Data Display" ;
mdicreate.hOwner = globhCMSInst ;
mdicreate.x = (DATAACQ_WIN_NUM -1) *
(2 * globcxCharSpace) ;
mdicreate.y = (DATAACQ_WIN_NUM -1) * globcyCharSpace ;
mdicreate.cx = cxChild ;
mdicreate.cy = cyChild ;
mdicreate.style = 0 ;
mdicreate.lParam = NULL ;
hwndChild = (HWND) SendMessage (hwndClient,
WM_MDICREATE, 0,
(long) (LPMDICREATESTRUCT) &mdicreate) ;
return 0 ;
case ID_MAKEOPSWIN: // Create a Operation
// child window
mdicreate.szClass = statglobszOpsClass ;
mdicreate.szTitle = "Operation" ;
mdicreate.hOwner = globhCMSInst ;
mdicreate.x = (OPS_WIN_NUM - 1) *
(2 * globcxCharSpace) ;
mdicreate.y = (OPS_WIN_NUM - 1) * globcyCharSpace ;
mdicreate.cx = cxChild ;
mdicreate.cy = cyChild ;
mdicreate.style = 0 ;
mdicreate.lParam = NULL ;
hwndChild = (HWND) SendMessage (hwndClient,
WM_MDICREATE, 0,
(long) (LPMDICREATESTRUCT) &mdicreate) ;
return 0 ;
// Messages for arranging windows
case IDM_TILE:
SendMessage (hwndClient, WM_MDITILE,
MDITILE_HORIZONTAL, 0L) ;
return 0 ;
case IDM_CASCADE:
SendMessage (hwndClient, WM_MDICASCADE, 0, 0L) ;
return 0 ;
case IDM_ARRANGE:
SendMessage (hwndClient, WM_MDIICONARRANGE, 0, 0L) ;
return 0 ;
default: // Pass to active child
hwndChild = LOWORD (SendMessage (hwndClient,
WM_MDIGETACTIVE, 0, 0L)) ;
if (IsWindow (hwndChild))
SendMessage (hwndChild, WM_COMMAND,
wParam, lParam) ;
break ; // and then to DefFrameProc
}
break ;
case WM_QUERYENDSESSION:
case WM_CLOSE:
// See if really want to quit.
if (IDOK != MessageBox (hwnd,
"Really want to quit CMS program?",
"CMS Calibrator Control",
MB_ICONQUESTION | MB_OKCANCEL
| MB_DEFBUTTON2))
return 0 ;
// Give children a chance to clean up after themselves.
lpfnEnum = MakeProcInstance ((FARPROC) CloseEnumProc,
globhCMSInst) ;
EnumChildWindows (hwndClient, lpfnEnum, 0L) ;
FreeProcInstance (lpfnEnum) ;
if (NULL != GetWindow (hwndClient, GW_CHILD))
return 0 ;
break ; // ie, call DefFrameProc ;
case WM_DESTROY :
KillTimer (hwnd, ID_CLOCKTIMER) ;
PostQuitMessage (0) ;
return 0 ;
case WM_TIMER :
UpdateCMSTime (hwnd) ;
return 0 ;
}
// Pass unprocessed messages to DefFrameProc (not DefWindowProc)
return DefFrameProc (hwnd, hwndClient, message, wParam, lParam) ;
}
//*********** End of FrameWndProc **********************************
//*********** Start of CloseEnumProc *************************************
BOOL FAR PASCAL _export CloseEnumProc (HWND hwnd, LONG lParam)
{
if (GetWindow (hwnd, GW_OWNER)) // check for icon title
return 1 ;
SendMessage (GetParent (hwnd), WM_MDIRESTORE, hwnd, 0L) ;
if (!SendMessage (hwnd, WM_QUERYENDSESSION, 0, 0L))
return 1 ;
SendMessage (GetParent (hwnd), WM_MDIDESTROY, hwnd, 0L) ;
return 1 ;
}
//*********** End of CloseEnumProc *************************************