/* ------------------------------ TOP.C ------------------------------
 *      Gestione della finestra principale
 * ---------------------------------------------------------------- */

#define STRICT

#include <Windows.h>
#include "dlg3.h"

/* -------------------------- wmActivate ----------------------------
 *      Elabora il messaggio WM_ACTIVATE
 * wParam                               Specifica se la finestra Š 
 *                                      stata attivata o disattivata.
 * hWndAltra = (HWND) LOWORD (lParam)   Identifica la finestra 
 *                                      attivata o disattivata.
 * bIconic   = (BOOL) HIWORD (lParam)   E' un valore diverso da 0
 *                                      se la finestra Š in icona.
 * Restituisce TRUE se messaggio elaborato, FALSE in caso contrario.
 * In questo caso, DefWindowProc viene chiamata e mette il focus.
 * ---------------------------------------------------------------- */

static BOOL wmActivate (HWND hWnd, WORD wParam, HWND hWndAltra, BOOL bIconic)
{
	// .... Elaborazione del messaggio .... 
	return FALSE;
}

/* -------------------------- wmClose -------------------------------
 *      Elabora il messaggio WM_CLOSE
 * Restituisce TRUE se messaggio elaborato, FALSE in caso contrario.
 * In questo caso, DefWindowProc viene chiamata e distrugge la 
 * finestra.
 * ---------------------------------------------------------------- */

static BOOL wmClose (HWND hWnd)
{
	// .... Elaborazione del messaggio .... 
	return FALSE;
}

/* -------------------------- wmCommand -----------------------------
 *      Elabora il messaggio WM_COMMAND
 * id      = wParam                   E' l'identificatore.
 * hCtl    = (HWND) LOWORD (lParam)   Identifica il controllo che
 *                                    invia il messaggio, se non
 *                                    proviene da un controllo
 *                                    questo parametro Š uguale a 0.
 * nNotify = HIWORD (lParam)          Messaggio di notifica, se il 
 *                                    msg. proviene da un acceleratore
 *                                    questo parametro Š uguale a 1
 *                                    se da un menu Š uguale a 0.
 * ---------------------------------------------------------------- */

static VOID wmCommand (HWND hWnd, int id, HWND hCtl, int nNotify)
{
char            szBuf[40];
FARPROC         lpOwnerDlgProc;         // Funzione Dialog
long FAR PASCAL OwnerDlgProc (HWND, unsigned, WORD, DWORD);
static VARIABLES        Variables = {2, 5, 283, 10, 10};
					// Variabili da ottenere

	switch (id)
	{
	case IDM_OWNER:
// ---- Creazione finestra di dialogo
	      lpOwnerDlgProc = MakeProcInstance ((FARPROC)OwnerDlgProc, 
						    hInst);
	      DialogBoxParam (hInst, MAKEINTRESOURCE (OWNERDLG), hWnd,
			      (DLGPROC)lpOwnerDlgProc, 
			      (DWORD)(LPVARIABLES)&Variables);
	      FreeProcInstance (lpOwnerDlgProc);
	      break;

	default:
	      wsprintf (szBuf, "Comando ricevuto: %d", id);
	      MessageBox (hWnd, szBuf, "Menu", MB_OK | MB_ICONEXCLAMATION);
	      break;
	}

	return;
}

/* -------------------------- wmCreate ------------------------------
 *      Elabora il messaggio WM_CREATE
 * lpCrst = (CREATESTRUCT FAR*) lParam   Punta ad una struttura 
 *                                       CREATESTRUCT.
 * ---------------------------------------------------------------- */

static VOID wmCreate (HWND hWnd, CREATESTRUCT FAR* lpCrst)
{
	hAccel = LoadAccelerators (hInst, MAKEINTRESOURCE (TOPACCEL));
	return;
}

/* -------------------------- wmDestroy -----------------------------
 *      Elabora il messaggio WM_DESTROY
 * ---------------------------------------------------------------- */

static VOID wmDestroy (HWND hWnd)
{
	PostQuitMessage (0);       // Per la finestra principale
	return;
}

/* -------------------------- wmEraseBkGnd --------------------------
 *      Elabora il messaggio WM_ERASEBKGND
 * hDC = (HDC) wParam   Identifica il device context.
 * Restituisce TRUE se lo sfondo Š stato cancellato,
 *          o FALSE per domandare la cancellazione standard.
 * ---------------------------------------------------------------- */

static BOOL wmEraseBkgnd (HWND hWnd, HDC hDC)
{
	// .... Elaborazione del messaggio .... 
	return FALSE;
}

/* -------------------------- wmHScroll -----------------------------
 *      Elabora il messaggio WM_HSCROLL
 * wCode = wParam                   Specifica un codice della barra 
 *                                  di scorrimento che indica la 
 *                                  richiesta dell'utente.
 * hCtl  = (HWND) HIWORD (lParam)   E' l'handle del controllo, se  
 *                                  il msg. viene da un controllo.
 * ---------------------------------------------------------------- */

static VOID wmHScroll (HWND hWnd, WORD wCode, HWND hCtl)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmInitMenu ----------------------------
 *      Elabora il messaggio WM_INITMENU
 * hMenu = (HMENU) wParam       Handle del menu da inizializzare.
 * ---------------------------------------------------------------- */

static VOID wmInitMenu (HWND hWnd, HMENU hMenu)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmKeyboard ----------------------------
 *      Elabora i messaggi WM_CHAR, WM_KEYDOWN e WM_KEYUP
 * ---------------------------------------------------------------- */

static VOID wmKeyboard (HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmKillFocus ---------------------------
 *      Elabora il messaggio WM_KILLFOCUS
 * hWndAltra= (HWND) wParam     Handle della finestra che riceve 
 *                              il focus.
 * ---------------------------------------------------------------- */

static VOID wmKillFocus (HWND hWnd, HWND hWndAltra)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmMenuSelect --------------------------
 *      Elabora il messaggio WM_MENUSELECT
 * wParam        id per un item, o hMenu per un popup.
 * Flags         Indica il contesto.
 * ---------------------------------------------------------------- */

static VOID wmMenuSelect (HWND hWnd, WORD wParam, WORD Flags)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmMouse -------------------------------
 *      Elabora i messaggi WM_MOUSEMOVE e WM_?BUTTON*
 * wMsg                  E' il messaggio.
 * wParam                Indica i tasti/pulsanti premuti.
 * x = LOWORD (lParam)   E' l'ascissa del puntatore.
 * y = HIWORD (lParam)   E' l'ordinata del puntatore.
 * ---------------------------------------------------------------- */

static VOID wmMouse (HWND hWnd, WORD wMsg, WORD wParam, int x, int y)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmMove --------------------------------
 *      Elabora il messaggio WM_MOVE
 * x = LOWORD (lParam) Š la nuova ascissa.
 * y = HIWORD (lParam) Š la nuova ordinata.
 * ---------------------------------------------------------------- */

static VOID wmMove (HWND hWnd, int x, int y)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmPaint -------------------------------
 *      Elabora il messaggio WM_PAINT
 * ---------------------------------------------------------------- */

static VOID wmPaint (HWND hWnd)
{
PAINTSTRUCT             ps;
HDC                     hDC;

	hDC = BeginPaint (hWnd, &ps);
	// .... Elaborazione del messaggio .... 
	EndPaint (hWnd, &ps);
	return;
}

/* -------------------------- wmQueryEndSession ---------------------
 *      Elabora il messaggio WM_QUERYENDSESSION
 * Restituisce TRUE per rifiutare la fine della sessione
 *          o FALSE per accettarla.
 * ---------------------------------------------------------------- */

static BOOL wmQueryEndSession (HWND hWnd)
{
	// .... Elaborazione del messaggio .... 
	return FALSE;
}

/* -------------------------- wmSetFocus ----------------------------
 *      Elabora il messaggio WM_SETFOCUS
 * hWndAltra = (HWND) wParam    Contiene l'handle della finestra 
 *                              che perde il focus.
 * ---------------------------------------------------------------- */

static VOID wmSetFocus (HWND hWnd, HWND hWndAltra)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmSize --------------------------------
 *      Elabora il messaggio WM_SIZE
 * wParam                   E' il tipo di cambiamento dimensioni.
 * cx = LOWORD (lParam)     E' la nuova larghezza.
 * cy = HIWORD (lParam)     E' la nuova altezza.
 * ---------------------------------------------------------------- */

static VOID wmSize (HWND hWnd, WORD wParam, int cx, int cy)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmSysCommand --------------------------
 *      Elabora il messaggio WM_SYSCOMMAND
 * wParam                Indica il comando selezionato.
 * x = LOWORD (lParam)   E' l'ascissa del puntatore.
 * y = HIWORD (lParam)   E' l'ordinata del puntatore.
 * Restituisce TRUE se messaggio elaborato, FALSE in caso contrario.
 * ---------------------------------------------------------------- */

static BOOL wmSysCommand (HWND hWnd, WORD wParam, int x, int y)
{
	// .... Elaborazione del messaggio .... 
	return FALSE;
}

/* -------------------------- wmTimer -------------------------------
 *      Elabora il messaggio WM_TIMER
 * id = wParam   E' l'identificatore del timer.
 * ---------------------------------------------------------------- */

static VOID wmTimer (HWND hWnd, int id)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- wmVScroll -----------------------------
 *      Elabora il messaggio WM_VSCROLL
 * wCode = wParam                   Indica dove si ha "cliccato".
 * hCtl  = (HWND) HIWORD (lParam)   E' l'handle del controllo se 
 *                                  il msg. viene da un controllo.
 * ---------------------------------------------------------------- */

static VOID wmVScroll (HWND hWnd, WORD wCode, HWND hCtl)
{
	// .... Elaborazione del messaggio .... 
	return;
}

/* -------------------------- TopWndProc ----------------------------
 *      WndProc della finestra Top - elabora i messaggi ricevuti
 * ---------------------------------------------------------------- */

LRESULT FAR PASCAL TopWndProc (HWND hWnd, WORD wMsg, WORD wParam, 
			       LONG lParam)
{
LRESULT     lRes = 0;               // Valore di ritorno
BOOL        bElabora = TRUE;        // Indica comando elaborato

	switch (wMsg)
	{
	case WM_ACTIVATE:
		bElabora = wmActivate (hWnd, wParam, (HWND)LOWORD (lParam), 
				       (BOOL)HIWORD (lParam));
		break;

	case WM_CLOSE:
		bElabora = wmClose (hWnd);
		break;

	case WM_COMMAND:
		wmCommand (hWnd, LOWORD (wParam), (HWND)lParam,
			   HIWORD (wParam));
		break;

	case WM_CREATE:
		wmCreate (hWnd, (CREATESTRUCT FAR*)lParam);
		break;

	case WM_DESTROY:
		wmDestroy (hWnd);
		break;

	case WM_ERASEBKGND:
		bElabora = wmEraseBkgnd (hWnd, (HDC)wParam);
		if (bElabora)
			lRes = TRUE;   // Lo sfondo Š stato cancellato
		break;
		
	case WM_HSCROLL:
		wmHScroll (hWnd, wParam, (HWND)HIWORD (lParam));
		break;

	case WM_INITMENU:
		wmInitMenu (hWnd, (HMENU)wParam);
		break;

	case WM_KILLFOCUS:
		wmKillFocus (hWnd, (HWND)wParam);
		break;

	case WM_MENUSELECT:
		wmMenuSelect (hWnd, wParam, LOWORD (lParam));
		break;

	case WM_MOVE:
		wmMove (hWnd, LOWORD (lParam), HIWORD (lParam));
		break;

	case WM_PAINT:
		wmPaint (hWnd);
		break;

	case WM_QUERYENDSESSION:
		bElabora = wmQueryEndSession (hWnd);
		break;

	case WM_SETFOCUS:
		wmSetFocus (hWnd, (HWND)wParam);
		break;

	case WM_SIZE:
		wmSize (hWnd, wParam, LOWORD (lParam), HIWORD (lParam));
		break;

	case WM_SYSCOMMAND:
		bElabora = wmSysCommand (hWnd, wParam, LOWORD (lParam), 
					 HIWORD (lParam));
		break;

	case WM_TIMER:
		wmTimer (hWnd, wParam);
		break;

	case WM_VSCROLL:
		wmVScroll (hWnd, wParam, (HWND)HIWORD (lParam));
		break;

	case WM_CHAR:
	case WM_KEYDOWN:
	case WM_KEYUP:
		wmKeyboard (hWnd, wMsg, wParam, lParam);
		break;

	case WM_MOUSEMOVE:
	case WM_LBUTTONDOWN:
	case WM_LBUTTONUP:
	case WM_LBUTTONDBLCLK:
	case WM_RBUTTONDOWN:
	case WM_RBUTTONUP:
	case WM_RBUTTONDBLCLK:
	case WM_MBUTTONDOWN:
	case WM_MBUTTONUP:
	case WM_MBUTTONDBLCLK:
		wmMouse (hWnd, wMsg, wParam, LOWORD (lParam), 
			 HIWORD (lParam));
		break;

	default:
		bElabora = FALSE;
		break;
	}

// ---- Elaborazione di default
	if (!bElabora)
		lRes = DefWindowProc (hWnd, wMsg, wParam, lParam);

	return lRes;
}