Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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
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.
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
PrivateSub Form1_ResizeBegin(sender AsObject, e As EventArgs)HandlesMe.ResizeBegin
Panel1.SuspendLayout()
EndSub
PrivateSub Form1_ResizeEnd(sender AsObject, e As EventArgs)HandlesMe.ResizeEnd
Panel1.ResumeLayout()
EndSub
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
PublicClass Form1
Dim Colore1 As Color = Color.Blue
Dim Colore2 As Color = Color.White
Dim BMP1 As Bitmap
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMe.Load
CreaSfondoBMP1(Colore1, Colore2)
EndSub
PrivateSub Button1_Click(sender AsObject, e As EventArgs)Handles Button1.Click
' swap dei colori
Dim col As Color = Colore1
Colore1 = Colore2
Colore2 = col
' nuova sfumatura
CreaSfondoBMP1(Colore1, Colore2)
EndSub
Sub CreaSfondoBMP1(_colore1 As Color, _colore2 As Color)
' altezza 255 perché sufficiente per contenere una sfumatura di qualità
Dim Altezza AsByte=255
' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
Dim Larghezza AsByte= 1
BMP1 =New Bitmap(Larghezza, Altezza)
Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush= _
New Drawing.Drawing2D.LinearGradientBrush( _
New Drawing.Point(Larghezza, Altezza), _
New Drawing.Point(Larghezza, -1), _colore1, _colore2)
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
PrivateSub Form1_ResizeBegin(sender AsObject, e As EventArgs)HandlesMe.ResizeBegin
Panel1.SuspendLayout()
EndSub
PrivateSub Form1_ResizeEnd(sender AsObject, e As EventArgs)HandlesMe.ResizeEnd
Panel1.ResumeLayout()
EndSub
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
PublicClass Form1
Dim Colore1 As Color = Color.Blue
Dim Colore2 As Color = Color.White
Dim BMP1 As Bitmap
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMe.Load
CreaSfondoBMP1(Colore1, Colore2)
EndSub
PrivateSub Button1_Click(sender AsObject, e As EventArgs)Handles Button1.Click
' swap dei colori
Dim col As Color = Colore1
Colore1 = Colore2
Colore2 = col
' nuova sfumatura
CreaSfondoBMP1(Colore1, Colore2)
EndSub
Sub CreaSfondoBMP1(_colore1 As Color, _colore2 As Color)
' altezza 255 perché sufficiente per contenere una sfumatura di qualità
Dim Altezza AsByte=255
' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
Dim Larghezza AsByte= 1
BMP1 =New Bitmap(Larghezza, Altezza)
Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush= _
New Drawing.Drawing2D.LinearGradientBrush( _
New Drawing.Point(Larghezza, Altezza), _
New Drawing.Point(Larghezza, -1), _colore1, _colore2)
' stretch, stira o comprime l'immagine fino a riempire tutto il form
obj.BackgroundImageLayout= ImageLayout.Stretch
EndSub
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
' stretch, stira o comprime l'immagine fino a riempire tutto il form
obj.BackgroundImageLayout= ImageLayout.Stretch
EndSub
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
Function CreaBMPsfumata(_colore1 As Color, _colore2 As Color)As Bitmap
' altezza 255 perché sufficiente per contenere una sfumatura di qualità
Dim Altezza AsByte=255
' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza
Dim Larghezza AsByte= 1
Dim BMPsfumata =New Bitmap(Larghezza, Altezza)
Dim Sfuma As Drawing.Drawing2D.LinearGradientBrush= _
New Drawing.Drawing2D.LinearGradientBrush( _
New Drawing.Point(Larghezza, Altezza), _
New Drawing.Point(Larghezza, -1), _colore1, _colore2)
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:
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: