Toolbox Visual Basic
Presentiamo in questa sezione, per i programmatori in Visual Basic, versioni 5 o 6, strumenti idonei ad ottimizzare le loro applicazioni in termini di efficacia e funzionalità: si tratta di esempi di codici e di routines accompagnati da indicazioni sul loro funzionamento e sul loro utilizzo all'interno di un programma.
Il materiale messo a disposizione è totalmente gratuito e di libero utilizzo. Se questo codice viene redistribuito altrove si dovrà però citarne l'autore e la fonte.
Sezione Grafica e Multimedia
Funzione InvertColors
A cosa serve e come funziona questo codice
Questa funzione serve per convertire il codice di un dato colore nell'equivalente codice opposto di quel colore. Se, ad esempio, passiamo
alla funzione il codice del colore bianco, la funzione ci restituirà il codice del colore nero; se invece passiamo il codice del
colore rosso, la funzione ci restituirà il codice del colore azzurro (che rappresenta l'opposto del colore rosso); ancora, se passiamo
il codice del colore blu, la funzione ci restituirà il codice del colore giallo (che rappresenta l'opposto del colore blu), e
via dicendo.
La funzione, che deve essere richiamata passando obbligatoriamente come argomento ColorValue il valore (long) del codice del colore da
invertire, restituisce un valore numerico (long) che rappresenta il codice del colore opposto a quello fornito.
Quando e perchè usare questo codice
Questa funzione può essere usata quando c'è la necessità di mantenere sempre visibile un testo che, a causa di modifiche del colore di sfondo
da parte dell'utente, potrebbe risultare non più visibile (immaginiamo una scritta nera inizialmente posta su fondo bianco, se l'utente
decide di modificare il colore dello sfondo in una tonalità molto scura la scritta risulterà difficilmente visibile).
Avvertenze e suggerimenti
Questo codice, richiamato ad esempio all'interno di una routine Timer, può anche essere usato per creare effetti tipo scritte lampeggianti
invertendo contemporaneamente sia il colore di primo piano (foreColor) e sia il colore dello sfondo (BackColor).
Private Function InvertColors(ColorValue As Long) As Long
Esempio di utilizzo
Dim Rosso As Integer
Dim Verde As Integer
Dim Blu As Integer
'estrae le tre singole componenti fondamentali RGB
Rosso = ColorValue And &HFF&
Verde = (ColorValue And &HFF00&) \ 256
Blu = (ColorValue And &HFF0000) \ 65536
'inverte i colori
InvertColors = RGB(255 - Rosso, 255 - Verde, 255 - Blu)
End Function
Nell'esempio che segue ipotizziamo di avere la necessità che il titolo della nostra applicazione sia sempre visibile anche nel caso
l'utilizzatore decida di cambiare il colore dello sfondo.
Ecco come utilizzare la funzione InvertColors:
Titolo.ForeColor = InvertColors(Me.BackColor)
...dove, ad esempio, Titolo è il nome di un controllo Label impostato con la proprietà BackStyle = Trasparent e Me rappresenta
il nostro form che utilizziamo come sfondo. Nel caso l'utilizzatore decida di cambiare (personalizzare) il colore dello sfondo del form, la
nosta scritta (titolo) sarà sempre visibile indipendentemente dal colore scelto.
LockWindowUpdate
A cosa serve e come funziona questo codice
Questo codice serve per bloccare l'aggiornamento (refresh) grafico di una finestra (form).
La funzione API (Application Programming Interface) LockWindowUpdate utilizzata deve essere richiamata passando come argomento
hWndLock , l'handle della finestra in cui si vuole bloccare il refresh, oppure, 0 (zero) per ripristinare le normali condizioni di
visualizzazione.
Quando e perchè usare questo codice
Questa funzione può essere usata per eliminare il flickering (sfarfallio) provocato da elaborazioni grafiche o altre operazioni come, ad
esempio, durante il caricamento dei dati in una Combobox o una Listbox.
Avvertenze e suggerimenti
Bloccare, in determinati casi, l'aggiornamento grafico della finestra attiva, non solo evita fastidiosi sfarfallii ma contribuisce a
velocizzare l'elaborazione del codice.
'Dichiarazione della funzione API (sostituire Private con Public in funzione delle necessità)
Esempio di utilizzo
Private Declare Function LockWindowUpdate Lib "User32" (ByVal hWndLock As Long) As Long
Ecco come richiamare e utilizzare la funzione LockWindowUpdate:
'Me.hwnd = handle della finestra (form)
Sub ElaboraCodice()
On Error Resume Next 'in caso di errore continua l'elaborazione del codice
LockWindowUpdate Me.hwnd 'blocca l'aggiornamento grafico della finestra
'... codice da elaborare...
LockWindowUpdate 0& 'ripristina l'aggiornamento grafico della finestra
End Sub
Funzione PlaySound
A cosa serve e come funziona questo codice
Questa funzione serve per riprodurre ("far suonare") un file wave (.wav) sia in modo diretto (utilizzando nome e percorso nel quale si trova
il file) e sia in modo indiretto (utilizzando l'"alias" associato ai suoni di sistema o utilizzando un file wave contenuto in un file di
risorse).
La funzione API (Application Programming Interface) PlaySound utilizzata, deve essere richiamata passando come argomento lpszName
(string) il file o la risorsa wav da riprodurre, hModule (long) 0 (zero) perchè non utilizzato in questo esempio e dwFlags
(long) una o più costanti le cui funzioni sono spiegate più sotto.
Quando e perchè usare questo codice
Questa funzione può essere usata per riprodurre qualunque file wave presente nel sistema, oppure per riprodurre dei file wave contenuti in un
file di risorse inglobato nella nostra applicazione oppure, ancora, per riprodurre uno dei qualunque file associati ad eventi di sistema
(avvio/chiusura, errore, cestino, logoff/logon, ecc.)
Avvertenze e suggerimenti
Utilizzando e associando opportunamente le varie costanti, si possono ottenere funzionamenti personalizzati e flessibili (vedi esempi).
La riproduzione di un file wave in modalità sincrona, blocca il proseguo del nostro programma finchè la riproduzione non sarà terminata. Di
questa cosa, soprattutto con i file che durano (in termini di tempo) molto, occorre tenerne conto.
Quando si utilizza la modalità 'Loop' occorre sempre utilizzare la riproduzione asincrona e prevedere un comando di 'stop', altrimenti la
riproduzione non terminerà mai.
La modalità di riproduzione che prevede l'utilizzo di un file wave contenuto in un file risorse deve essere necessariamente di tipo sincrono,
in caso contrario verrà generato un errore o il file non verrà riprodotto. Da esperienza personale, però, la modalità asincrona è tollerata
con l'utilizzo di un file risorse se i file wave da riprodurre hanno dimensioni contenute (nell'ordine max di 20 KB).
'Dichiarazione della funzione API (sostituire Private con Public in funzione delle necessità)
Esempio di utilizzo
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, _
ByVal hModule As Long, _
ByVal dwFlags As Long) As Long
Private Const SND_SYNC = &H0
'Esecuzione sincrona (predefinita). In questa modalità l'elaborazione del codice
'verrà interrotta finchè il suono non sarà stato completamente riprodotto
Private Const SND_ASYNC = &H1
'Esecuzione asincrona. Contrariamente a quella più sopra, in questa modalità
'l'elaborazione del codice prosegue anche durante la riproduzione del suono.
'Le sopracitate costanti sono alternative e non devono essere usate assieme.
Private Const SND_ALIAS = &H10000
'Il file da riprodurre è un alias di un suono usato per un evento di sistema
Private Const SND_FILENAME = &H20000
'Il file da riprodurre è un normale file wave presente nel sistema
Private Const SND_MEMORY = &H4
'Il file da riprodurre è memorizzato nella RAM (utilizzato con file di risorse)
'SND_MEMORY deve sempre essere associato a SND_SYNC
'Le sopracitate costanti sono alternative e non devono essere usate assieme.
Private Const SND_LOOP = &H8
'Il suono viene ripetuto continuamente
Private Const SND_NODEFAULT = &H2
'In caso di errore non esegue il suono predefinito (Beep)
Private Const SND_NOSTOP = &H10
'Non interrompe eventuali altri suoni in esecuzione
Private Const SND_NOWAIT = &H2000
'Non attende se il driver è impegnato
Private Const SND_PURGE = &H40
'Arresta l'esecuzione di qualsiasi file
'(lpszName dovrà essere una stringa vuota).
Ecco vari esempi di come utilizzare e impostare la funzione PlaySound:
- Riproduzione di un file .wave
Note sull'utilizzo di alcune costanti.
Call PlaySound("C:\WINDOWS\Media\Tada.wav", ByVal 0&, SND_FILENAME Or SND_ASYNC)
riproduce, in modalità asincrona, il file wave "Tada".
- Riproduzione di un suono predefinito di sistema
Call PlaySound("SystemStart", byval 0&, SND_ALIAS or SND_ASYNC)
riproduce il suono di "apertura" di Windows
- Riproduzione di un file wave contenuto in un file di risorse (.res)
Dim sFileDaSuonare as String
sFileDaSuonare = StrConv(LoadResData(1, "sound"), vbUnicode)
dove: 1 è il numero della risorsa e "sound" il nome della sezione dov'è contenuta la risorsa
Call PlaySound(sFileDaSuonare, byval 0&, SND_MEMORY or SND_SYNC)
riproduce, in modalità sincrona, un suono presente in un file risorse
(la modalità asicncrona non è compatibile con l'uso della costante SND_MEMORY)
- Arresto di un suono in riproduzione (o in loop)
Call PlaySound(vbNull, byval 0&, SND_PURGE)
oppure
Call PlaySound(vbNull, byval 0&, byval 0&)
SND_NODEFAULT viene utilizzata quando, nel caso il file da suonare non fosse trovato, non si desidera che venga emesso il suono di default
'beep'.
SND_LOOP quando si utilizza questa costante, è sempre necessario associarla a SND_ASYNC (SND_LOOP OR SND_ASYNC). Utilizzando SND_LOOP il
suono verrà ripetuto in continuazione finché la funzione PalySound non verrà richiamata passando vbNull a lpszName.
SND_ALIAS viene utilizzata quando si passa a lpszName una stringa che identifica uno dei suoni associati come eventi di sistema. Ad esempio,
il file "The Microsoft sound.wav" che di norma è utilizzato all'avvio Windows (vedi pannello di controllo/Suoni) prende l'Alias
"SystemStart". Per conoscere gli alias associati agli eventi di sistema, è possibile visualizzare le chiavi del registro sotto la voce
HKEY_CURRENT_USER\AppEvents\Schemes.
SND_ASYNC quando si utilizza questa costante la funzione PlaySound restituisce immediatamente il controllo al programma in esecuzione e il
suono viene riprodotto come sottofondo.
SND_SYNC quando si utilizza questa costante la funzione PlaySound non restituisce il controllo al programma fino a quando il suono non è
terminato (questa costante è predefinita, quindi, se non si utilizza in modo esplicito la costante SND_ASYNC, tutti i suoni verranno
riprodotti in modalità sincrona).