Actualmente estoy estudiando patrones de diseño de C # 3.0 usando el libro de Judith Bishop. El autor explica el uso del patrón Decorator dando como ejemplo el código que permite mostrar la imagen JPG y dibujar decoraciones adicionales (etiquetas, bordes, etc.). El punto interesante del código es que la imagen se dibuja sin usar WindowsForm Designer; La solución general me parece muy desconocida. Uno de los ejercicios propone agregar un controlador de eventos de clic del mouse al constructor de imágenes, lo que hará que aparezca una etiqueta. Ya encontré muchas preguntas análogas en este y otros sitios. Sin embargo, todas estas preguntas brindan soluciones que solo se ajustan al caso cuando se usa WindowsForm Designer. Además, agregué varias líneas al constructor de imágenes y escribí un método que supuestamente maneja el clic del mouse; sin embargo, no hay respuesta del programa.

¿Alguien puede proponer una solución a este problema?

// DECORATOR PATTERN
// The original Photo class - Component class
public class Photo : Form
{
    Image image;
    public Photo()
    {
        image = new Bitmap(@"D:\jug.jpg");
        this.Text = "Lemonade";
        this.Paint += new PaintEventHandler(Drawer);
    }

    public virtual void Drawer(Object source, PaintEventArgs e)
    {
        e.Graphics.DrawImage(image, 30, 20);
    }
}

}

Class DecoratorPatternExample {

// This simple BorderedPhoto decorator adds a colored BorderedPhoto of fixed size (IF MOUSE WAS CLICKED)
class BorderedPhoto : Photo
{
    Photo photo;
    Color color;
    bool mouse_click = false; // state of the mouse button

    public BorderedPhoto(Photo p, Color c)
    {
        photo = p;
        color = c;
        this.MouseClick += new MouseEventHandler(mouse); // handler for the mouse clicking
    }

    public void mouse(object sender, MouseEventArgs e) // a method which will handle the mouse clicking
    {
        if (e.Button == MouseButtons.Left)
        {
            mouse_click = true;
        }
    }

    public override void Drawer(Object source, PaintEventArgs e)
    {
        photo.Drawer(source, e);
        if (mouse_click == true) // if mouse was clicked, then draw the border
            e.Graphics.DrawRectangle(new Pen(color, 10), 25, 15, 215, 225);
    }
}

Si está interesado, el código completo está disponible aquí.

1
tenghiz 16 oct. 2018 a las 17:02

2 respuestas

La mejor respuesta

"Sin embargo, todas estas preguntas dan una solución que solo se ajusta al caso cuando se usa WindowsForm Designer".

El Diseñador de formularios de Windows funciona en otra parte de la clase parcial. No puede hacer nada que usted no pueda hacer también. Todo lo que hace, lo hace en código C # igual que usted. Y todo lo que hizo se ejecuta en el momento en que se llama a "InitializeComponent ()" en el constructor.

Por lo tanto, no existe una diferencia real entre lo que hace el diseñador de formularios y lo que hace usted.

1
Christopher 16 oct. 2018 a las 14:04

¡Gracias a @LarsTech, este problema se resolvió!

Aquí está el código de trabajo:

class BorderedPhoto : Photo
{
    Photo photo;
    Color color;
    bool mouse_click = false;

    public BorderedPhoto(Photo p, Color c)
    {
        photo = p;
        color = c;
        this.MouseClick += new MouseEventHandler(mouse);
    }

    public void mouse(object sender, MouseEventArgs e) // a method which will handle the mouse clicking
    {
        if (e.Button == MouseButtons.Left)
        {
            mouse_click = true;
            Invalidate(); // ADD INVALIDATE HERE
        }
    }

    public override void Drawer(Object source, PaintEventArgs e)
    {
        photo.Drawer(source, e);
        if (mouse_click == true) // if mouse was clicked, then draw the border
            e.Graphics.DrawRectangle(new Pen(color, 10), 25, 15, 215, 225);
    }
}

Chicos, gracias a todos por tomarse el tiempo para resolver mi problema.

1
tenghiz 16 oct. 2018 a las 14:42