- Il subclassing -
 
COSA SERVE PER QUESTO TUTORIAL
Download | Chiedi sul FORUM | Glossario Conoscere un minimo del funzionamento dei Windows Form - un compilatore per vb.net
Il subclassing per avere pieno controllo degli eventi di un form

LA FUNZIONE WNDPROC
Funzione che riceve tutte le informazioni sugli eventi di un controllo

Windows, per comunicare tutto ciò che sta accadendo nel sistema ad una finestra (non per forza visibile), richiama una funzione relativa a quella finestra che ne gestisce tutti gli eventi: essa è chiamata WndProc. Questa funzione può ricevere anche migliaia di messaggi in pochi secondi. Il suo compito è però principalmente quello di smistare le informazioni ad altre funzioni, infatti è proprio essa che genera tutti gli eventi con i quali siamo soliti interagire senza alcun problema. Se questa cosa vi stupisce è perchè tutto quello che fa WndProc, avviene in maniera invisibile al programmatore quando si utilizzano i Windows Form. Vediamo un esempio di una WndProc associata ad un form che richiama l'evento da noi gestito di click:


'Questo codice è solo teorico
Sub WndProc(ByRef m As System.Windows.Forms.Message)
	Select Case m.Msg
		Case WM_MOUSEMOVE
			Form1_MouseMove(...)
	End Select
End Sub

Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Win
dows.Forms.MouseEventArgs) Handles Me.MouseMove
	MsgBox("Hello World")
End Sub

WNDPROC E I WINDOWS FORM
Il framework .Net permette di intercettare tutto ciò che passa per WndProc

Ammettiamo ora di voler filtrare tutti i messaggi che passano per questa funzione al fine di vedere qualche evento che non è normalmente gestito dagli eventi del Windows Form (come invece è il click con l'evento Form.Click) o un messaggio personalizzato. Vediamo come fare:


Public Class WndProcExample
	Const WM_MYMESSAGE = &H200 'Sostituire con il numero del messaggio
	Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
		Select Case m.Msg
			Case WM_MYMESSAGE
				MsgBox("E' arrivato il messaggio che aspettavi!")
		End Select
		MyBase.WndProc(m)
	End Sub
End Class

Vediamo cosa abbiamo fatto in queste righe: per prima cosa è importante chiarire il significato della linea Overrides Sub WndProc, attraverso di essa è possibile sovrascrivere tutto ciò che fa la funzione standard della Windows Form fa; questa funzione prende come parametro una struttura contenente informazioni riguardanti il messaggio (il numero identificativo, la finestra che l'ha mandato ecc.). La costante WM_MYMESSAGE deve contenere il numero del messaggio che siamo interessati ad intercettare (&H200 indica WM_MOUSEMOVE, corrisponde al movimento del mouse) poiché essa verrà confrontata attraverso il Select Case con m.Msg (appunto il numero del messaggio ricevuto). Ultima cosa importante è l'istruzione MyBase.WndProc(m): essa trasferisce il controllo dell'evento alla funzione predefinita della finestra; se quest'ultima non viene richiamata il gestore degli eventi del form non verrà mai a sapere cosa deve fare e questo renderà l'applicazione totalmente dipendente dal vostro controllo, anche per disegnare, ridimensionare e spostare. È sconsigliabile farsi carico di queste operazioni, quindi è sempre bene richiamare la WndProc predefinita dopo aver eseguito la propria.
 

<< INDIETRO by VeNoM00