lunedì 14 luglio 2008

Creazione di un salva schermo con .Net (VB.Net e C#)

Riporto un articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/creare-screen-saver-con-vbnet.asp



Figura 1


Introduzione


In questo articolo vedremo come creare un salva schermo, per il nostro computer, in particolare si crea un screen saver, il quale visualizza un immagine (una schacchiera) che verrà visualizzata in diverse parti dello schermo, ogni n secondi.

Il salva shermo è una funzionalità di Windows, che permette, se attività, che dopo n minuti di visualizzare delle animazioni quando il pc è inattivo.

I file Screen Saver, hanno come estensione .scr e si trovano nella cartella C:\WINDOWS\system32, in questo modo comparirà nella lista dei screnne Saver, della finestra proprietà.


Inoltre il nostro Salva Schermo farà uso di una finestra delle opzioni, per impostare alcuni parametri, tra i quali, avremo la possibilità di impostare la velocità per il cambiamento della posizione, impostare un immagine e il colore di sfondo.


Creazione della classe Opzioni



Si apra Visual Studio 2005 e si crea un nuovo progetto di tipo Windows Application, scelto il linguaggio di proprio interesse (VB.Net o C#) verrà creato un nuovo progetto, con una form.


Si aggiunge al progetto una classe, tale classe ha il compito di gestire le informazioni riguardante il salva schermo, le opzioni che si potranno modificare nella finestra delle proprietà dello schermo, in particolare nel tab screen saver.


La classe sarà di tipo serializer, in questo modo si possono gestire le impostazioni tramite un file in modalità XML.


La classe avrà tre proprietà di tipo testo, una per la gestione del percorso e nome del file immagine, una per il colore dello sfondo della form e l’latra per la gestione della velocità del cambiamento della posizione dell’immagine.


VB.Net


Imports System.Xml.Serialization


Imports System.Xml


Imports System.IO


''' <summary>


''' Classe serializzata


''' </summary>


''' <remarks></remarks>


<Serializable()> Public Class Opzioni



#Region "Campi"


Private m_Velocita As String = "Media" 'Alta - Media - Bassa


Private m_Sfondo As String = "Blue" 'Colore sfondo


Private m_FileImmagine As String = Environment.CurrentDirectory & "\sfondo.jpg"


Private PercorsoOpzioni As String = Environment.CurrentDirectory & "\SalvaSchermoOpzioni.opt"



#End Region



#Region "Proprietà"


''' <summary>


''' Proprietà pr la gestione delle velocità di esecuzione dello spostamento nello schermo


''' </summary>


''' <value></value>


''' <returns></returns>


''' <remarks></remarks>


Public Property Velocita() As String


Get


Return m_Velocita


End Get


Set(ByVal value As String)


m_Velocita = value


End Set


End Property


''' <summary>


''' Colore di sfondo


''' </summary>


''' <value></value>


''' <returns></returns>


''' <remarks></remarks>


Public Property Colore_Sfondo() As String


Get


Return m_Sfondo


End Get


Set(ByVal value As String)


m_Sfondo = value


End Set


End Property


''' <summary>


''' Percorso e nome del file immagine che verrà visualizzato


''' </summary>


''' <value></value>


''' <returns></returns>


''' <remarks></remarks>


Public Property Immagine() As String


Get


Return m_FileImmagine


End Get


Set(ByVal value As String)


m_FileImmagine = value


End Set


End Property



#End Region



#Region "Funzioni"


Public Function FileOpzioniEsistente() As Boolean


Dim fileOpz As New System.IO.FileInfo(PercorsoOpzioni)


Return fileOpz.Exists()


End Function


Public Sub CaricaOpzioni()


Dim MyOpzioni As New Opzioni()



' Verifico che il file esista


If MyOpzioni.FileOpzioniEsistente() Then





' Oggetto di tipo serializzato


Dim mySerializer As New XmlSerializer(GetType(Opzioni))


' Leggo il file xml .opt


Dim TextReader As New StreamReader(PercorsoOpzioni)


' Oggetto xml per la lettura delle opzoni


Dim XmlReader As New Xml.XmlTextReader(TextReader)



' Verifico che il formato è conforme


If mySerializer.CanDeserialize(XmlReader) Then


' Deserializzo oggetto


MyOpzioni = CType(mySerializer.Deserialize(XmlReader), Opzioni)


Else


' Salvo il file opzioni


MyOpzioni.SalvaOpzioni()


End If



' Chiudo gli oggetti.


XmlReader.Close()


TextReader.Close()



' Imposto i vari valori


Me.Velocita = MyOpzioni.Velocita


Me.Colore_Sfondo = MyOpzioni.Colore_Sfondo


Me.Immagine = MyOpzioni.Immagine


End If


End Sub




Public Sub SalvaOpzioni()


' oggetto per la scrittura dei dati


Dim myWriter As New System.IO.StreamWriter(PercorsoOpzioni)



'oggetto serializzato


Dim myXmlSerializer As New XmlSerializer(Me.GetType())



'Serializzo l'oggetto


myXmlSerializer.Serialize(myWriter, Me)




myWriter.Close()




End Sub


#End Region




End Class



C#



using System;


using System.Collections.Generic;


using System.Text;


using System.Xml.Serialization;


using System.Xml;


using System.IO;



namespace WinSalvaSchermoCS


{


[Serializable]


public class Opzioni


{




#region Campi


private string m_Velocita = "MEDIA"; // Alta - Media - Bassa


private string m_Sfondo = "BLUE"; //Colore sfondo


private string m_FileImmagine = Environment.CurrentDirectory + "\\sfondo.jpg";


private string PercorsoOpzioni = Environment.CurrentDirectory + "\\SalvaSchermoOpzioni.opt";



#endregion




#region Proprietà


public string Immagine


{


get { return m_FileImmagine; }


set { m_FileImmagine = value; }


}


public string Colore_Sfondo


{


get { return m_Sfondo; }


set { m_Sfondo = value; }


}


public string Velocita


{


get { return m_Velocita; }


set { m_Velocita = value; }


}


#endregion




#region Funzioni


public bool FileOpzioniEsistente()


{



FileInfo fileOpz = new FileInfo(PercorsoOpzioni);


return fileOpz.Exists ;


}





public void CaricaOpzioni()


{


Opzioni MyOpzioni = new Opzioni();




// Verifico che il file esista


if (MyOpzioni.FileOpzioniEsistente())


{





//Oggetto di tipo serializzato


XmlSerializer mySerializer = new XmlSerializer( typeof(WinSalvaSchermoCS.Opzioni));


// Leggo il file xml .opt


StreamReader TextReader = new StreamReader(PercorsoOpzioni);


// Oggetto xml per la lettura delle opzoni


System.Xml.XmlTextReader XmlReader = new System.Xml.XmlTextReader(TextReader);



// Verifico che il formato è conforme


if (mySerializer.CanDeserialize(XmlReader))


{// Deserializzo oggetto


MyOpzioni = (Opzioni)(mySerializer.Deserialize(XmlReader));


}


else


{


// Salvo il file opzioni


MyOpzioni.SalvaOpzioni();


}





// Chiudo gli oggetti.


XmlReader.Close();


TextReader.Close();



// Imposto i vari valori


this.Velocita = MyOpzioni.Velocita;


this.Colore_Sfondo = MyOpzioni.Colore_Sfondo;


this.Immagine = MyOpzioni.Immagine;


}


}




public void SalvaOpzioni()


{



// oggetto per la scrittura dei dati


StreamWriter myWriter = new StreamWriter(PercorsoOpzioni);



//oggetto serializzato


XmlSerializer myXmlSerializer = new XmlSerializer(this.GetType());



//Serializzo l'oggetto


myXmlSerializer.Serialize(myWriter, this);



myWriter.Close();



}






#endregion







}


}



Creazione della finestra opzioni

Dopo aver creato la classe che permette la gestione delle opzioni, non ci resta che creare una finestra, nella quale sarà possibile impostare i parametri del nostro salva schermo.

La finestra è composta da una casella combinata per impostare la velocità dello spostamento dell’immagine nello schermo, un controllo di tipo option button per impostare il colore di sfondo (rosso, verde e blu) una casella di testo ed un pulsante per la selezione dell’immagine, ed un controllo pciturebox, che avrà il compito di visualizzare l’anteprima dell’immagine.

Nella figura 2 è mostrata l’impostazione di tale finestra.


Figura2


Il pulsante annulla, avrà il compito di chiudere la finestra.

Di seguito si riporta il frammento di codice di tale pulsante

VB.Net


Me.Close()


C#


this.Close();


Nell’evento load della form, verranno caricati i dati salvati in precedenza.

Tramite il metodo caricaopzioni, della classe opzioni, verrà valorizzato l’oggetto opzioni, con i dati rilevati dal file di configurazione.

Dopo tale operazione, verranno valorizzati i vari controlli posti sulla form.

Di seguito si riporta il frammento di codice da inserire nell’evento load.


VB.Net


'Carico i dati


Dim fileOpzioni As New Opzioni()


fileOpzioni.CaricaOpzioni()


'imposto il colore


Select Case fileOpzioni.Colore_Sfondo.ToUpper()


Case "BLU"


rdbBlu.Checked = True


Case "VERDE"


RdbVerde.Checked = True



Case "ROSSO"


rdbRosso.Checked = True



End Select


'Imposto la velocità


cmbVelocita.Text = fileOpzioni.Velocita


'Percorso foto


txtNomeFile.Text = fileOpzioni.Immagine


If fileOpzioni.Immagine.Trim() <> "" Then


PictureBox1.ImageLocation = fileOpzioni.Immagine


End If


C#


//Carico i dati


Opzioni fileOpzioni = new Opzioni();


fileOpzioni.CaricaOpzioni();


//imposto il colore


switch (fileOpzioni.Colore_Sfondo.ToUpper())


{


case "BLU":


rdbBlu.Checked = true;


break;


case "VERDE":


RdbVerde.Checked = true;


break;


case "ROSSO":


rdbRosso.Checked = true;


break;


}


//Imposto la velocità


cmbVelocita.Text = fileOpzioni.Velocita;


//Percorso foto


txtNomeFile.Text = fileOpzioni.Immagine;


if (fileOpzioni.Immagine.Trim() != "")


PictureBox1.ImageLocation = fileOpzioni.Immagine;




Il pulsante con il testo dei tre puntini “…” permette di visualizzare una finestra di dialogo per la selezione dell’immagine (jpg o gif).

Impostando la proprietà RestoreDirectory a true permetterà di mantenere le informazioni rilevate, in questo modo, quando andremo a salvare il file di configurazione, le modifiche verranno apportate altrimenti, se impostato a false, nessuna modifica verrà effettuata.

Dopo aver selezionato il file immagine, verrà riportato nella casella di testo il percorso e nome del file immagine, mentre nel controllo picturebox verrà visualizzata l’immagine.

Di seguito si riporta il frammento di codice delle suddette operazioni.


VB.Net


'Carico nella casella di testo il nome ed il percorso del file


Dim dlgFile As New OpenFileDialog()


dlgFile.Filter = "*.Jpg*.Jpg*.gif*.gif*.bmp*.bmp"


dlgFile.Title = "Selezionare il file immagine che si vuole impostare come immagine di salvaschermo"


dlgFile.RestoreDirectory = True


If dlgFile.ShowDialog() = Windows.Forms.DialogResult.OK Then


txtNomeFile.Text = dlgFile.FileName


PictureBox1.ImageLocation = txtNomeFile.Text


End If



C#


//Carico nella casella di testo il nome ed il percorso del file


OpenFileDialog dlgFile = new OpenFileDialog();


dlgFile.Filter = "*.Jpg*.Jpg*.gif*.gif*.bmp*.bmp";


dlgFile.Title = "Selezionare il file immagine che si vuole impostare come immagine di salvaschermo";


dlgFile.RestoreDirectory = true;


if (dlgFile.ShowDialog() == DialogResult.OK)


{


txtNomeFile.Text = dlgFile.FileName;


PictureBox1.ImageLocation = txtNomeFile.Text;


}


Per concludere le operazioni su questa form(opzioni), non ci resta che scrivere il codice per il pulsante ok, il quale dovrà salvare le impostazioni per il nostro salva schermo. Tramite il metodo SalvaOpzioni, salveremo i valori impostati nelle varie proprietà (colore_sfondo, velocità ed immagine) nel file di configurazione.
Il codice dev’essere simile a quello riportato qui di seguito.


VB.Net


Dim FileOpzioni As New Opzioni()


If rdbBlu.Checked = True Then


FileOpzioni.Colore_Sfondo = "BLU"


ElseIf RdbVerde.Checked = True Then


FileOpzioni.Colore_Sfondo = "VERDE"


Else


FileOpzioni.Colore_Sfondo = "ROSSO"


End If


PictureBox1.ImageLocation = ""


FileOpzioni.Velocita = cmbVelocita.Text


FileOpzioni.Immagine = txtNomeFile.Text


FileOpzioni.SalvaOpzioni()


Me.Close()


C#



Opzioni FileOpzioni = new Opzioni();


if (rdbBlu.Checked == true)


FileOpzioni.Colore_Sfondo = "Blu";


else if (RdbVerde.Checked == true)


FileOpzioni.Colore_Sfondo = "Verde";


else


FileOpzioni.Colore_Sfondo = "Rosso";


PictureBox1.ImageLocation = "";


FileOpzioni.Velocita = cmbVelocita.Text;


FileOpzioni.Immagine = txtNomeFile.Text;


FileOpzioni.SalvaOpzioni();


this.Close();


Creazione della finestra Screen Saver


A questo punto non ci resta che scrivere la finestra per il nostro screen saver. La form, del salvaschermo, avrà impostato la proprietà FormBorderStyle in none, mentre la proprietà TopMost sarà impostato a true, e la proprietà WindowState a maximized.

Fatto ciò inseriamo nella form un controllo picturebox, il quale visualizza la nostra immagine, rilevandola nel nostro file di opzioni, ed un controllo per la gestione del tempo, ossia un timer.

Dichiariamo a livello di form le variabili per la gestione della grafica, per il posizionamento del controllo picturebox e per la gestione del mouse.

Di seguito si riporta la dichiarazone di tali campi.


VB.Net


' oggetto per la grafica


Private m_Graphics As Graphics


'Oggetto per le opzioni


Private m_Opzioni As New Opzioni()


' per la prima impostazione


Private m_Attivo As Boolean = False


'verifico lo spostamento del mouse


Private m_MousePosizione As Point


'oggetto per cambiare di volta in volta le coordinate


Private m_Random As New Random()




C#


// oggetto per la grafica


private Graphics m_Graphics;


//Oggetto per le opzioni


private Opzioni m_Opzioni = new Opzioni();


// per la prima impostazione quando si avvia lo screnn saver


private bool m_Attivo = false;


// verifico lo spostamento del mouse


private Point m_MousePosizione;


//oggetto per cambiare di volta in volta le coordinate


private Random m_Random = new Random();




Il nostro programma, sarà avviato tramite un opportuno metodo, questa funzione denominata main, avrà il compito di accettare un argomento, in base al parametro passato, verrà visualizzata o la finestra del salva schermo oppure quelle delle opzioni.

Infatti la finestra delle proprietà dello schermo di Windows, per avviare un salvaschermo, passa degli argomenti, la c sta per opzioni, mentre la s sta per salva schermo, mentre la p, permette l'anteprima del salva schermo.

Di seguito si riporta il frammento di codice di tale operazioni.


VB.Net


' Programma di avvio - startup del progetto


<STAThread()> Shared Sub Main(ByVal args As String())



' Verifico l'argomento che viene passato /c = opzioni /s screnn saver /p da anteprima


If args.Length > 0 Then


'Anteprima


If args(0).ToLower = "/p" Then


' da personalizzare anteprima quando viene selezionato dalla finestra screnne saver il nome.





Application.Exit()


End If



'finestra delle opzioni


If args(0).ToLower.Trim().Substring(0, 2) = "/c" Then


Dim FrmOpzioni As New FrmOpzioni()


FrmOpzioni.ShowDialog()




Application.Exit()


End If



' avvio lo screen saver


If args(0).ToLower = "/s" Then



Dim ScreenForm As New Form1()


ScreenForm.ShowDialog()


Application.Exit()


End If




Else


'in caso di doppio click


Dim ScreenForm As New Form1()


ScreenForm.ShowDialog()




Application.Exit()


End If


End Sub


C#


[STAThread]


static void Main(string[] args)


{



// Verifico l'argomento che viene passato /c = opzioni /s screnn saver /p da anteprima


if (args.Length > 0)


{


//Anteprima


if (args[0].ToLower() == "/p")


{


// da personalizzare anteprima quando viene selezionato dalla finestra screnne saver il nome.





Application.Exit();


}


//finestra delle opzioni


if (args[0].ToLower().Trim().Substring(0, 2) == "/c")


{


FrmOpzioni FrmOpzioni = new FrmOpzioni();


FrmOpzioni.ShowDialog();




Application.Exit();


}



// avvio lo screen saver


if (args[0].ToLower() == "/s")


{



Form1 ScreenForm = new Form1();


ScreenForm.ShowDialog();


Application.Exit();


}



}


else


{


//in caso di doppio click


Form1 ScreenForm = new Form1();


ScreenForm.ShowDialog();



Application.Exit();


}



}




Nell’evento load della finestra per visualizzare il screen saver, verrà creato un oggetto di tipo opzioni, che tramite il metodo carica dati, imposta la form con i parametri impostati. Verrà impostato la velocità di spostamento dell’immagine, l’immagine da visualizzare ed il colore dello sfondo della form.

Inoltre verrà avviato il timer.

Di seguito si riporta il codice delle suddette operazoni.

VB.Net


'oggetto per la creazione grafica


Me.m_Graphics = Me.CreateGraphics()



'rilevo le opzioni


m_Opzioni.CaricaOpzioni()


PictureBox1.ImageLocation = m_Opzioni.Immagine



'imposto il tempo


Select Case m_Opzioni.Velocita.ToUpper()


Case "VELOCE"


tmrAggiornamento.Interval = 1000


Case "MEDIA"


tmrAggiornamento.Interval = 500


Case "LENTA"


tmrAggiornamento.Interval = 200


End Select


'rilevo il colore di sfondo


Select Case m_Opzioni.Colore_Sfondo.ToUpper()


Case "BLU"


Me.BackColor = Color.Blue


Case "VERDE"


Me.BackColor = Color.Green


Case "ROSSO"


Me.BackColor = Color.Red


End Select



'Abilito il timer


tmrAggiornamento.Enabled = True


C#


//oggetto per la creazione grafica


this.m_Graphics = this.CreateGraphics();



//rilevo le opzioni


m_Opzioni.CaricaOpzioni();


PictureBox1.ImageLocation = m_Opzioni.Immagine;



//imposto il tempo


switch (m_Opzioni.Velocita.ToUpper())


{


case "VELOCE":


tmrAggiornamento.Interval = 1000;


break;


case "MEDIA":


tmrAggiornamento.Interval = 500;


break;


case "LENTA":


tmrAggiornamento.Interval = 200;


break;


}


//rilevo il colore di sfondo


switch (m_Opzioni.Colore_Sfondo.ToUpper())


{


case "BLU":


this.BackColor = Color.Blue;


break;


case "VERDE":


this.BackColor = Color.Green;


break;


case "ROSSO":


this.BackColor = Color.Red;


break;


}


//Abilito il timer


tmrAggiornamento.Enabled = true;



Nell’evento tick del controllo timer verrà richiamata la funzione Visualizzare, che avrà il compito di visualizzare l'immagine, con le impostazioni effettuate.

Di seguito si riporta il codice dell’evento tick del controllo timer.



VB.Net


Private Sub tmrAggiornamento_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAggiornamento.Tick


Visualizza()


End Sub



C#


private void tmrAggiornamento_Tick(object sender, EventArgs e)


{


Visualizza();


}




Quando si sposta il mouse oppure si digita un suo pulsante, occorre chiudere il nostro applicativo, tramite gli eventi mousemove e mouse down della nostra form, possiamo controllare tale situazione per chiudere il programma.

Di seguito si riporta il frammento di codice per l’evento mousemove:


VB.Net


Private Sub Form1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove


If Not m_Attivo Then


Me.m_MousePosizione = New Point(e.X, e.Y)


m_Attivo = True


Else


If Math.Abs(e.X - Me.m_MousePosizione.X) > 10 Or _


Math.Abs(e.Y - Me.m_MousePosizione.Y) > 10 Then


'Esco dal programma


Application.Exit()


End If


End If


End Sub


C#


private void Form1_MouseMove(object sender, MouseEventArgs e)


{


if (!m_Attivo)


{


this.m_MousePosizione = new Point(e.X, e.Y);


m_Attivo = true;


}


else


{


if (Math.Abs(e.X - this.m_MousePosizione.X) > 10 && Math.Abs(e.Y - this.m_MousePosizione.Y) > 10)


{


//Esco dal programma


Application.Exit();


}


}


}




Mentre qui di seguito si riporta il frammento di codice per l’evento MouseDown:


VB.Net


Private Sub Form1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown


Application.Exit()


End Sub



C#


private void Form1_MouseDown(object sender, MouseEventArgs e)


{


Application.Exit();


}


La funzione visualizza, avrà il compito di impostare le coordinate, o meglio la posizione della picturebox in varie parti dello schermo. Tramite la classe random, impostiamo un numero causale relativo alle coordinate.


Di seguito si riporta lo script per la funzione Visualizza.


VB.Net


Private Sub Visualizza()


' Dimensione della form


Dim maxX As Integer = Me.Width


Dim maxY As Integer = Me.Height


' Coordinate random dinamiche


Dim x1, x2, y1, y2 As Integer




'Genero il numero delle coordinate


x1 = m_Random.Next(0, maxX)


x2 = m_Random.Next(0, maxX)



y1 = m_Random.Next(0, maxY)


y2 = m_Random.Next(0, maxY)





'imposto le coordinate


If y1 < 500 Then y1 = 400


PictureBox1.Top = y1 - PictureBox1.Height


If x1 < 400 Then x1 = 400


PictureBox1.Left = x1 - PictureBox1.Width



End Sub


C#


private void Visualizza()


{


//Dimensione della form


Int32 maxX = this.Width;


Int32 maxY = this.Height;


// Coordinate random dinamiche


Int32 x1, x2, y1, y2;




//Genero il numero delle coordinate


x1 = m_Random.Next(0, maxX);


x2 = m_Random.Next(0, maxX);



y1 = m_Random.Next(0, maxY);


y2 = m_Random.Next(0, maxY);





//imposto le coordinate


if (y1 < 500)


y1 = 400;


PictureBox1.Top = y1 - PictureBox1.Height;


if (x1 < 400)


x1 = 400;


PictureBox1.Left = x1 - PictureBox1.Width;



}


Impostazioni e test del nostro salva schermo.

A questo punto non ci resta che testare il nostro salva schermo, compiliamo in modalità realese, se volete fare il debug, lasciate modalità debug.

Nelle proprietà del progetto, impostate il progetto di avvio, con il metodo main. Inoltre per il linguaggio VB.Net, impostate per la scheda “compile” compilazione, La voce implicit conversion e late binding call could fail at run time a none.

Mentre nella finestra assembly information (tramite il pulsante con la scritta "Assembly Information") spuntate il checkbox quello relativo a make assembly com-visible.

Dopo aver compilato il progetto, rinominate il file exe in .scr e copiatelo nella cartella C:\WINDOWS\system32 (qualora il sistema operativo è installato in tale unità).

Aprire la finestra delle proprietà dello schermo, nel tab Screen Saver, selezionate dall’elenco dei salva schermo, il vostro salva schermo appena creato, digitate il pulsante prova, per verificare le corrette impostazioni.

Conclusioni:

In questo articolo si è visto come creare un semplice salva schermo, che visualizza un immagine in diverse posizione dello schermo. Questo articolo ha fornito al lettore le basi per la creazione di un salva schermo, naturalmente si può ampliare, migliorare con effetti avanzati.

Tramite la parola download è possibile scaricare il file di esempio utilizzato in questo articolo.

Download




Nessun commento: