Introduzione alle API Win32, Parte 5/6
di Mastersgn, del 27 febbraio 2007 C/C++
Rafforziamo i concetti appresi nel precedente capitolo sui parametri della procedura di dialogo
dlgProc
e ripassiamo i tipi di dato già esaminati per completare la spiegazione sul funzionamento del controllo inserito nella finestra di dialogo.I messaggi
Nel capitolo precedente abbiamo visto che il codice del messaggio
WM_CLOSE
viene inviato alla procedura del dialogo allo scatenarsi dell'evento di chiusura.Ecco cos'è un messaggio nella sua definizione:
typedef struct MSG {
HWND hWnd; /* destinazione */
UINT message; /* codice del messaggio */
WPARAM wParam; /* 1° parametro */
LPARAM lParam; /* 2° parametro */
DWORD time; /* istante di spedizione */
POINT pt; /* coordinate del mouse */
} MSG;
Quando il sistema operativo "passa" un messaggio alla procedura di un dialogo, in pratica comunica le informazioni presenti in questa struttura dati. Ora conosciamo quindi il significato dei parametri di
dlgProc
, introdotta nella Parte 4.
Analizziamo le componenti della struttura:
HWND
indica l'handle della destinazione del messaggio, cioè identifica il dialogo, controllo o finestra a cui e destinato il messaggio.
UINT
è il codice del messaggio che può avere valoreWM_CLOSE
,WM_COMMAND
,WM_PAINT
,WN_INITDIALOG
, ecc.
WPARAM
edLPARAM
vedremo prossimamente come usarli, siccome il loro significato cambia a seconda del contesto (ovvero in relazione al tipo di messaggio) in cui vengono usati.
DWORD
ePOINT
normalmente non sono usati, quindi non li affrontiamo.
Per ora, non ci interessa capire esattamente come vengono inviati i messaggi alla procedura del nostro dialogo, ma sappiamo che questa operazione avviene grazie al sistema operativo.
Se osserviamo i parametri della procedura del dialogo esaminati nello scorso articolo, notiamo che i parametri della procedura corrispondono alle prime quattro componenti della struttura MSG. Di conseguenza, quando il sistema invierà un messaggio (e per ora sarà sempre lui a farlo per noi) alla nostra procedura passerà le prime quattro componenti della struttura MSG come parametri di funzione.
Usiamo il file resource.h
Grazie alle nuove conoscenze che abbiamo acquisito, ora siamo in grado di capire meglio il contenuto del file
resource.rc
. La prima informazione che troviamo subito dopo l'inclusione della libreriawindows.h
è un identificatore. Il nome di questo identificatore ci comunica il suo scopo: si tratta di un valore costante che identifica il dialogo.
Scriviamo questo nel file
resource.h
:
#define IDD_DIALOG 1001
#define IDC_CONTROL 101
Abbiamo definito due costanti: soffermiamoci su
IDD_DIALOG
. Abbiamo assegnato il valore1001
ma avremmo potuto impostare un qualunque altro valore. In questo tutorial, scegliamo 1001 solo per leggibilità. Solitamente assegneremo agli identificatori dei dialoghi valori da 1001 in poi (1001,1002,1003,..) mentre agli identificatori dei controlli valori da 101 in poi.
Ed i file resource.rc e main.c
Adesso andiamo a modificare il file
resource.rc
:
#include <windows.h>
#include "resource.h"
IDD_DIALOG DIALOG 20, 30, 180, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialogo vuoto"
FONT 10, "Ms Sans Serif"
BEGIN
CTEXT "Sono un esempio di controllo static",IDC_CONTROL,16,18,144,33
END
ed anche il file
main.c
:
#include <windows.h>
#include "resource.h"
BOOL CALLBACK dlgProc(HWND hwndDlg,UINT dlgMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
DialogBoxParam(0,IDD_DIALOG,0,dlgProc,0);
return 0;
}
BOOL CALLBACK dlgProc(HWND hwndDlg,UINT dlgMsg,WPARAM wParam,LPARAM lParam)
{
switch(dlgMsg)
{
case WM_CLOSE:
EndDialog(hwndDlg,0);
return TRUE;
break;
}
return 0;
}
Abbiamo incluso il file
resource.h
sia nelmain.c
che inresource.rc
. In questo modo, potremo usare le sue costanti da ambedue le parti. Inoltre, cambiando l'identificatore del dialogo da"MioDialogo"
aIDD_DIALOG
abbiamo modificato di conseguenza pure il secondo parametro diDialogBoxParam()
.
Notate che anche il controllo ha un suo identificatore:
IDC_CONTROL
.
Analizziamo il controllo
Soffermiamoci su questa porzione di codice:
BEGIN
CTEXT "Sono un esempio di controllo static",IDC_CONTROL,16,18,144,33
END
Tra
BEGIN
edEND
troviamo la definizione di un controllo static di classeCTEXT
(ovvero Central Text; le altre classi disponibili sonoLTEXT
edRTEXT
). Questo controllo si occupa di scrivere la stringa inclusa tra i doppi apici sul nostro dialogo. Il controllo viene posizionato e dimensionato sul dialogo come indicato dagli ultimi quattro valori numerici (16, 18, 144, 33). Per il momento non abbiamo definito nessuno stile.
Già sappiamo che
IDC_CONTROL
è l'identificatore del controllo. Il nostro controllo è di tipo static, infatti visualizza solo un testo al centro del controllo.
Se volessimo creare un bordo attorno al testo visualizzato, potremmo impostare:
BEGIN
CTEXT "Sono un esempio di controllo static",IDC_CONTROL,16,18,144,33,WS_BORDER
END
Ancora, potremmo "concatenare" più stili a nostra scelta (notate che gli stili devono assere separati dal carattere pipe "
|
"):
BEGIN
CTEXT "Sono un esempio di controllo static",IDC_CONTROL,16,18,144,33,WS_BORDER|SS_SUNKEN
END
Specificando
SS_SUKEN
daremo al bordo un aspetto incavo.
Per ottenere un elenco completo degli stili che si possono impostare su questi controlli static, potete consultare la documentazione MSDN (che abbiamo indicato nella prima lezione del tutorial ).
Il prossimo appuntamento
Anche i controlli possono inviare messaggi di notifica. Chiariremo questo concetto nel prossimo capitolo.
Nessun commento:
Posta un commento