LinearGardientBrush
-
- Posts: 29
- Joined: Thu Oct 20, 2005 1:35 pm
- Contact:
LinearGardientBrush
Hola Foro
Estoy buscanco algo como la función en .net LinearGradienteBrush para fwh.
Lo que quiero es crear un brush similar al solidbrush, que permita hacer una gradiente de colores
Alguien tiene alnuna idea?
Gracias
Arturo Tamayo Daza
thee2d2@entelnet.bo
arturotamayo.hotmail.com
Estoy buscanco algo como la función en .net LinearGradienteBrush para fwh.
Lo que quiero es crear un brush similar al solidbrush, que permita hacer una gradiente de colores
Alguien tiene alnuna idea?
Gracias
Arturo Tamayo Daza
thee2d2@entelnet.bo
arturotamayo.hotmail.com
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Arturo,
Una solución fácil es similar a la que se usa en las páginas web. Crea un pequeño bitmap que contenga el gradiente, algo asi como una línea vertical y delgada.
Crea un brush con ese bitmap y dáselo a la ventana ó diálogo, y ellos te crearán el gradiente de forma automatica.
Otra posible implementación la tienes en el ejemplo samples\install.prg. El modo en que se dibuja el color del fondo, es una forma de hacer un gradiente mediante programación.
Una solución fácil es similar a la que se usa en las páginas web. Crea un pequeño bitmap que contenga el gradiente, algo asi como una línea vertical y delgada.
Crea un brush con ese bitmap y dáselo a la ventana ó diálogo, y ellos te crearán el gradiente de forma automatica.
Otra posible implementación la tienes en el ejemplo samples\install.prg. El modo en que se dibuja el color del fondo, es una forma de hacer un gradiente mediante programación.
-
- Posts: 29
- Joined: Thu Oct 20, 2005 1:35 pm
- Contact:
Gracias Antonio
Esa solución ya la he visto pero no me sirve ya que los colores serían fijos de acuerdo al bmp.
lo que yo estoy buscando es una función similar a lineragradientbrush, que permita definir los colores, mas o menos asi
Obrush := (ntop,nleft,nbotton,nrght,Color1, Color2, posicion )
si fuera posible dar este entonces los colores variarian de acuerdo con lo difinido en el windows
Saludos
Arturo
Esa solución ya la he visto pero no me sirve ya que los colores serían fijos de acuerdo al bmp.
lo que yo estoy buscando es una función similar a lineragradientbrush, que permita definir los colores, mas o menos asi
Obrush := (ntop,nleft,nbotton,nrght,Color1, Color2, posicion )
si fuera posible dar este entonces los colores variarian de acuerdo con lo difinido en el windows
Saludos
Arturo
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- carlos vargas
- Posts: 1421
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
- Paco Garcia
- Posts: 172
- Joined: Fri Oct 07, 2005 12:00 pm
- Contact:
Gradient
Hola a todos:
Si le parece bien a Antonio podemos incluir la función Degrada en fivewin.
Existe una función GradientFill en una dll del sistema pero no siempre esta disponible en todos los Windows asi que creo que es mejor utilizar esta forma
Este código está inspirado en alguno que he visto por internet, no lo he imaginado yo solo.
Un saludo
Paco
Si le parece bien a Antonio podemos incluir la función Degrada en fivewin.
Existe una función GradientFill en una dll del sistema pero no siempre esta disponible en todos los Windows asi que creo que es mejor utilizar esta forma
Code: Select all
void GradientFill( HDC hDC, RECT* rct, COLORREF crStart, COLORREF crEnd, int bVertical )
{
int nSegments = 100;
COLORREF cr;
int nR = GetRValue(crStart);
int nG = GetGValue(crStart);
int nB = GetBValue(crStart);
int neB = GetBValue(crEnd);
int neG = GetGValue(crEnd);
int neR = GetRValue(crEnd);
int nDiffR = (neR - nR);
int nDiffG = (neG - nG);
int nDiffB = (neB - nB);
int ndR ;
int ndG ;
int ndB ;
int nCX ;
int nCY ;
int nTop = rct->top;
int nBottom = rct->bottom;
int nLeft = rct->left;
int nRight = rct->right;
HBRUSH hBrush;
RECT rc;
int i;
if( !bVertical )
{
if( nSegments > ( rct->right - rct->left ) )
{
nSegments = ( rct->right - rct->left );
}
}
else
{
if( nSegments > ( rct->bottom - rct->top ) )
{
nSegments = ( rct->bottom - rct->top );
}
}
ndR = 256 * (nDiffR) / (max(nSegments,1));
ndG = 256 * (nDiffG) / (max(nSegments,1));
ndB = 256 * (nDiffB) / (max(nSegments,1));
nCX = (rct->right-rct->left) / max(nSegments,1);
nCY = (rct->bottom-rct->top) / max(nSegments,1);
nR *= 256;
nG *= 256;
nB *= 256;
for (i = 0; i < nSegments; i++, nR += ndR, nG += ndG, nB += ndB)
{
if(i == (nSegments - 1))
{
nRight = rct->right;
nBottom = rct->bottom;
}
else
{
nBottom = nTop + nCY;
nRight = nLeft + nCX;
}
cr = RGB(nR / 256, nG / 256, nB / 256);
{
hBrush = CreateSolidBrush( cr );
if( bVertical )
{
rc.top = nTop;
rc.left = rct->left;
rc.bottom = nBottom + 1;
rc.right = rct->right;
}
else
{
rc.top = rct->top;
rc.left = nLeft;
rc.bottom = rct->bottom;
rc.right = nRight+1;
}
FillRect(hDC, &rc, hBrush );
DeleteObject( hBrush );
}
nLeft = nRight;
nTop = nBottom;
}
}
HB_FUNC( DEGRADA )
{
RECT rct;
rct.top = hb_parni( 2, 1 );
rct.left = hb_parni( 2, 2 );
rct.bottom = hb_parni( 2, 3 );
rct.right = hb_parni( 2, 4 );
GradientFill( ( HDC ) hb_parnl( 1 ) , &rct, hb_parnl( 3 ), hb_parnl( 4 ), hb_parl(5) );
}
local lVertical := .t.
Degrada( hDC, { 10, 10, 200, 200}, CLR_WHITE, CLR_BLUE, lVertical )
Un saludo
Paco
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
-
- Posts: 16
- Joined: Thu Dec 01, 2005 4:15 pm
Tambien ando en busca de una solución, pero en lugar de la funcion quisiera definir un brush, para independizarme del pintado.
Com se puede generar un bitmap en memoria, por ejemplo con el rectangulo generado por la funcion anterior?
Con ese bitmap seria posible definir el brush
Actualmenet tengo definido bitmaps de 1 pixel de ancho en los recursos y los uso com brushes, pero creo que el bitmap deberia ser hecho a mano, a la medida del diálogo al que se le aplique.
Saludos
Com se puede generar un bitmap en memoria, por ejemplo con el rectangulo generado por la funcion anterior?
Con ese bitmap seria posible definir el brush
Actualmenet tengo definido bitmaps de 1 pixel de ancho en los recursos y los uso com brushes, pero creo que el bitmap deberia ser hecho a mano, a la medida del diálogo al que se le aplique.
Saludos
- reinaldocrespo
- Posts: 918
- Joined: Thu Nov 17, 2005 5:49 pm
- Location: Fort Lauderdale, FL
- Paco Garcia
- Posts: 172
- Joined: Fri Oct 07, 2005 12:00 pm
- Contact:
Hola
Pon al final de tu código prg lo siguente:
y ya está.
Un saludo
Paco
Pon al final de tu código prg lo siguente:
Code: Select all
#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"
.... la función c
#pragma ENDDUMP
Un saludo
Paco
- reinaldocrespo
- Posts: 918
- Joined: Thu Nov 17, 2005 5:49 pm
- Location: Fort Lauderdale, FL
Paco;
Gracias por tu respuesta. Incluí la función al fondo de uno de los prgs que componen la aplicación. Recibo el siguiente error:
f:\borland\bcc55\bin\bcc32.exe -c -O2 -If:\xharbour_0.99\include;f:\borland\bcc55\include -o\mp\patients\shared.obj \mp\patients\shared.xhrb
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
\mp\patients\shared.xhrb:
Error E2356 ..\\shared\\shared.prg 2762: Type mismatch in redeclaration of 'GradientFill'
Error E2344 f:\borland\bcc55\include\wingdi.h 3453: Earlier declaration of 'GradientFill'
*** 2 errors in Compile ***
La linea 2762 de shared.prg es la que solamente tiene el parentesis abriendo.
Reinaldo.
Gracias por tu respuesta. Incluí la función al fondo de uno de los prgs que componen la aplicación. Recibo el siguiente error:
f:\borland\bcc55\bin\bcc32.exe -c -O2 -If:\xharbour_0.99\include;f:\borland\bcc55\include -o\mp\patients\shared.obj \mp\patients\shared.xhrb
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
\mp\patients\shared.xhrb:
Error E2356 ..\\shared\\shared.prg 2762: Type mismatch in redeclaration of 'GradientFill'
Error E2344 f:\borland\bcc55\include\wingdi.h 3453: Earlier declaration of 'GradientFill'
*** 2 errors in Compile ***
La linea 2762 de shared.prg es la que solamente tiene el parentesis abriendo.
Reinaldo.
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- reinaldocrespo
- Posts: 918
- Joined: Thu Nov 17, 2005 5:49 pm
- Location: Fort Lauderdale, FL
Antonio;
Hola. Gracias por tu respuesta.
Pues no veo que diferencia podria hacer, pero hice como me dices. Y misteriosamente (para mi), ya no existe ese problema. Ahora tengo los errors que te muestro a continuacion:
Warning W8004 ..\\shared\\shared.prg 2772: 'nRight' is assigned a value that is never used in function GradientFILL
Warning W8004 ..\\shared\\shared.prg 2770: 'nBottom' is assigned a value that is never used in function GradientFILL
Warning W8075 ..\\shared\\shared.prg 2855: Suspicious pointer conversion in function HB_FUN_DEGRADA
Error E2340 ..\\shared\\shared.prg 2855: Type mismatch in parameter 4 (wanted 'void *', got 'long') in function HB_FUN_DEGRADA
Error E2193 ..\\shared\\shared.prg 2855: Too few parameters in call to 'GradientFill' in function HB_FUN_DEGRADA
*** 2 errors in Compile ***
Hola. Gracias por tu respuesta.
Pues no veo que diferencia podria hacer, pero hice como me dices. Y misteriosamente (para mi), ya no existe ese problema. Ahora tengo los errors que te muestro a continuacion:
Warning W8004 ..\\shared\\shared.prg 2772: 'nRight' is assigned a value that is never used in function GradientFILL
Warning W8004 ..\\shared\\shared.prg 2770: 'nBottom' is assigned a value that is never used in function GradientFILL
Warning W8075 ..\\shared\\shared.prg 2855: Suspicious pointer conversion in function HB_FUN_DEGRADA
Error E2340 ..\\shared\\shared.prg 2855: Type mismatch in parameter 4 (wanted 'void *', got 'long') in function HB_FUN_DEGRADA
Error E2193 ..\\shared\\shared.prg 2855: Too few parameters in call to 'GradientFill' in function HB_FUN_DEGRADA
*** 2 errors in Compile ***
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Reinaldo,
Tambien tienes que cambiar el nombre aquí:
GradientFILL( ( HDC ) hb_parnl( 1 ) , &rct, hb_parnl( 3 ), hb_parnl( 4 ), hb_parl(5) );
El lenguaje C es "case sensitive", es decir, distingue entre mayúsculas y minúsculas. El API de Windows proporciona una función que se llama GradientFill que entraba en conflicto con la de Paco. Al cambiarle el nombre, el conflicto desaparece.
Tambien tienes que cambiar el nombre aquí:
GradientFILL( ( HDC ) hb_parnl( 1 ) , &rct, hb_parnl( 3 ), hb_parnl( 4 ), hb_parl(5) );
El lenguaje C es "case sensitive", es decir, distingue entre mayúsculas y minúsculas. El API de Windows proporciona una función que se llama GradientFill que entraba en conflicto con la de Paco. Al cambiarle el nombre, el conflicto desaparece.
- reinaldocrespo
- Posts: 918
- Joined: Thu Nov 17, 2005 5:49 pm
- Location: Fort Lauderdale, FL