24 Ago, 2009 22:24

Como fazer fundo gradiente no Windows Mobile

O problema

Durante o desenvolvimento de um projeto para a Módulo, tivemos um problema relacionado à alta resolução da tela de alguns dispositivos presentes no mercado. Como o projeto foi desenvolvido com o foco em resolução menor, a imagem de fundo utilizada no aplicativo ficava muito pequena quando rodávamos a aplicação na resolução maior.

A solução

Para resolver este problema, uma das possíveis soluções seria ter uma imagem maior e redimensioná-la de acordo com a resolução, mas isso não nos garantiria que a imagem redimensionada ficaria com uma qualidade boa. Então partimos para uma outra solução: retirar a imagem de fundo e fazer o gradiente dinamicamente. Dessa forma, teríamos um efeito legal e nossa aplicação ficaria livre de dependências relacionadas à resolução das telas dos aparelhos.

Um exemplo passo-a-passo

Primeiro, crie a classe GradientFill.cs e adicione-a ao seu projeto. Para que ela funcione você vai precisar também da classe Win32Helper.cs .

public sealed class GradientFill {
    // This method wraps the PInvoke to GradientFill.
    // Parmeters:
    //  gr - The Graphics object we are filling
    //  rc - The rectangle to fill
    //  startColor - The starting color for the fill
    //  endColor - The ending color for the fill
    //  fillDir - The direction to fill
    //
    // Returns true if the call to GradientFill succeeded;
    // false otherwise.
    public static bool Fill(Graphics gr, Rectangle rc,
        Color startColor, Color endColor,
        FillDirection fillDir) {

        // Initialize the data to be used in the call to GradientFill.
        Win32Helper.TRIVERTEX[] tva = new Win32Helper.TRIVERTEX[2];
        tva[0] = new Win32Helper.TRIVERTEX(rc.X, rc.Y, startColor);
        tva[1] = new Win32Helper.TRIVERTEX(rc.Right, rc.Bottom, endColor);
        Win32Helper.GRADIENT_RECT[] gra = new Win32Helper.GRADIENT_RECT[] {
            new Win32Helper.GRADIENT_RECT(0, 1)};

        // Get the hDC from the Graphics object.
        IntPtr hdc = gr.GetHdc();

        // PInvoke to GradientFill.
        bool b;
        b = Win32Helper.GradientFill(
                hdc,
                tva,
                (uint)tva.Length,
                gra,
                (uint)gra.Length,
                (uint)fillDir);
        System.Diagnostics.Debug.Assert(b, string.Format(
            "GradientFill failed: {0}",
            System.Runtime.InteropServices.Marshal.GetLastWin32Error()));

        // Release the hDC from the Graphics object.
        gr.ReleaseHdc(hdc);

        return b;
    }

    // The direction to the GradientFill will follow
    public enum FillDirection {
        //
        // The fill goes horizontally
        //
        LeftToRight = Win32Helper.GRADIENT_FILL_RECT_H,
        //
        // The fill goes vertically
        //
        TopToBottom = Win32Helper.GRADIENT_FILL_RECT_V
    }

Para que seu form tenha um fundo em gradiente, sobrescreva o método OnPaintBackground, conforme mostrado abaixo.

   protected override void OnPaintBackground(PaintEventArgs e) {
        // On Windows Mobile Pocket PC 2003, the call to GradientFill
        // fails with GetLastError() returning 87 (ERROR_INVALID_PARAMETER)
        // when e.Graphics is used.
        // Instead, fill into a bitmap and then draw that onto e.Graphics.
        Bitmap bm = new Bitmap(Width, Height);
        Graphics gr = System.Drawing.Graphics.FromImage(bm);
        GradientFill.Fill(
            gr,
            this.ClientRectangle,
            Color.DarkSlateBlue, Color.BlueViolet,
            GradientFill.FillDirection.TopToBottom);

        e.Graphics.DrawImage(bm, 0, 0);
        gr.Dispose();
        bm.Dispose();
    }

Pronto, agora é só executar e apreciar o resultado!

Exemplo de fundo gradiente

Brinque com as cores para deixar seu projeto mais bonito! :)

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.