Corso di Visual C++

Gestire il mouse nell'area non client

 

Gli eventi generati dal mouse nell'area non client della finestra ( barre di stato e degli strumenti, barra del titolo... ) vengono gestiti dal Windows inviando alla finestra messaggi del mouse dell'area non client.

Tali messaggi sono in forte parallelismo con quelli dell'area client, la differenza più sostanziale risiede nel fatto che i loro identificatori presentano in più le lettere NC ( Non Client ) dopo il prefisso WM_.

Guardate la seguente tabella e notate il parallelismo con quella della puntata 23 del corso:

WM_NCLBUTTONDOWN

WM_NCMBUTTONDOWN

WM_NCRBUTTONDOWN

WM_NCLBUTTONUP

WM_NCMBUTTONUP

WM_NCRBUTTONUP

WM_NCLBUTTONDBLCLK

WM_NCMBUTTONDBLCLK

WM_NCRBUTTONDBLCLK

WM_NCMOUSEMOVE

 

Non riporto il loro significato perché è alquanto ovvio.

Da osservare che anche se la finestra non è registrata con lo stile CS_DBLCLKS, questa riceve comunque le notifiche dei messaggi del mouse dell'area non client.

Il prototipo dei messaggi dell'area non client è il seguente:

afx_msg void OnMsgName ( UINT nHitTest, CPoint point )

Nel caso in esame l'oggetto point identifica sempre il punto della finestra in cui si è fatto clic, ma il sistema di riferimento è in coordinate dello schermo. Ciò significa che il punto ( 0,0 ) è praticamente il punto in alto a sinistra del monitor, e non della finestra; inoltre ogni unità equivale ad un pixel ( ormai siete esperti nel distinguere la differenza tra i vari tipi di coordinate ).

Se volete convertire le coordinate da schermo a client, è possibile utilizzare la funzione CWnd::ScreenToClient.

Il primo parametro nHitTest serve per testare la posizione della finestra in cui si è verificato l'evento che è stato la causa dell'invio del messaggio; ecco una tabella dei possibili valori e il loro significato:

Come vedete la lista è abbastanza fornita, ma i valori realmente utili nelle situazioni più comuni sono pochi, inoltre alcuni di essi si ripetono.

In genere della gestione dei messaggi del mouse nell'area non client se ne occupa il Windows in modo alquanto egregio; spesso inviando anche altri messaggi alla finestra. È il classico caso ad esempio del doppio clic sulla barra del titolo che fa ridimensionare la finestra o del doppio clic sull'icona del menu di controllo che genera l'invio di un messaggio SC_CLOSE.

Se però volete personalizzare il comportamento della vostra applicazione, ad esempio evitando che il doppio clic faccia ridimensionare la finestra, potete usare un codice del genere:

void CMainFrame::OnNcLButtonDblClk (UINT nHitTest, CPoint point )

{

if (nHitTest == HTCAPTION)

{

// fai qualcosa invece di comportarsi come di default e ridimensionare la finestra

}

else

CWnd::OnNcLButtonDblClk (nHitTest, point );

}

Richiamando la versione della classe base di OnNcLButtonDblClk si fa si che il Windows effettui l'elaborazione di default del messaggio.

Nella prossima puntata vedremo la cattura del mouse ( poverino! ) e un trucchetto per trascinare la finestra agganciandola non per la barra del titolo, ma per l'area client.

 

Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet