Jump to content


Photo

[MULTILENGUAJE] Pintar degradado con la API de Windows


  • Please log in to reply
2 replies to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 09 May 2011 - 05:49 AM

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
  • 2137 posts

Posted 09 May 2011 - 11:31 AM

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

Saludos
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 09 May 2011 - 12:14 PM

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.