Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Sfumare il backcolor di un form
Forum - C# / VB.NET - Sfumare il backcolor di un form

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
alip1 (Normal User)
Rookie


Messaggi: 37
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 9:19
Venerdì, 15/05/2020
Buongiorno a tutti
Volevo chiedervi se in qualche modo in vb.net (sto usando vs2012) sia possibile otennere una sfumatura del backcolor di un form.
Faccio un esempio supponiamo che abbia (in fase di progettazione) scelto come sfondo un colore GradientActiveCaption in fase di visualizzazione il colore tenda a sfumare verso il basso. Oppure che in alto sia ad esempio un celeste intenso e man mano verso il basso diventa un celeste più chiaro.

Grazie

Ultima modifica effettuata da alip1 il 15/05/2020 alle 9:20
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2007
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:05
Venerdì, 15/05/2020
Ciao alip buongiorno

Per sfumare il backcolor del form puoi agire in 2 modi.

Un modo quello di agire sul paint del form utilizzando il graphics e il LinearGradientBrush.
dove puoi anteporre i due colore da sfumare. il resto viene automaticamente.

Però agire direttamente sul form potrebbe causare dei sfraffallii grafici sul form.
anche impostando il Doppio Buffer.

Quello che ti consiglio e quello di creare un componente base Container tipo Panel.
Ed agire sul paint di quel quel componente e di impostare li all'initialize eventuali impostazioni di repaint sul controllo.

Control.Style( AllUserPaint | SupportDoubleBuffer etc.





PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 699
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:07
Venerdì, 15/05/2020
Per creare la sfumatura nessun problema, come già ti ha spiegato Thejuster, si crea con LinearGradientBrush.

I colori GradientActiveCaption e GradientInactiveCaption, non sono colori sfumati, ma i due colori che vengono usati per creare la fumatura della finestra attiva e inattiva.

Se si usa LinearGradientBrush in un evento Paint, al ridimensionamento del Form lo sfondo sfumato sfarfalla perché viene cancellato e ridisegnato più volte e il DoubleBuffer non risolve. Lo sfarfallio sarà più evidente su gli SplitContainer, e su PC con schede grafiche integrate.

Come soluzione puoi usare dei contenitori: Panel o SplitContainer, poi negli eventi Form1.ResizeBegin e Form1.ResizeEnd, sospendi il rinfresco del contenitore:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles Me.ResizeBegin
  2.         Panel1.SuspendLayout()
  3. End Sub
  4.  
  5. Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
  6.         Panel1.ResumeLayout()
  7. End Sub


Al ridimensionamento lo sfondo sfumato si congela nella dimensione attuale e verrà aggiornato solo quando il resize è terminato.

Un sistema banale per fare in modo che tutto il form abbia un sfondo sfumato è quello di mettere una BMP sfumata nella propreità BackgroundImage e attivare lo Stretch.
Con questo sistema lo sfondo sfumato non sfarfalla e si ridimensiona dinamicamente:
La BMP sfumata può anche essere velocemente creata da codice in modo da cambiare la sfumatura a piacere.
Per provare l'esempio, inserire un Button in form1

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Dim Colore1 As Color = Color.Blue
  3.     Dim Colore2 As Color = Color.White
  4.     Dim BMP1 As Bitmap
  5.  
  6.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  7.         CreaSfondoBMP1(Colore1, Colore2)
  8.     End Sub
  9.  
  10.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  11.         ' swap dei colori
  12.         Dim col As Color = Colore1
  13.         Colore1 = Colore2
  14.         Colore2 = col
  15.         ' nuova sfumatura
  16.         CreaSfondoBMP1(Colore1, Colore2)
  17.     End Sub
  18.  
  19.     Sub CreaSfondoBMP1(_colore1 As Color, _colore2 As Color)
  20.         ' altezza 255 perché sufficiente per contenere una sfumatura di qualità
  21.         Dim Altezza As Byte = 255
  22.         ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
  23.         Dim Larghezza As Byte = 1
  24.         BMP1 = New Bitmap(Larghezza, Altezza)
  25.  
  26.         Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush = _
  27.         New Drawing.Drawing2D.LinearGradientBrush( _
  28.         New Drawing.Point(Larghezza, Altezza), _
  29.         New Drawing.Point(Larghezza, -1), _colore1, _colore2)
  30.  
  31.         ' la sfumatura nella BMP
  32.         Graphics.FromImage(BMP1).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza)
  33.  
  34.         Me.BackgroundImage = BMP1
  35.         ' stretch, stira o comprime l'immagine fino a riempire tutto il form
  36.         Me.BackgroundImageLayout = ImageLayout.Stretch
  37.     End Sub
  38.  
  39. End Class


Ultima modifica effettuata da Carlo il 15/05/2020 alle 22:32


in programmazione tutto è permesso
PM Quote
Avatar
alip1 (Normal User)
Rookie


Messaggi: 37
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 17:36
Venerdì, 15/05/2020
Grazie tantissimo:hail:

PM Quote
Avatar
alip1 (Normal User)
Rookie


Messaggi: 37
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 9:55
Sabato, 16/05/2020
Testo quotato

Postato originariamente da Carlo:

Per creare la sfumatura nessun problema, come già ti ha spiegato Thejuster, si crea con LinearGradientBrush.

I colori GradientActiveCaption e GradientInactiveCaption, non sono colori sfumati, ma i due colori che vengono usati per creare la fumatura della finestra attiva e inattiva.

Se si usa LinearGradientBrush in un evento Paint, al ridimensionamento del Form lo sfondo sfumato sfarfalla perché viene cancellato e ridisegnato più volte e il DoubleBuffer non risolve. Lo sfarfallio sarà più evidente su gli SplitContainer, e su PC con schede grafiche integrate.

Come soluzione puoi usare dei contenitori: Panel o SplitContainer, poi negli eventi Form1.ResizeBegin e Form1.ResizeEnd, sospendi il rinfresco del contenitore:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles Me.ResizeBegin
  2.         Panel1.SuspendLayout()
  3. End Sub
  4.  
  5. Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
  6.         Panel1.ResumeLayout()
  7. End Sub


Al ridimensionamento lo sfondo sfumato si congela nella dimensione attuale e verrà aggiornato solo quando il resize è terminato.

Un sistema banale per fare in modo che tutto il form abbia un sfondo sfumato è quello di mettere una BMP sfumata nella propreità BackgroundImage e attivare lo Stretch.
Con questo sistema lo sfondo sfumato non sfarfalla e si ridimensiona dinamicamente:
La BMP sfumata può anche essere velocemente creata da codice in modo da cambiare la sfumatura a piacere.
Per provare l'esempio, inserire un Button in form1

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Dim Colore1 As Color = Color.Blue
  3.     Dim Colore2 As Color = Color.White
  4.     Dim BMP1 As Bitmap
  5.  
  6.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  7.         CreaSfondoBMP1(Colore1, Colore2)
  8.     End Sub
  9.  
  10.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  11.         ' swap dei colori
  12.         Dim col As Color = Colore1
  13.         Colore1 = Colore2
  14.         Colore2 = col
  15.         ' nuova sfumatura
  16.         CreaSfondoBMP1(Colore1, Colore2)
  17.     End Sub
  18.  
  19.     Sub CreaSfondoBMP1(_colore1 As Color, _colore2 As Color)
  20.         ' altezza 255 perché sufficiente per contenere una sfumatura di qualità
  21.         Dim Altezza As Byte = 255
  22.         ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
  23.         Dim Larghezza As Byte = 1
  24.         BMP1 = New Bitmap(Larghezza, Altezza)
  25.  
  26.         Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush = _
  27.         New Drawing.Drawing2D.LinearGradientBrush( _
  28.         New Drawing.Point(Larghezza, Altezza), _
  29.         New Drawing.Point(Larghezza, -1), _colore1, _colore2)
  30.  
  31.         ' la sfumatura nella BMP
  32.         Graphics.FromImage(BMP1).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza)
  33.  
  34.         Me.BackgroundImage = BMP1
  35.         ' stretch, stira o comprime l'immagine fino a riempire tutto il form
  36.         Me.BackgroundImageLayout = ImageLayout.Stretch
  37.     End Sub
  38.  
  39. End Class




Grazie

Volevo aggiungere questa notazione:
Ho, sulla base del codice di cui sopra, definita la seguente routine in modulo

Codice sorgente - presumibilmente VB.NET

  1. Sub SfumaSfondo(obj As Object, _colore1 As Color, _colore2 As Color)
  2.       ' altezza 255 perché sufficiente per contenere una sfumatura di qualità
  3.       Dim BMP1 As Bitmap
  4.       Dim Altezza As Byte = 255
  5.       ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
  6.       Dim Larghezza As Byte = 1
  7.       BMP1 = New Bitmap(Larghezza, Altezza)
  8.  
  9.       Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush = _
  10.       New Drawing.Drawing2D.LinearGradientBrush( _
  11.       New Drawing.Point(Larghezza, Altezza), _
  12.       New Drawing.Point(Larghezza, -1), _colore1, _colore2)
  13.  
  14.       ' la sfumatura nella BMP
  15.       Graphics.FromImage(BMP1).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza)
  16.  
  17.       obj.BackgroundImage = BMP1
  18.       ' stretch, stira o comprime l'immagine fino a riempire tutto il form
  19.       obj.BackgroundImageLayout = ImageLayout.Stretch
  20.    End Sub


Ora se passo come oggetto un form funziona alla grande. Se invece gli passo un controllo del form, ad esempio un groupbox, non funziona l'oggetto conserva il colore di progetto.  La chiamata della routine sia per il form che per grupbox viene fatta nel load del form.
Dove sarebbe il problema?
Grazie

Ultima modifica effettuata da alip1 il 16/05/2020 alle 9:56
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 699
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 13:27
Sabato, 16/05/2020
Testo quotato

Postato originariamente da alip1:

Volevo aggiungere questa notazione:
Ho, sulla base del codice di cui sopra, definita la seguente routine in modulo

Codice sorgente - presumibilmente VB.NET

  1. Sub SfumaSfondo(obj As Object, _colore1 As Color, _colore2 As Color)
  2.       ' altezza 255 perché sufficiente per contenere una sfumatura di qualità
  3.       Dim BMP1 As Bitmap
  4.       Dim Altezza As Byte = 255
  5.       ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
  6.       Dim Larghezza As Byte = 1
  7.       BMP1 = New Bitmap(Larghezza, Altezza)
  8.  
  9.       Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush = _
  10.       New Drawing.Drawing2D.LinearGradientBrush( _
  11.       New Drawing.Point(Larghezza, Altezza), _
  12.       New Drawing.Point(Larghezza, -1), _colore1, _colore2)
  13.  
  14.       ' la sfumatura nella BMP
  15.       Graphics.FromImage(BMP1).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza)
  16.  
  17.       obj.BackgroundImage = BMP1
  18.       ' stretch, stira o comprime l'immagine fino a riempire tutto il form
  19.       obj.BackgroundImageLayout = ImageLayout.Stretch
  20.    End Sub


Ora se passo come oggetto un form funziona alla grande. Se invece gli passo un controllo del form, ad esempio un groupbox, non funziona l'oggetto conserva il colore di progetto.  La chiamata della routine sia per il form che per grupbox viene fatta nel load del form.
Dove sarebbe il problema?
Grazie



La routine sembra giusta, scusa ma ora non la posso controllare, un'ipotesi è che al load del form è troppo presto lanciare la routine,
cambia:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
con:
Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated
o ancora più tardi:
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

Però prova ad usare una funzione, che forse è concettualmente più corretta:

Codice sorgente - presumibilmente VB.NET

  1. Function CreaBMPsfumata(_colore1 As Color, _colore2 As Color) As Bitmap
  2.         ' altezza 255 perché sufficiente per contenere una sfumatura di qualità
  3.         Dim Altezza As Byte = 255
  4.         ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
  5.         Dim Larghezza As Byte = 1
  6.         Dim BMPsfumata = New Bitmap(Larghezza, Altezza)
  7.  
  8.         Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush = _
  9.         New Drawing.Drawing2D.LinearGradientBrush( _
  10.         New Drawing.Point(Larghezza, Altezza), _
  11.         New Drawing.Point(Larghezza, -1), _colore1, _colore2)
  12.  
  13.         ' la sfumatura nella BMP
  14.         Graphics.FromImage(BMPsfumata).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza)
  15.         Return BMPsfumata
  16. End Function


La funzione restituisce una BMP 1x255, sfumata con i colori assegnati, esempio d'uso:

Dim Colore1 As Color = Color.Blue
Dim Colore2 As Color = Color.White

Panel1.BackgroundImage = CreaBMPsfumata(Colore1, Colore2)
Panel1.BackgroundImageLayout = ImageLayout.Stretch

Controlla eventuali errori di sintassi, non ho controllato il codice

EDIT:
Ho controllato la tua routine, funziona correttamente, anche se lanciata su Form.Load per impostare lo sfondo sfumato ad un GroupBox!

Ultima modifica effettuata da Carlo il 16/05/2020 alle 15:53


in programmazione tutto è permesso
PM Quote
Avatar
alip1 (Normal User)
Rookie


Messaggi: 37
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 16:23
Sabato, 16/05/2020
Postato originariamente da Carlo:

Postato originariamente da alip1:


Però prova ad usare una funzione, che forse è concettualmente più corretta:

Codice sorgente - presumibilmente VB.NET

  1. Function CreaBMPsfumata(_colore1 As Color, _colore2 As Color) As Bitmap
  2.         ' altezza 255 perché sufficiente per contenere una sfumatura di qualità
  3.         Dim Altezza As Byte = 255
  4.         ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
  5.         Dim Larghezza As Byte = 1
  6.         Dim BMPsfumata = New Bitmap(Larghezza, Altezza)
  7.  
  8.         Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush = _
  9.         New Drawing.Drawing2D.LinearGradientBrush( _
  10.         New Drawing.Point(Larghezza, Altezza), _
  11.         New Drawing.Point(Larghezza, -1), _colore1, _colore2)
  12.  
  13.         ' la sfumatura nella BMP
  14.         Graphics.FromImage(BMPsfumata).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza)
  15.         Return BMPsfumata
  16. End Function


La funzione restituisce una BMP 1x255, sfumata con i colori assegnati, esempio d'uso:

Dim Colore1 As Color = Color.Blue
Dim Colore2 As Color = Color.White

Panel1.BackgroundImage = CreaBMPsfumata(Colore1, Colore2)
Panel1.BackgroundImageLayout = ImageLayout.Stretch

Controlla eventuali errori di sintassi, non ho controllato il codice
----------------

Grazie Carlo, volevo dirti che l'ho provata richiamandola nell'evento load del form per sfumare lo sfondo del form e mi funziona. Poi nell'evento show del form ho messo:
Codice sorgente - presumibilmente Plain Text

  1. gbInfo.BackgroundImage = CreaBMPsfumata(Color.LightBlue, Color.White)
  2.  gbInfo.BackgroundImageLayout = ImageLayout.Stretch


gbInfo è un groupbox, per il quale non funziona, mantiene il colore di progetto.

Ultima modifica effettuata da alip1 il 16/05/2020 alle 16:26
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 699
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:43
Sabato, 16/05/2020
Testo quotato

Postato originariamente da alip1:
Grazie Carlo, volevo dirti che l'ho provata richiamandola nell'evento load del form per sfumare lo sfondo del form e mi funziona. Poi nell'evento show del form ho messo:
Codice sorgente - presumibilmente Plain Text

  1. gbInfo.BackgroundImage = CreaBMPsfumata(Color.LightBlue, Color.White)
  2.  gbInfo.BackgroundImageLayout = ImageLayout.Stretch


gbInfo è un groupbox, per il quale non funziona, mantiene il colore di progetto.


Tutti gli esempi funzionano, anche con il GroupBox e anche se la funzione viene richiamata nell'evento load del form, l'errore è da un'altra parte.

Controlla la proprietà FlatStyle del GroupBox, se è impostata a System l'immagine di fondo non viene visualizzata....

Ultima modifica effettuata da Carlo il 16/05/2020 alle 16:56


in programmazione tutto è permesso
PM Quote
Avatar
alip1 (Normal User)
Rookie


Messaggi: 37
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 8:24
Domenica, 17/05/2020
Testo quotato

Postato originariamente da Carlo:

Tutti gli esempi funzionano, anche con il GroupBox e anche se la funzione viene richiamata nell'evento load del form, l'errore è da un'altra parte.

Controlla la proprietà FlatStyle del GroupBox, se è impostata a System l'immagine di fondo non viene visualizzata....



Grazie Carlo in effetti era impostato a system ora l'ho messo a standard. Ma secondo te qual'è l'impostazione migliore tra flat,popup e standard?

Ancora 1 precisazione è possibile rendere un controllo trasparente?
Grazie per la sua attenzione e cortesia:love:

Ultima modifica effettuata da alip1 il 17/05/2020 alle 8:37
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo