Ir al contenido


Foto

[MULTILENGUAJE] Pintar degradado con la API de Windows


  • Por favor identifícate para responder
2 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 mayo 2011 - 05:49

Dibujar un degradado es un tema bastante trillado del que podemos encontrar infinidad de ejemplos. Propongo un código sencillo para dibujar un degradado entre dos colores usando la API de Windows. Usar la API es un poquitín mas engorroso que la VCL pero nos permitirá usar el código en aquellos procesos en los que queramos ser independientes de librerías de clases, y por supuesto, este método es compatible con la VCL.

Como suelo hacer en muchas ocasiones, publicaré el código en C/C++ y delphi.


cpp
  1. // Dibuja un rectángulo degradado desde Color1 a Color2
  2. // Si Orientation = 1 el degradado es vertical, si Orientation =0, Horizontal
  3. void Degrade(HDC hDC, RECT Rect, int Color1, int Color2, int Orientation)
  4. {
  5.   int= GetRValue(Color1),  G  = GetGValue(Color1),  B  = GetBValue(Color1);
  6.   int Rd = GetRValue(Color2)-R, Gd = GetGValue(Color2)-G, Bd = GetBValue(Color2)-B;
  7.   int N;
  8.   if(Orientation) N = Rect.bottom - Rect.top;
  9.   else  N = Rect.right - Rect.left;
  10.   for(int i=0; i <= N; ++i){
  11.     int Color = RGB(R + MulDiv(Rd, i, N), G + MulDiv(Gd, i, N), B + MulDiv(Bd, i, N));
  12.     HPEN hPen = CreatePen(PS_SOLID, 0, Color);
  13.     SelectObject(hDC, hPen);
  14.     if(Orientation){
  15.       MoveToEx(hDC, Rect.left, Rect.top + i, 0);
  16.       LineTo(hDC, Rect.right, Rect.top + i);
  17.     }else{
  18.       MoveToEx(hDC, Rect.left + i, Rect.top, 0);
  19.       LineTo(hDC, Rect.left + i, Rect.bottom);
  20.     }
  21.     DeleteObject(hPen);
  22.   }
  23. }


Ejemplo de uso:

cpp
  1. Degrade(Image1->Canvas->Handle, Image1->ClientRect, clLime, clGreen, 1);


Y en delphi:

delphi
  1. // Dibuja un rectángulo degradado desde Color1 a Color2
  2. // Si Orientation = 1 el degradado es vertical, si Orientation =0, Horizontal
  3. procedure Degrade(DC: HDC; Rect: TRect; Color1, Color2, Orientation: integer);
  4. var
  5.   R, G, B, Rd, Gd, Bd, Color, i, N: integer;
  6.   Pen: HPEN;
  7. begin
  8.   R:= GetRValue(Color1);
  9.   G:= GetGValue(Color1);
  10.   B:= GetBValue(Color1);
  11.   Rd:= GetRValue(Color2)-R;
  12.   Gd:= GetGValue(Color2)-G;
  13.   Bd:= GetBValue(Color2)-B;
  14.  
  15.   if Orientation <>0 then N:= Rect.bottom - Rect.top
  16.   else  N:= Rect.right - Rect.left;
  17.   for i:=0 to N do
  18.   begin
  19.     Color:= RGB(R + MulDiv(Rd, i, N), G + MulDiv(Gd, i, N), B + MulDiv(Bd, i, N));
  20.     Pen:= CreatePen(PS_SOLID, 0, Color);
  21.     SelectObject(DC, Pen);
  22.     if Orientation <> 0 then
  23.     begin
  24.       MoveToEx(DC, Rect.left, Rect.top + i, 0);
  25.       LineTo(DC, Rect.right, Rect.top + i);
  26.     end else
  27.     begin
  28.       MoveToEx(DC, Rect.left + i, Rect.top, 0);
  29.       LineTo(DC, Rect.left + i, Rect.bottom);
  30.     end;
  31.     DeleteObject(Pen);
  32.   end;
  33. end;


Ejemplo:

delphi
  1. Degrade(Image1.Canvas.Handle, Image1.ClientRect, clLime, clGreen, 0);



Saludos.
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 09 mayo 2011 - 11:31

Gracias escafandra por tus siempre excelentes aportes.  (y) (y)

Saludos
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 09 mayo 2011 - 12:14

Hola

Ya he ejecutado el código y esta muy bueno amigo escafandra, excelente aporte (y)

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.