Oppure

Loading
15/05/20 7:19
alip1
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 15/05/20 7:20
aaa
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.



mire.forumfree.it/ - Mire Engine
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:

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
15/05/20 15:36
alip1
Grazie tantissimo:hail:
aaa
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:

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

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:

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.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