Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como manejar colores degradados en áreas no rectángulares ni triángulares ? (https://www.clubdelphi.com/foros/showthread.php?t=60949)

rolandoj 20-10-2008 17:33:16

Como manejar colores degradados en áreas no rectángulares ni triángulares ?
 
Hola,

Necesito manejar colores degradados en áreas con forma de ellipse y en áreas de rectángulos con bordes redondeados. Mi problema es : como hacerlo ?

La rutina GradientFill de la librería msimg32.dll de Windows permite manejar colores degradados; pero, solo en rectángulos y en triángulos. Hay alguna rutina similar que lo haga para áreas con formas distintas ?

He considerado la posibilidad de hacerlo dibujando líneas de ancho 1 que vayan variando su color desde nuestro color inicial de degradado hasta el final; pero encuentro este método muy ineficiente para implementarlo a nivel de Delphi, en especial cuando en un mismo formulario son varias las áreas a dibujar.

Alguna sugerencia ?

cHackAll 20-10-2008 18:23:23

Código Delphi [-]
function GradientFill(DC: HDC; pVertex: Pointer; dwNumVertex: Cardinal; pMesh: Pointer; dwNumMesh, dwMode: Cardinal): Cardinal; stdcall external 'msimg32';
 
procedure TForm1.Button1Click(Sender: TObject);
 
const
 Vertex: array [0..1] of packed record
  X, Y: Cardinal;
  Red, Green, Blue, Alpha: Word;
 end = ((), (X: 200; Y: 200; Blue: $FFFF));
 
 Rect: GRADIENT_RECT = (LowerRight: 1);
 
var Bitmap: TBitmap;
begin
 Bitmap := TBitmap.Create;
 Bitmap.Width := Vertex[1].X - Vertex[0].X;
 Bitmap.Height := Vertex[1].Y - Vertex[0].Y;
 Bitmap.Canvas.Brush.Color := clBlack;
 Bitmap.Canvas.FillRect(Classes.Rect(0, 0, Bitmap.Width, Bitmap.Height));
 Bitmap.Canvas.Brush.Color := clWhite;
 Bitmap.Canvas.Pen.Color := clWhite;
 Bitmap.Canvas.Ellipse(0, 0, Bitmap.Width, Bitmap.Height);
 GradientFill(Canvas.Handle, @Vertex, Length(Vertex), @Rect, 1, GRADIENT_FILL_RECT_H);
 BitBlt(Canvas.Handle, Vertex[0].X, Vertex[0].Y, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SRCAND);
 Bitmap.Destroy;
end;

rolandoj 20-10-2008 20:57:21

Gracias. Voy a revisar
 
Hola,

Muchas gracias por la sugerencia. Voy a revisarla esta noche.

Me llama la atención que usas GradientFill, rutina que uso yo, la cual no soporta sino rectángulos y triángulos. Si entiendo bien lo que ví brevemente de tú código, parece que defines un rectángulo, que limitará a GradientFill y luego dibujas encima una Ellipse; pero, no veo con claridad como haces para que el área entre el rectángulo y la ellipse no sea afectada por GradientFill.

En fin, ya veremos esta noche cuando lo revise con calma.

Muchos saludos


La franja horaria es GMT +2. Ahora son las 05:22:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi