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!
Brinque com as cores para deixar seu projeto mais bonito! :)