/* ------------------------------ 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; }