/* ----------------------------- OWNER.C ----------------------------- * Gestione della finestra di dialogo * ---------------------------------------------------------------- */ #define STRICT #include <Windows.h> #include "dlg3.h" // ---- Variabili globali al sorgente typedef struct { COLORREF crColore; int itemWidth, itemHeight; } MIOITEM; typedef MIOITEM FAR *LPMIOITEM; MIOITEM ListaItems [] = { {RGB(0, 0, 0), 18, 8}, {RGB(0, 0, 255), 20, 10}, {RGB(0, 255, 0), 22, 12}, {RGB(0, 255, 255), 24, 14}, {RGB(255, 0, 0), 26, 16}, {RGB(255, 0, 255), 28, 18}, {RGB(255, 255, 0), 30, 20}, {RGB(255, 255, 255), 32, 22} }; static LPVARIABLES lpVar; // ---- Per la sotto-clasificazione FARPROC lpOldProc; // Vecchia WndProc Edit /* -------------------------- EditWndProc ----------------------------- * WndProc sotto classificata dell'edit * Controllo elementare di numericit… * ---------------------------------------------------------------- */ LRESULT FAR PASCAL EditWndProc (HWND hWnd, WORD wMsg, WORD wParam, LONG lParam) { LRESULT lRes = 0; // Valore di ritorno BOOL bElabora = TRUE; // Indica comando elaborato switch (wMsg) { case WM_CHAR: if ((wParam < '0' || wParam > '9') && wParam != 0x08) MessageBeep (0); // Tasto rifiutato else bElabora = FALSE; break; default: bElabora = FALSE; break; } // ---- Elaborazione di default if (!bElabora) lRes = CallWindowProc ((WNDPROC)lpOldProc, hWnd, wMsg, wParam, lParam); return lRes; } /* -------------------------- InitSottoClass ------------------------- * Definisce la sotto classificazione * ---------------------------------------------------------------- */ static VOID InitSottoClass (HWND hWnd) { HWND hWndEdit; FARPROC lpNewProc; // Nuova WndProc Edit hWndEdit = GetDlgItem (hWnd, IDD_EDIT); lpNewProc = MakeProcInstance ((FARPROC)EditWndProc, hInst); lpOldProc = (FARPROC)SetWindowLong (hWndEdit, GWL_WNDPROC, (long)lpNewProc); } /* -------------------------- ConcSottoClass ------------------------- * Conclude la sotto-classificazione ripulendo * ---------------------------------------------------------------- */ static VOID ConcSottoClass (HWND hWnd) { HWND hWndEdit; FARPROC lpNewProc; // Nuova WndProc Edit hWndEdit = GetDlgItem (hWnd, IDD_EDIT); lpNewProc = (FARPROC)SetWindowLong (hWndEdit, GWL_WNDPROC, (long)lpOldProc); FreeProcInstance (lpNewProc); } /* -------------------------- 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) { BOOL bTrans; DWORD dwPos; switch (id) { case IDD_EDIT: if (nNotify == EN_CHANGE) EnableWindow (GetDlgItem (hWnd, IDOK), GetWindowTextLength (GetDlgItem (hWnd, IDD_EDIT))); break; case IDOK: // ---- Recupera i valori inseriti lpVar->nNumero = GetDlgItemInt (hWnd, IDD_EDIT, &bTrans, FALSE); lpVar->iColoreLB = (int)SendDlgItemMessage (hWnd, IDD_LISTBOX, LB_GETCURSEL, 0, 0L); lpVar->iColoreCB = (int)SendDlgItemMessage (hWnd, IDD_COMBOBOX, CB_GETCURSEL, 0, 0L); dwPos = SendDlgItemMessage (hWnd, IDD_BERSAGLIO, BER_GETPOS, 0, 0L); lpVar->xBersaglio = LOWORD (dwPos); lpVar->yBersaglio = HIWORD (dwPos); // ---- E conclude ConcSottoClass (hWnd); EndDialog (hWnd, TRUE); break; case IDCANCEL: ConcSottoClass (hWnd); EndDialog (hWnd, TRUE); break; default: break; } return; } /* -------------------------- wmInitDialog -------------------------- * Elabora il messaggio WM_INITDIALOG * idFocus = (HWND) wParam Handle del controllo che pu• ricevere * il focus. * lParam Contiene dati specifici dell'applica_ * zione. * Il valore di ritorno Š TRUE normalmente, o FALSE se il focus * Š stato messo su un controllo. * ---------------------------------------------------------------- */ static BOOL wmInitDialog (HWND hWnd, int idFocus, DWORD lParam) { register i; LPMIOITEM lpItem; // ---- Blocco di variabili lpVar = (LPVARIABLES)lParam; // ---- Riempie la lista for (i = 0; i < 8; ++i) { lpItem = &ListaItems[i]; SendDlgItemMessage (hWnd, IDD_LISTBOX, LB_ADDSTRING, 0, (long)lpItem); SendDlgItemMessage (hWnd, IDD_COMBOBOX, CB_ADDSTRING, 0, (long)lpItem); } // ---- E mette i valori di default SendDlgItemMessage (hWnd, IDD_LISTBOX, LB_SETCURSEL, lpVar->iColoreLB, 0L); SendDlgItemMessage (hWnd, IDD_COMBOBOX, CB_SETCURSEL, lpVar->iColoreCB, 0L); // ---- Inizializza l'edit, 5 caratteri max SendDlgItemMessage (hWnd, IDD_EDIT, EM_LIMITTEXT, 5, 0L); SetDlgItemInt (hWnd, IDD_EDIT, lpVar->nNumero, FALSE); // ---- La sotto-classe InitSottoClass (hWnd); // ---- Inizializza il bersaglio SendDlgItemMessage (hWnd, IDD_BERSAGLIO, BER_SETPOS, 0, MAKELONG (lpVar->xBersaglio, lpVar->yBersaglio)); return TRUE; } /* -------------------------- wmCtlColor ---------------------------- * Elabora il messaggio WM_CTLCOLOR * hDC = (HDC) wParam E' il DC del controllo. * hCtl = (HWND) LOWORD (lParam) Handle del controllo. * nCode = (int) HIWORD (lParam) Tipo di controllo. * Restituisce un handle al pennello da usare per dipingere lo * sfondo del controllo oppure NULL. * ---------------------------------------------------------------- */ static HBRUSH wmCtlColor (HWND hWnd, HDC hDC, HWND hCtl, int nCode) { HBRUSH hBr = NULL; RECT Rect; // ---- Static UserItem if (hCtl == GetDlgItem (hWnd, IDD_STATIC)) { GetClientRect (hCtl, &Rect); hBr = GetStockObject (GRAY_BRUSH); FillRect (hDC, &Rect, hBr); Ellipse (hDC, Rect.left, Rect.top, Rect.right, Rect.bottom); } return hBr; } /* -------------------------- wmMeasureItem ------------------------- * Elabora il messaggio WM_MEASUREITEM * lpMIS = (MEASUREITEMSTRUCT FAR*) lParam Punta ad una struttura * MEASUREITEMSTRUCT. * ---------------------------------------------------------------- */ static VOID wmMeasureItem (HWND hWnd, MEASUREITEMSTRUCT FAR* lpMIS) { if (lpMIS->CtlID == IDD_LISTBOX) { // List box, fixed lpMIS->itemWidth = 20; lpMIS->itemHeight = 16; } else { // Combo box, variable if (lpMIS->itemID == -1) { // Controllo edit, dim max lpMIS->itemWidth = 32; lpMIS->itemHeight = 22; } else { // Item lpMIS->itemWidth = ((LPMIOITEM)(lpMIS->itemData))->itemWidth; lpMIS->itemHeight = ((LPMIOITEM)(lpMIS->itemData))->itemHeight; } } return; } /* -------------------------- wmDrawItem ---------------------------- * Elabora il messaggio WM_DRAWITEM * lpDIS = (DRAWITEMSTRUCT FAR*) lParam Punta ad una struttura * DRAWITEMSTRUCT. * ---------------------------------------------------------------- */ static VOID wmDrawItem (HWND hWnd, DRAWITEMSTRUCT FAR* lpDIS) { HBRUSH hBrush; // ---- Disegna l'elemento if (lpDIS->itemID != -1) { // Salvo controllo edit hBrush = CreateSolidBrush (((LPMIOITEM)(lpDIS->itemData))->crColore); FillRect (lpDIS->hDC, &lpDIS->rcItem, hBrush); DeleteObject (hBrush); // ---- Disegna la selezione if (lpDIS->itemState & ODS_SELECTED) FrameRect (lpDIS->hDC, &lpDIS->rcItem, GetStockObject (BLACK_BRUSH)); } return; } /* -------------------------- OwnerDlgProc ---------------------------- * DlgProc della finestra di dialogo * ---------------------------------------------------------------- */ BOOL FAR PASCAL OwnerDlgProc (HWND hWnd, WORD wMsg, WORD wParam, LONG lParam) { BOOL bRes = TRUE; // Valore di ritorno switch (wMsg) { case WM_COMMAND: wmCommand (hWnd, LOWORD (wParam), (HWND) lParam, HIWORD (wParam)); break; case WM_INITDIALOG: bRes = wmInitDialog (hWnd, wParam, lParam); break; // case WM_CTLCOLOR: case WM_CTLCOLORBTN: case WM_CTLCOLORDLG: case WM_CTLCOLOREDIT: case WM_CTLCOLORLISTBOX: case WM_CTLCOLORMSGBOX: case WM_CTLCOLORSCROLLBAR: case WM_CTLCOLORSTATIC: bRes = (BOOL)wmCtlColor (hWnd, (HDC)wParam, (HWND)LOWORD (lParam), (int)HIWORD (lParam)); break; case WM_MEASUREITEM: wmMeasureItem (hWnd, (MEASUREITEMSTRUCT FAR*)lParam); break; case WM_DRAWITEM: wmDrawItem (hWnd, (DRAWITEMSTRUCT FAR*)lParam); break; default: bRes = FALSE; break; } return bRes; }