PDA

Ver la Versión Completa : rellenar de color rectangulo dibujado en bitmap


cenedelphi
30-07-2011, 18:37:34
Cordial saludo
Estoy intentando rellenaar de color un rectanfulo dibujado
En un bitmap.
He conseguido dibujarlo sin relleno, ahora
Quiero imementar la funcionalidad de
Relleno con el color deseado. Estoy intentando
Utilizarr la funcion floodfill pero no lo he logrado aun
Alguien podria orientarme.

Gracias

Chris
30-07-2011, 20:01:36
La clase TCanvas tiene un procedimiento llamado FillRect. El color con el que rellena el rectángulo es determinado por la propiedad Color del objeto Brush, también propiedad de TCanvas. Ése es el que utilizas para rellenar rectángulos. Pero me queda la duda de dónde has sacado eso de "FloodFill"?

Saludos,
Chris

ecfisa
30-07-2011, 23:59:13
Hola.

FloodFill es una función que ya existía en Turbo Pascal y sirve para pintar un área con la brocha actual.

procedure FloodFill(X, Y: Integer; Color: TColor; FillStyle: TFillStyle);


Pintar un rectángulo amarillo con borde negro con FloodFill:

with Canvas do
begin
Brush.Color:= clYellow;
Rectangle(100,100,180,180);
FloodFill(110, 110, clBlack, fsSurface);
end;


Otra forma de hacer lo mismo:

var
R: TRect;
begin
with Canvas do
begin
Brush.Color:= clBlack;
Rectangle(10,10,80,80);
R.Left:= 11;
R.Top:= 11;
R.Right:= 79;
R.Bottom:= 79;
Brush.Color:= clYellow;
FillRect(R);
end;


O de igual modo:

with Canvas do
begin
Brush.Color := clYellow;
Brush.Style := bsSolid;
Pen.Color:= clBlack;
Rectangle(200, 200, 280, 280);
end;



Saludos.

cenedelphi
31-07-2011, 05:59:36
Gracias
Ya pude dibujar y rellenar el rectangulo solo al momento de dibujarlo, ahora la
Funcionalidad requerida es poder seleccionar el rectangulo dibujado
Y rellenarlo al esstilo autoforma de microsoft word, ademas de poder agrupar y desagrupar los rectangulos



Hola.



FloodFill es una función que ya existía en Turbo Pascal y sirve para pintar un área con la brocha actual.


Pintar un rectángulo amarillo con borde negro con FloodFill:

with Canvas do
begin
Brush.Color:= clYellow;
Rectangle(100,100,180,180);
FloodFill(110, 110, clBlack, fsSurface);
end;


Otra forma de hacer lo mismo:

var
R: TRect;
begin
with Canvas do
begin
Brush.Color:= clBlack;
Rectangle(10,10,80,80);
R.Left:= 11;
R.Top:= 11;
R.Right:= 79;
R.Bottom:= 79;
Brush.Color:= clYellow;
FillRect(R);
end;


O de igual modo:

with Canvas do
begin
Brush.Color := clYellow;
Brush.Style := bsSolid;
Pen.Color:= clBlack;
Rectangle(200, 200, 280, 280);
end;



Saludos.

Neftali [Germán.Estévez]
01-08-2011, 10:12:23
Ya pude dibujar y rellenar el rectangulo solo al momento de dibujarlo, ahora la Funcionalidad requerida es poder seleccionar el rectangulo dibujado
Y rellenarlo al esstilo autoforma de microsoft word, ademas de poder agrupar y desagrupar los rectangulos

Por estas cosas, es por lo que sale a cuenta explicar los problemas completos desde un principio. Porque segun los pasos que se vayanb a realizar luego las soluciones son unas u otras.

El problema de dibujar en el canvas directamente tal y como lo has hecho, es que el resultado es similar a lo que obtienes cuando dibujas en el Paint (mspaint de Microsoft). Si dibujas un recuadro en el Paint, verás que después ya no puedes seleccionarlo. ¿Porqué?
Porque en ningun sitio almaceneas los objetos que dibujas, sólo los pintas directamente y una vez pintados te "olvidas" de ellos. No se si me explico.

Si lo que quieres hacer es dibujar objetos (cuadrados, círculos,...) y después poder seleccionarlos, modificarlos,... debes almacenar en algun sitio los objetos que has "dibujado". Una lista, por ejemplo.

El problema es que el enfoque es totalmente diferente.

Neftali [Germán.Estévez]
01-08-2011, 10:14:34
Si vas al FTP del Club (http://www.terawiki.clubdelphi.com/Delphi/Ejemplos/), hay varios ejemplos que puedes revisar (con código incluído) que tienen este segundo enfoque que te comento.

Ejemplo29_Paint_Canvas.zip (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Graficos/?download=Ejemplo29_Paint_Canvas.zip)
Ejemplo30_dibujar_Canvas.zip (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Graficos/?download=Ejemplo30_dibujar_Canvas.zip)
Ejemplo31_2d.zip (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Graficos/?download=Ejemplo31_2d.zip)
Ejemplo31_Editor_Grafico.zip (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Graficos/?download=Ejemplo31_Editor_Grafico.zip)

cenedelphi
02-08-2011, 00:49:09
Por estas cosas, es por lo que sale a cuenta explicar los problemas completos desde un principio. Porque segun los pasos que se vayanb a realizar luego las soluciones son unas u otras.

El problema de dibujar en el canvas directamente tal y como lo has hecho, es que el resultado es similar a lo que obtienes cuando dibujas en el Paint (mspaint de Microsoft). Si dibujas un recuadro en el Paint, verás que después ya no puedes seleccionarlo. ¿Porqué?
Porque en ningun sitio almaceneas los objetos que dibujas, sólo los pintas directamente y una vez pintados te "olvidas" de ellos. No se si me explico.

Si lo que quieres hacer es dibujar objetos (cuadrados, círculos,...) y después poder seleccionarlos, modificarlos,... debes almacenar en algun sitio los objetos que has "dibujado". Una lista, por ejemplo.

El problema es que el enfoque es totalmente diferente.

gracias por las observaciones.
miré los ejemplos.

ejemplo 31

uno de los ejemplos presenta la declaración de la sigueinte clase:

TFigura = class(TObject)
private
FAjustable: Boolean;
FColor: TColor;
FBoundsRect: TRect;
FPicture: TPicture;
FTipo: TTipoFigura;
public

para modificar el color del relleno a un objeto instancia de esta clase.
habría que modificar el metodo dibujar. tambien he pensdo en crear
otra propiedad a la clase: propiedad FcolorRelleno, para tener un color para el borde y un color para el relleno.

Ya logre, rellenar las figuras despues de dibujada. alguna idea para optimizar la funcioanalidad.

gracias.


la clase quedaría así:

TFigura = class(TObject)
private
FAjustable: Boolean;
FColor: TColor;
FcolorRellenor: TColor;
FBoundsRect: TRect;
FPicture: TPicture;
FTipo: TTipoFigura;
public

Neftali [Germán.Estévez]
02-08-2011, 07:59:44
Ya logre, rellenar las figuras despues de dibujada. alguna idea para optimizar la funcioanalidad.

Supongo que el DoubleBuffered ya está activado.
POdrías modificar el método de selección (marcas de selección), para que se parezca más a lo que estamos acostumbrados.