Toolbox Visual Basic

Mauro VB Homepage - Toolbox 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.

Torna a Toolbox

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.

Espandi tutto | Chiudi tutto

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

  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
Esempio di utilizzo
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à)
Private Declare Function LockWindowUpdate Lib "User32" (ByVal hWndLock As Long) As Long
Esempio di utilizzo
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à)
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).
Esempio di utilizzo
Ecco vari esempi di come utilizzare e impostare la funzione PlaySound:
- Riproduzione di un file .wave

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&)
Note sull'utilizzo di alcune costanti.
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).