15/05/20 8:05
Thejuster
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.
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.
mire.forumfree.it/ - Mire Engine
C# UI Designer
C# UI Designer
15/05/20 13:07
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:
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
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:
Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles Me.ResizeBegin Panel1.SuspendLayout() End Sub Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd Panel1.ResumeLayout() 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
Public Class Form1 Dim Colore1 As Color = Color.Blue Dim Colore2 As Color = Color.White Dim BMP1 As Bitmap Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load CreaSfondoBMP1(Colore1, Colore2) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' swap dei colori Dim col As Color = Colore1 Colore1 = Colore2 Colore2 = col ' nuova sfumatura CreaSfondoBMP1(Colore1, Colore2) End Sub Sub CreaSfondoBMP1(_colore1 As Color, _colore2 As Color) ' altezza 255 perché sufficiente per contenere una sfumatura di qualità Dim Altezza As Byte = 255 ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza Dim Larghezza As Byte = 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) ' la sfumatura nella BMP Graphics.FromImage(BMP1).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza) Me.BackgroundImage = BMP1 ' stretch, stira o comprime l'immagine fino a riempire tutto il form Me.BackgroundImageLayout = ImageLayout.Stretch End Sub End Class
Ultima modifica effettuata da Carlo 15/05/20 20:32
in programmazione tutto è permesso
16/05/20 7:55
alip1
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:
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
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:
Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles Me.ResizeBegin Panel1.SuspendLayout() End Sub Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd Panel1.ResumeLayout() 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
Public Class Form1 Dim Colore1 As Color = Color.Blue Dim Colore2 As Color = Color.White Dim BMP1 As Bitmap Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load CreaSfondoBMP1(Colore1, Colore2) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' swap dei colori Dim col As Color = Colore1 Colore1 = Colore2 Colore2 = col ' nuova sfumatura CreaSfondoBMP1(Colore1, Colore2) End Sub Sub CreaSfondoBMP1(_colore1 As Color, _colore2 As Color) ' altezza 255 perché sufficiente per contenere una sfumatura di qualità Dim Altezza As Byte = 255 ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza Dim Larghezza As Byte = 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) ' la sfumatura nella BMP Graphics.FromImage(BMP1).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza) Me.BackgroundImage = BMP1 ' stretch, stira o comprime l'immagine fino a riempire tutto il form Me.BackgroundImageLayout = ImageLayout.Stretch End Sub End Class
Grazie
Volevo aggiungere questa notazione:
Ho, sulla base del codice di cui sopra, definita la seguente routine in modulo
Sub SfumaSfondo(obj As Object, _colore1 As Color, _colore2 As Color) ' altezza 255 perché sufficiente per contenere una sfumatura di qualità Dim BMP1 As Bitmap Dim Altezza As Byte = 255 ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza Dim Larghezza As Byte = 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) ' la sfumatura nella BMP Graphics.FromImage(BMP1).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza) obj.BackgroundImage = BMP1 ' stretch, stira o comprime l'immagine fino a riempire tutto il form obj.BackgroundImageLayout = ImageLayout.Stretch 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 16/05/20 7:56
aaa
16/05/20 11:27
Carlo
Postato originariamente da alip1:
Volevo aggiungere questa notazione:
Ho, sulla base del codice di cui sopra, definita la seguente routine in modulo
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
Volevo aggiungere questa notazione:
Ho, sulla base del codice di cui sopra, definita la seguente routine in modulo
Sub SfumaSfondo(obj As Object, _colore1 As Color, _colore2 As Color) ' altezza 255 perché sufficiente per contenere una sfumatura di qualità Dim BMP1 As Bitmap Dim Altezza As Byte = 255 ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza Dim Larghezza As Byte = 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) ' la sfumatura nella BMP Graphics.FromImage(BMP1).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza) obj.BackgroundImage = BMP1 ' stretch, stira o comprime l'immagine fino a riempire tutto il form obj.BackgroundImageLayout = ImageLayout.Stretch 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:
Function CreaBMPsfumata(_colore1 As Color, _colore2 As Color) As Bitmap ' altezza 255 perché sufficiente per contenere una sfumatura di qualità Dim Altezza As Byte = 255 ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza Dim Larghezza As Byte = 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) ' la sfumatura nella BMP Graphics.FromImage(BMPsfumata).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza) Return BMPsfumata 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 16/05/20 13:53
in programmazione tutto è permesso
16/05/20 14:23
alip1
Postato originariamente da Carlo:
Postato originariamente da alip1:
Però prova ad usare una funzione, che forse è concettualmente più corretta:
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:
gbInfo è un groupbox, per il quale non funziona, mantiene il colore di progetto.
Postato originariamente da alip1:
Però prova ad usare una funzione, che forse è concettualmente più corretta:
Function CreaBMPsfumata(_colore1 As Color, _colore2 As Color) As Bitmap ' altezza 255 perché sufficiente per contenere una sfumatura di qualità Dim Altezza As Byte = 255 ' la colonnetta sfumata larga 1 pixel sarà uguale per tutta la larghezza Dim Larghezza As Byte = 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) ' la sfumatura nella BMP Graphics.FromImage(BMPsfumata).FillRectangle(Sfuma, 0, 0, Larghezza, Altezza) Return BMPsfumata 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:
gbInfo.BackgroundImage = CreaBMPsfumata(Color.LightBlue, Color.White) gbInfo.BackgroundImageLayout = ImageLayout.Stretch
gbInfo è un groupbox, per il quale non funziona, mantiene il colore di progetto.
Ultima modifica effettuata da alip1 16/05/20 14:26
aaa
16/05/20 14:43
Carlo
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:
gbInfo è un groupbox, per il quale non funziona, mantiene il colore di progetto.
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:
gbInfo.BackgroundImage = CreaBMPsfumata(Color.LightBlue, Color.White) 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 16/05/20 14:56
in programmazione tutto è permesso