Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Nella maggioranza dei programmi per personal computer i colori sono gestiti come triplette RGB (Red Green Blue - Rosso Verde Blu). Anche Visual Basic adotta tale tecnica; mettendo insieme 3 bytes (3 * 8 = 24 bit) possiamo ottenere 16.777.216 (2^24) differenti colori. Questo mettere insieme delle diverse gradazioni di ogni componente del colore deve essere fatto secondo un certo criterio.
Vedremo in questo HowTo come maneggiare i colori, comporli in numeri
complessi e scomporli in triplette RGB attraverso due diverse soluzioni. Accanto ad ognuna di esse c'è una barra di scorrimento orizzontale di nome BarraColori con gli indici da 0 a 2, proprietà Min impostata a 0, proprietà Max impostata a 255, proprietà SmallChange impostata su 1 e LargeChange impostata su 8. Questo perché ogni componente dei colori utilizza 1 byte e pertanto può contenere i numeri compresi tra 0 e 255. Accanto ad ogni barra è presente una TextBox di nome TextColoriDec con indici sempre da 0 a 2, proprietà MaxLength impostata a 3 e Locked impostata a True. Esse mostreranno soltanto il valore corrente di ogni singola barra del colore. Infine altre 3 TexBox di nome TextColoriHex con proprietà MaxLength impostata a 2 e Locked impostata a True. Queste ultime serviranno a rappresentare il valore esadecimale del colore indicato nella casella a fianco e quindi dalle barre di scorrimento. La parte inferiore del form contiene invece i comandi utilizzabili nel nostro programma. Il suo ruolo è:
Per entrambi i problemi abbiamo due soluzioni: una semplice e banale ed una tecnicamente più corretta che svolge le operazioni più elementari per ottenere il risultato. Ritornando al nostro form, abbiamo una TextBox di nome TextColoreLungo
con la proprietà MaxLength impostata a 8;
sulla destra invece tre caselle di testo di nome ColoriRGB con
indici da 0 a 2 e proprietà MaxLength impostata a 3. Infine sulla destra del form ci sono due PictureBox di nome AnteprimaColore1 e AnteprimaColore2; la prima servirà per vedere il colore indicato dalle barre di scorrimento della parte superiore del form mentre la seconda servirà per mostrare il colore indicato dalle 3 caselle di testo in basso. Vediamo il codice che, preso passo passo, non presenta alcuna difficoltà particolare, ma molto utile didatticamente per capire la gestione dei colori in Visual Basic.
Nel momento in cui l'utente "afferra" la barra di scorrimento e la posta da un valore ad un altro viene scatenato l'eventoScroll. Essendo una matrice di controlli viene passato il parametro Index in base alla barra che si sta trascinando. Alla riga 4 viene aggiornata la casella di testo di nome TextColoriDec corrispondente alla barra trascinata con il valore della barra. Alla riga successiva viene svolta l'operazione analoga ma in esadecimale aggiornando la casella di testo TextColoriHex. L'operazione di conversione viene svolta dalla funzione Hex$. L'istruzione Right$ serve per assicurare che vengano mostrati almeno 2 caratteri esadecimali. Alla riga 6 viene infine aggiornata la PictureBox AnteprimaColore1 con il colore indicato da tutti e tre i valori delle barre di scorrimento.
Se l'utente invece di trascinare la barra di scorrimento clicca su un'area libera della barra oppure su una delle freccette della stessa oppure utilizza la tastiera, viene aggiornato il valore della barra ma non viene eseguito l'evento Scroll. Al suo posto è eseguito l'evento Change; ecco perché abbiamo fatto in modo che l'esecuzione di tale evento richiami (riga 10) la funzione legata all'evento Scroll, in modo da non dover ripetere lo stesso codice.
La funzione alle righe 13-16 è esclusivamente di supporto e non ha nessuna utilità nel progetto. Nel momento in cui una TextBox di nome ColoriRGB riceve il focus il testo contenuto in essa viene selezionato, cosicché la digitazione sovrascriva i dati precedenti. Dovendo tali caselle di testo contenere soltanto numeri abbiamo fatto in modo di bloccare tutti i tasti eccetti i numeri ed il BackSpace per cancellare. Alla riga 19 viene effettuato il controllo del tasto premuto. Possiamo scomporre la condizione in due parti: If ((KeyAscii < Asc("0")) Or (KeyAscii > Asc("9"))) Se il tasto premuto è minore del codice del tasto 0 oppure maggiore del codice del tasto 9, ovvero non è un tasto compreso tra 0 e 9... And (KeyAscii <> vbKeyBack) Then KeyAscii = 0 Ma altresì il tasto premuto non è il tasto BackSpace,
allora tale tasto deve essere annullato e non mandato alla casella di
testo. Questo duplice controllo assicura che il tasto premuto sia un numero
oppure il tasto BackSpace.
Controlliamo anche l'eventoChange delle caselle di testo ColoriRGB che verrà eseguito subito dopo l'evento KeyPress. Questo per evitare che il numero immesso in ciascuna casella sia inferiore a 256 e per aggiornare la PictureBox con l'anteprima del colore. La prima di queste due operazioni viene svolta dalle righe 23-27; se il numero immesso è maggiore di 255 allora ne cambia il contenuto in 255 e ne evidenzia il testo in essa. Alla riga 28 viene invece cambiato il colore di AnteprimaColore2 con i valori delle tre caselle di testo ColoriRGB. Viene utilizzata la funzione RGB che combina i tre valori. Seguono le due funzioni di conversione da numero lungo a tripletta RGB e viceversa. Prima vediamo però come sono organizzati i colori. Data una tripletta di valori che rappresentano ogni colore, ad esempio i numeri 48, 128 e 226 hanno i corrispondenti valori esadecimali 30, 80 e E2. Sia in forma decimale che esadecimale tali valori occupano sempre due bytes. Il sistema per creare un numero lungo rappresentativo di una tripletta di colori mette assieme i tre singoli valori: E28030. Tale numero convertito in decimale è 14843952. Tale colore rappresenta un azzurro. Spiegato in altri termini, la conversione da tripletta a numero lungo viene effettuata facendo la somma di tali valori: E20000 + 008000 + 000030. Il valore E2 viene moltiplicato per 65536 (ovvero 256^2 oppure 10000 esadecimale); il valore 80 viene moltiplicato per 256 (ovvero 256^1 oppure 100 esadecimale); mentre il valore del blu 30 viene lasciato inalterato (ovvero 256^0 oppure 1 esadecimale). Lo stesso sistema può essere effettuato con cifre decimali: La somma di 14811136 + 32768 + 48 dà come risultato 14843952 ovvero il nostro valore lungo corrispondente (E28030 in esadecimale). Pertanto la conversione opposta deve essere fatta mediante operazioni inverse: essendo i valori sommati tra loro è necessario estrarre ogni parte corrispondente mediante divisioni interere ed operazioni booleane di AND che assicurano che vengano estratti soltanto gli ultimi due bytes del numero Ricordando che l'operatore \ indica una divisione intera (ad esempio
7 \ 3 = 2), il numero lungo 14843952 può essere scomposto come
segue: Abbiamo due soluzioni per ogni problema.
La prima soluzione effettua una semplice conversione del numero lungo in una stringa esadecimale ed estrae le coppie di byte corrispondenti per ogni colore.
Alla riga 33 viene effettuata la conversione del numero in esadecimale (funzione Hex$); il numero di caratteri restituiti è sempre 6, in base all'utilizzo dell'istruzione Right$. Le righe 34-36 estraggono 3 coppie di byte dal valore convertito. Il rosso è indicato dalle 2 cifre meno significative mentre il blu sta alla prima posizione.
La conversione da tripletta RGB a numero lungo è ancora più semplice e viene effettuato utilizzando la funzione apposita RGB, convertita in stringa per visualizzarla nella casella di testo. La funzione RGB richiede che siano passati in ordine i colori rosso, verde e blu. Seguono altre due soluzioni per produrre i medesimi risultati che effettuano le operazioni matematiche dovute per ottenere il risultato. In pratica è quello che avviene "under the hood" utilizzando le soluzioni appena viste.
La conversione da numero lungo a tripletta RGB viene effettata mediante le operazioni di divisione intera ed operazioni di AND, come visto prima. Alla riga 44 viene verificato che il valore di TextColoreLungo
non sia una stringa vuota; se lo fosse sarebbe sostituita con uno 0. Questo
al fine di evitare errori di calcolo su numeri impossibili.
L'operazione di conversione da tripletta a valore lungo è ancora più semplice. Si tratta infatti di moltiplicare i valori di ogni colore rispettivamente per 255^0, 255^1 e 255^2 e sommarli tra loro. I controlli alle righe 52-54 assicurano che sia presente un valore nelle
caselle ColoriRGB. |
Questo processo di conversione viene applicato dalla quasi totalità dei programmi. Alcuni fanno piccole eccezioni; ad esempio l'HTML, il linguaggio di marcatura con cui vengono scritte le pagine web come questa utilizza lo stesso procedimento ma inverte i colori rosso e blu. Lo stesso colore esadecimale E28030 che in Visual Basic rappresentava un azzurro, nell'HTML rappresenta invece un marroncino. Per ottenere lo stesso azzurro di Visual Basic è necessario invertire i colori rosso e blu, ottenendo quindi 3080E2. Fibia
FBI
|
Torna all'indice degli HowTo |