- 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 SubWNDPROC 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 |