Il Ciclo dei Messaggi nelle Finestre di Windows

Dopo aver visto come si registra una classe di finestre e le caratteristiche basilari delle strutture dell’SDK ( Software Development Kit ) di Windows, vediamo un altro aspetto molto importante e assai complicato per i principianti, il ciclo dei messaggi ed il suo funzionamento.
In Windows ogni azione dal mouse o tastiera non viene inviata direttamente all’applicazione, ma inserita nella coda dei messaggi, che possono essere intercettati con la funzione GetMessage. In pratica questa funzione ritorna il primo messaggio disponibile nella coda della propria applicazione:

BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT uMsgInit, UINT uMsgEnd)

se viene trovato un messaggio diverso da WM_QUIT ( uscita dell’applicazione ) ritorna un valore diverso da zero, al contrario torna zero. LP davanti al tipo della variabile indica che si tratta di un puntatore al valore, lpMsg quindi è un puntatore ad una struttura MSG

typedef struct {
   HWND hWnd;
   UINT message;
   WPARAM wParam;
   LPARAM lParam;
   DWORD time;
   POINT pt;
} MSG, *PMSG;
  • hWnd – handle della finestra che riceve il messaggio
  • message – il messaggio o i messaggi uniti tramite OR bit a bit
  • wParam – il valore alto del messaggio
  • lParam – il valore basso del messaggio
  • time – l’ora di quando il messaggio è stato spedito
  • pt – POINT è una struttura formata da x ed y di tipo intero e rappresenta un punto con ascissa ed ordinata; questo valore è il punto del cursore in cui si trovava al momento della spedizione del messaggio

Il parametro hWnd della funzione GetMessage è l’handle della finestra che riceve i messaggi nel thread corrente, se è nullo vuol dire che vogliamo ricevere tutti i messaggi di tutte le finestre di un thread; uMsgInit e uMsgEnd sono il range dei messaggi da ricevere, il filtro in sostanza, se entrambi sono zero riceviamo tutti i messaggi. Quindi se dovessi prendere tutti i messaggi di tutte le finestre del thread ed uscire quando viene inviato il messaggio di chiusura applicazione ( WM_QUIT ) dovrò scrivere:

MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
   .. fai qualcosa ...
}

Dalla prossima lezione vedremo come costruire la nostra prima e semplice finestra con l’SDK di Windows.

<< Lezione Precedente – Inizio CorsoLezione Successiva >>

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in VC/C++. Contrassegna il permalink.