Home Page
  Programmazione
   I Miei Progetti
   Come fare
     Gestire i processi
     Screen Saver
     File Help
   VB e Libri
   Download



Che cos'e' uno Screen Saver?

Uno Screen Saver e' un file con estensione SCR. In realta' pero' esso e' un normale eseguibile, e come tale puo' essere programmato con Visual Basic. Uno screen saver ha due modalita' principali di esecuzione: lo screen saver vero e proprio e la sua configurazione. Quando Windows (che gestisce l'ambiente) li chiama, mediante la linea di comando dice loro che cosa devono fare. Se al programma viene passato il parametro "/s" (quando lo si testa dall'explorer con un click del pulsante destro sul file) esso deve "salvare lo schermo", se il parametro e' "/c" il programma deve mostrare una finestra di configurazione. Inoltre, quando si testa lo screen saver dalle proprieta' del Desktop, il parametro passato e' nullo ("").

Windows 95 offre inoltre una opzione avanzata, e cioe' il "Preview" dello screen saver nella finestrella nelle proprieta' del Desktop. Quando si seleziona uno screen saver esso di solito si presenta, ridotto, in tale finestrella. Come ottenere questo risultato? Windows lancia il programma con la seguente linea di comando: "/p hDC". Questo significa che il programma conoscendo l'handle grafico della finestrella (corrispondente alla proprieta' hDC degli oggetti grafici in VB) puo' eseguire su di essa operazioni grafiche. Ovviemente bisogna passare attraverso chiamate alle API di Windows, ad esempio la utilissima BitBlt, che copia tra due contesti di periferica un'area rettangolare. Si puo' operare su un controllo PictureBox e copiare questo nel riquadro ad ogni modifica.
Un altro modo consiste nell'utilizzo del metodo Draw applicato ad un elemento di un controllo ImageList, ma solo se si vuole mantenere statica l'immagine della finestrella o basarsi comunque su immagini predefinite in fase di progettazione.

Inoltre, ogni screen saver al minimo movimento del mouse o pressione di tasti, termina, ritornando il focus al sistema. Bastera' mettere in ognuno di quest eventi del form di startup un'istruzione End, eccezion fatta che per l'evento MouseMove. Esso infatti viene generato alcune volte all'inizio dell'applicazione (il fatto stesso che il cursore del mouse si veda nascere sotto di se' una nuova finestra genera un MouseMove), quindi e' necessario evitare l'End per sei-otto volte dall'inizio, con una variabile contatore Static dichiarata nella sub.

Uno screen saver deve occupare tutto lo schermo, quindi non avere barra del titolo o bordi. Questo risultato si ottiene impostando le seguenti proprieta' del form:
BorderStyle=vbNone
Caption=""
ControlBox=False
WindowState=vbMaximized
MaxButton=False
MinButton=False
BackColor=*un colore qualunque riempira' lo schermo*

Creeremo anche un form secondario, contenente le informazioni sul setup dello screen saver, chiamato ad esempio Setup. Nella routine Form_Load della finestra principale si scrivera':
If Command = "/s" then
'niente...
ElseIf command = "/c" then
Setup.Show 1
End
Else
'parametri non corretti
End
End If

In tutti gli eventi di movimento o pressione di tasti si scrivera' End, mentre in _MouseMove:
Static count as integer
count=count+1
if count < 8 then exit sub
end

Per l'azione vera e propria, ossia ad esempio il disegnare forme ripetutamente sullo schermo, abbiamo due metodi: un Timer e un loop con DoEvents:

Il Timer e' piu' facile da implementare, ma brucia risorse di sistema e puo' non bastare ad ottenere certi risultati. Si tratta di impostare la sua proprieta' Interval su di un valore appropriato e scrivere del codice grafico nella routine _Timer:
Dim x as single, y as single
DrawWidth = (Rnd * 20) +1
x=Width * Rnd
y=Height * Rnd
PSet (x,y), QBColor (Rnd * 15)

Per evitare l'uso del Timer, e' opportuno scrivere un loop nella routine Form_Load, intervallato dall'istruzione DoEvents, che permette di generare altri eventi in contemporanea. In questo modo, pur proseguendo il loop, se viene premuto un tasto l'applicazione ha termine grazie ad un'istruzione End di un'altra routine:
Sub Form_Load ()
'scelta riga di comando...
Dim x as single, y as single
Randomize Timer
Do
DrawWidth = (Rnd * 20) + 1
x=Width * Rnd
y=Height * Rnd
PSet (x,y), QBColor (Rnd * 15)
DoEvents
Loop
End Sub

L'istruzione DoEvents implica che tutte le finestre in coda per essere ridisegnate vengano rinfrescate: non e' dunque necessario il metodo Refresh. Analogamente, con il Timer il tempo morto tra i due eventi consecutivi dell'orologio viene utilizzato allo stesso scopo: e' comunque opportuno rendere esplicita la visualizzazione del form all'inizio di _Load, per evitare che programmi con un certo tempo di inizializzazione non coprano immediatamente lo schermo.

Inizio Pagina | Home Page | AF's PORTAL | Contatti
Le diciture (Marchi, Aziende, etc) coperte da Copyright citate in queste pagine sono dei rispettivi proprietari. Il sito www.andreafabbrucci.it
NON responsabile del materiale presente in altri siti accessibili dai propri link che non rispettano le norme attualmente viggenti.