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

#define STRICT


#include <Windows.h>

#include <winuser.h>

#include "dlg2.h"

#include <mem.h>

// #include "memory.h"
// #include "dos.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         lpPiattoDlgProc;    // Funzione Dialog
long FAR PASCAL PiattoDlgProc (HWND, unsigned, WORD, DWORD);

	switch (id)
	{
	case IDM_SERACARNE:
		lpPiattoDlgProc = MakeProcInstance ((FARPROC)PiattoDlgProc,
						    hInst);
		DialogBox (hInst, MAKEINTRESOURCE (IDD_DIALOG1) , hWnd, (DLGPROC) lpPiattoDlgProc);
		FreeProcInstance (lpPiattoDlgProc);
		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 = wParam       E' l'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)     E' la nuova ascissa.
 * y = HIWORD (lParam)     E' 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 l'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 
 *                                  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, UINT wMsg, WPARAM wParam,
			       LPARAM 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;
}