Gör så här: Skapa en linjär gradient

GDI+ erbjuder vågräta, lodräta och diagonala linjära toningar. Som standard ändras färgen i en linjär toning på ett enhetligt sätt. Du kan dock anpassa en linjär toning så att färgen ändras på ett icke-enhetligt sätt.

Anmärkning

Exemplen i den här artikeln är metoder som anropas från en kontrolls Paint händelsehanterare.

I följande exempel fylls en linje, en ellips och en rektangel med en vågrät linjär färgövergångspensel.

Konstruktorn LinearGradientBrush tar emot fyra argument: två punkter och två färger. Den första punkten (0, 10) är associerad med den första färgen (röd) och den andra punkten (200, 10) är associerad med den andra färgen (blå). Som förväntat ändras linjen från (0, 10) till (200, 10) gradvis från rött till blått.

10-talet i punkterna (0, 10) och (200, 10) är inte viktiga. Det viktiga är att de två punkterna har samma andra koordinat – linjen som förbinder dem är vågrät. Ellipsen och rektangeln ändras också gradvis från rött till blått eftersom den vågräta koordinaten går från 0 till 200.

Följande bild visar linjen, ellipsen och rektangeln. Observera att färgtoningen upprepar sig när den vågräta koordinaten ökar efter 200.

En linje, en ellips och en rektangel fylld med en färgtoning.

Så här använder du vågräta linjära toningar

  • Skicka in den ogenomskinliga röda respektive ogenomskinliga blå som det tredje respektive fjärde argumentet.

    public void UseHorizontalLinearGradients(PaintEventArgs e)
    {
        LinearGradientBrush linGrBrush = new LinearGradientBrush(
           new Point(0, 10),
           new Point(200, 10),
           Color.FromArgb(255, 255, 0, 0),   // Opaque red
           Color.FromArgb(255, 0, 0, 255));  // Opaque blue
    
        Pen pen = new Pen(linGrBrush);
    
        e.Graphics.DrawLine(pen, 0, 10, 200, 10);
        e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100);
        e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30);
    }
    
    Dim linGrBrush As New LinearGradientBrush( _
       New Point(0, 10), _
       New Point(200, 10), _
       Color.FromArgb(255, 255, 0, 0), _
       Color.FromArgb(255, 0, 0, 255))
    Dim pen As New Pen(linGrBrush)
    
    e.Graphics.DrawLine(pen, 0, 10, 200, 10)
    e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100)
    e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30)
    
    

I föregående exempel ändras färgkomponenterna linjärt när du går från en vågrät koordinat på 0 till en vågrät koordinat på 200. Till exempel har en punkt vars första koordinat är halvvägs mellan 0 och 200 en blå komponent som är halvvägs mellan 0 och 255.

Med GDI+ kan du justera hur en färg varierar från en kant av en toning till en annan. Anta att du vill skapa en gradientpensel som ändras från svart till röd enligt följande tabell.

Vågrät koordinat RGB-komponenter
0 (0, 0, 0)
40 (128, 0, 0)
200 (255, 0, 0)

Observera att den röda komponenten har halv intensitet när den vågräta koordinaten bara är 20 procent av vägen från 0 till 200.

I följande exempel anges egenskapen LinearGradientBrush.Blend för att associera tre relativa intensiteter med tre relativa positioner. Precis som i föregående tabell associeras en relativ intensitet på 0,5 med en relativ position på 0,2. Koden fyller en ellips och en rektangel med gradientpenseln.

Följande bild visar den resulterande ellipsen och rektangeln.

En ellips och en rektangel fylld med en vågrät färgtoning.

Anpassa linjära gradienter

  • Skicka in ogenomskinlig svart och ogenomskinlig röd som det tredje respektive fjärde argumentet.

    public void CustomizeLinearGradients(PaintEventArgs e)
    {
        LinearGradientBrush linGrBrush = new LinearGradientBrush(
           new Point(0, 10),
           new Point(200, 10),
           Color.FromArgb(255, 0, 0, 0),     // Opaque black
           Color.FromArgb(255, 255, 0, 0));  // Opaque red
    
        float[] relativeIntensities = { 0.0f, 0.5f, 1.0f };
        float[] relativePositions = { 0.0f, 0.2f, 1.0f };
    
        //Create a Blend object and assign it to linGrBrush.
        Blend blend = new Blend();
        blend.Factors = relativeIntensities;
        blend.Positions = relativePositions;
        linGrBrush.Blend = blend;
    
        e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100);
        e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30);
    }
    
    Dim linGrBrush As New LinearGradientBrush( _
       New Point(0, 10), _
       New Point(200, 10), _
       Color.FromArgb(255, 0, 0, 0), _
       Color.FromArgb(255, 255, 0, 0))
    
    Dim relativeIntensities As Single() = {0.0F, 0.5F, 1.0F}
    Dim relativePositions As Single() = {0.0F, 0.2F, 1.0F}
    
    'Create a Blend object and assign it to linGrBrush.
    Dim blend As New Blend()
    blend.Factors = relativeIntensities
    blend.Positions = relativePositions
    linGrBrush.Blend = blend
    
    e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100)
    e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30)
    
    

Toningarna i föregående exempel har varit vågräta. Det innebär att färgen ändras gradvis när du rör dig längs en vågrät linje. Du kan också definiera lodräta toningar och diagonala toningar.

I följande exempel skickas punkterna (0, 0) och (200, 100) till en LinearGradientBrush konstruktor. Färgen blå är associerad med (0, 0) och färgen grön är associerad med (200, 100). En linje (med pennbredd 10) och en ellips fylls med den linjära gradientpenseln.

Följande bild visar linjen och ellipsen. Observera att färgen i ellipsen ändras gradvis när du rör dig längs alla linjer som är parallella med linjen som passerar genom (0, 0) och (200, 100).

En linje och en ellips fylld med en diagonal färgtoning.

Skapa diagonala linjära toningar

  • Skicka in den ogenomskinliga blå och ogenomskinliga gröna som det tredje respektive fjärde argumentet.

    public void CreateDiagonalLinearGradients(PaintEventArgs e)
    {
        LinearGradientBrush linGrBrush = new LinearGradientBrush(
           new Point(0, 0),
           new Point(200, 100),
           Color.FromArgb(255, 0, 0, 255),   // opaque blue
           Color.FromArgb(255, 0, 255, 0));  // opaque green
    
        Pen pen = new Pen(linGrBrush, 10);
    
        e.Graphics.DrawLine(pen, 0, 0, 600, 300);
        e.Graphics.FillEllipse(linGrBrush, 10, 100, 200, 100);
    }
    
    Dim linGrBrush As New LinearGradientBrush( _
       New Point(0, 0), _
       New Point(200, 100), _
       Color.FromArgb(255, 0, 0, 255), _
       Color.FromArgb(255, 0, 255, 0))
    ' opaque blue
    ' opaque green
    Dim pen As New Pen(linGrBrush, 10)
    
    e.Graphics.DrawLine(pen, 0, 0, 600, 300)
    e.Graphics.FillEllipse(linGrBrush, 10, 100, 200, 100)
    
    

Se även