Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   rellenar de color rectangulo dibujado en bitmap (https://www.clubdelphi.com/foros/showthread.php?t=75128)

cenedelphi 30-07-2011 18:37:34

rellenar de color rectangulo dibujado en bitmap
 
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.
Cita:

procedure FloodFill(X, Y: Integer; Color: TColor; FillStyle: TFillStyle);
Pintar un rectángulo amarillo con borde negro con FloodFill:
Código Delphi [-]
  with Canvas do
  begin
    Brush.Color:= clYellow;  
    Rectangle(100,100,180,180);
    FloodFill(110, 110, clBlack, fsSurface); 
  end;

Otra forma de hacer lo mismo:
Código Delphi [-]
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:
Código Delphi [-]
  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



Cita:

Empezado por ecfisa (Mensaje 408019)
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:
Código Delphi [-]
  with Canvas do
  begin
    Brush.Color:= clYellow;  
    Rectangle(100,100,180,180);
    FloodFill(110, 110, clBlack, fsSurface); 
  end;

Otra forma de hacer lo mismo:
Código Delphi [-]
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:
Código Delphi [-]
  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

Cita:

Empezado por cenedelphi (Mensaje 408034)
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, hay varios ejemplos que puedes revisar (con código incluído) que tienen este segundo enfoque que te comento.

Ejemplo29_Paint_Canvas.zip
Ejemplo30_dibujar_Canvas.zip
Ejemplo31_2d.zip
Ejemplo31_Editor_Grafico.zip

cenedelphi 02-08-2011 00:49:09

Cita:

Empezado por Neftali (Mensaje 408085)
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:
Código Delphi [-]
 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í:
Código Delphi [-]
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

Cita:

Empezado por cenedelphi (Mensaje 408156)
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.


La franja horaria es GMT +2. Ahora son las 09:24:41.

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