Newsgroup: it.comp.lang.visual-basic
Titolo: Come si fanno gli screen-saver?

E' possibile creare degli screen saver con VB 5.0 (screen-saver tipo
slideshow)?
Grazie!
Guido Revello

...


...


>Ciao.
C'e' anche un articolo sul Sito Comune che spiega bene come farli, con tanto
di esempio pratico.
http://www.murialdo.it/it_lang_vb
Ciao
By -MES-   Maronese Ettore
http://ilmes.freeweb.org
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb

...


Ciao,
ti riporto un tip trovato nel file Tips and trick visual basic 
32 ver. 1.0 di Sardi Fabio:
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
Corrado Paoletti
ICQ 7044062