Il controllo Image in Visual Basic .NET non esiste più: ora per visualizzare un'immagine all'interno di una form è possibile utilizzare solo il controllo PictureBox. Anch'esso ha subito alcuni cambiamenti significativi.
Innanzi tutto, la proprietà Picture, utilizzata per impostare l'immagine da visualizzare nel controllo, è stata rinominata in Image; per quanto riguarda i formati, è stato aggiunto il supporto ai file PNG ed alle GIF animate.
La proprietà Autosize è stata sostituita da sizeMode, che rispetto alla prima offre alcune possibilità in più: Normal è l'impostazione predefinita; StretchImage adatta le dimensioni dell'immagine perché possa essere interamente visualizzata all'interno del controllo; Autosize ridimensiona la PictureBox sulla base della grandezza dell'immagine; CenterImage visualizza l'immagine centrata nella PictureBox.
Per impostare la proprietà Image non è più disponibile il metodo LoadPicture; essa deve essere impostata su un oggetto di tipo System.Drawing.Bitmap: allo scopo è possibile utilizzare il metodo FromFile della classe appena citata. Ad esempio, l'istruzione:
PictureBox1.Image = System.Drawing.Bitmap.FromFile("C:ImmaginiCascate.bmp")
Visualizza nella PictureBox l'immagine C:ImmaginiCascate.bmp. Per eliminare l'immagine, è sufficiente porre la proprietà Image uguale a Nothing.
Il controllo Panel è molto semplice da utilizzare. Si tratta di un controllo contenitore, cioè consente di definire un'area al cui interno è possibile inserire altri oggetti, che verranno logicamente considerati insieme, come facenti parte di un unico gruppo: ad esempio, nascondendo un controllo Panel, verranno automaticamente nascosti anche tutti i controlli in esso contenuti. Nelle precedenti versioni di Visual Basic, per raggruppare insieme alcuni oggetti era necessario inserirli all'interno di una PictureBox, che quindi aveva una doppia valenza (visualizzatore di immagini e contenitore). Per inserire oggetti in un controllo Panel è sufficiente selezionarli e trascinarli all'interno del controllo stesso: non è più indispensabile crearli direttamente nel contenitore, come accadeva con la PictureBox; analogamente, se si vuole portare un oggetto all'esterno del Panel, basta selezionarlo e spostarlo al di fuori di esso. Se si elimina un controllo Panel, verranno automaticamente eliminati anche tutti gli oggetti al suo interno.
Le considerazioni fatte fin qui relativamente al Panel si applicano anche al GroupBox, controllo che prende il posto del vecchio Frame.
Anch'esso è un controllo contenitore: la differenza rispetto al Panel è che il GroupBox definisce un'area delimitata e visibile in fase di esecuzione, mentre i bordi del controllo Panel sono invisibili a runtime.
Realizziamo ora un piccolo esempio per impratichirci con i controlli appena analizzati. Oltre a Panel e PictureBox, utilizzeremo anche la RadioButton (nuovo nome dell'OptionButton) e la CheckBox.
L'applicazione che andremo a creare è molto semplice: una PictureBox di cui si può impostare la proprietà sizeMode attraverso una serie di RadioButton; una CheckBox, inoltre, consente di stabilire se si vuole visualizzare o meno l'immagine. L'interfaccia che vogliamo realizzare è visibile a lato; è possibile scaricarla direttamente facendo clic qui. Le proprietà da impostare sono le seguenti:
|
Infine, impostiamo la proprietà Image della PictureBox su un'immagine di dimensioni minori di quelle della casella, cosicché sia possibile notare gli effetti della modifica della proprietà sizeMode.
Cominciamo dalle cose più facili, cioè il codice associato al controllo CheckBox1. Vogliamo che, attivando o disattivando la casella di controllo, la PictureBox venga visualizzata oppure nascosta:
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
'Visualizza o nasconde la PictureBox.
PictureBox1.Visible = CheckBox1.Checked
End Sub
L'evento CheckedChanged viene generato quando si modifica la selezione di una CheckBox, sia direttamente, con un clic sul controllo, sia via codice, impostando la proprietà Checked.
Ora dobbiamo scrivere il codice per modificare la proprietà sizeMode della PictureBox a seconda della RadioButton che viene premuta. Il modo più semplice per farlo consiste nello scrivere quattro routine, una per controllo, ciascuna delle quali imposta sizeMode su un valore diverso. Vediamo qui, invece, una soluzione più sofisticata ed efficiente, che sfrutta una sola routine e l'oggetto sender:
Private Sub Selection(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton1.Click, RadioButton2.Click, RadioButton3.Click, RadioButton4.Click
PictureBox1.sizeMode = CInt(CType(sender, RadioButton).Tag)
End Sub
Cerchiamo di spiegare bene il significato di queste righe di codice. Innanzi tutto, dopo la parola chiave Handles sono stati specificati quattro eventi, corrispondenti agli eventi Click di ciascuna RadioButton: in tal modo si dice a Visual Basic di eseguire la routine Selection ogni volta che si preme il pulsante del mouse su una RadioButton.
All'interno della routine, l'oggetto sender è usato per recuperare il particolare controllo che ha generato l'evento; sender è di tipo Object, da cui sono derivati tutti i tipi di Visual Basic .NET. Noi però sappiamo che in questo caso l'oggetto passato alla funzione è una RadioButton, quindi usiamo la funzione CType per convertirlo e poter utilizzare i metodi e le proprietà tipiche di una RadioButton. In generale, la sintassi della funzione CType è la seguente:
CType(espressione, tipo)
Dove espressione rappresenta quello che si vuole convertire (ad esempio un oggetto o una variabile), mentre tipo è il tipo di dato che vogliamo ottenere con la conversione. Tornando la nostro esempio, dopo aver convertito l'oggetto sender in RadioButton ne leggiamo la proprietà Tag, la trasformiamo in intero con CInt e la passiamo alla proprietà sizeMode della PictureBox1.
E' da notare che, se non avessimo utilizzato la funzione CType, il codice avrebbe funzionato ugualmente, poiché VB avrebbe tentato una conversione implicita dell'oggetto sender. Utilizzando, invece, la funzione CType si forza una conversione esplicita: dove possibile, è sempre preferibile usare le conversioni esplicite piuttosto che quelle implicite, innanzi tutto perché rendono più chiaro il codice, poi perché consentono a Visual Basic di determinare univocamente il tipo di dati di un particolare oggetto.
Il programma di esempio che abbiamo realizzato in questa Lezione può essere scaricato facendo clic qui.
La prossima Lezione sarà dedicata ad una panoramica sui controlli ListBox, CheckedListBox e ComboBox: pur non essendo una novità, Visual Basic. NET ha introdotto numerosi cambiamenti relativamente al loro utilizzo.