giovedì 25 giugno 2009

Introduzione alle API Win32, Parte 5/6 - DevSpy.com

 

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 valore WM_CLOSE, WM_COMMAND, WM_PAINT, WN_INITDIALOG, ecc.


  • WPARAM ed LPARAM 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 e POINT 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 libreria windows.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 valore 1001 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 nel main.c che in resource.rc. In questo modo, potremo usare le sue costanti da ambedue le parti. Inoltre, cambiando l'identificatore del dialogo da "MioDialogo" a IDD_DIALOG abbiamo modificato di conseguenza pure il secondo parametro di DialogBoxParam().



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 ed END troviamo la definizione di un controllo static di classe CTEXT (ovvero Central Text; le altre classi disponibili sono LTEXT ed RTEXT). 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.




Introduzione alle API Win32, Parte 5/6 - DevSpy.com

Nessun commento:

Posta un commento