【问题标题】:Painting a rectangle画一个矩形
【发布时间】:2017-03-21 17:09:47
【问题描述】:

我对 Windows 窗体编码非常陌生,我正在尝试制作一个具有三个按钮(圆形、矩形和线条)的 minipaint,当它获得一个按钮作为输入时,它将在面板中绘制形状。 我有这个形状类

class shape
{ 
   public Color color { get; set; }
   public int width { get; set; }
   public int startx { get; set; }
   public  int starty { get; set; }
}

它具有颜色、宽度和起始位置属性。例如,我有这个矩形类:

class rectangle : shape
{
    int length { get; set; }
    int width { get; set; }  
}

从形状类继承共享属性。现在我想在 panel 中打印一个矩形。我熟悉DrawRectangle 方法,我打印了一个矩形,如下所示:

Pen black = new Pen(Color.Black);
Rectangle rect = new Rectangle(20,20,400,200);
private void panel1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    g.DrawRectangle(black, rect);
}

但我不知道如何从class rectangle:shape 绘制一个矩形。我也有从单击按钮到矩形分配值的问题。 你能帮帮我吗?

【问题讨论】:

  • 您需要将 MyRectangle 转换为通用 Rectangle,或者只是将 MyRectangle 的值混合到您从 startx/y 计算的点数组中,并使用 DrawPolygon。我可能会在 MyRectangle.GetRectangle() 中创建一个返回 System.Drawing.Rectangle 的方法
  • 我应该在矩形类中创建一个绘制方法吗?类似于“ void draw() { System.Drawing.Rectangle(startx,starty,length,width); }” 但这不起作用
  • 我相信您在形状类中对宽度的定义很可能是厚度(以免与矩形继承类(和其他)中的宽度混淆。
  • 看看this example 中的Circle 类或this other example 中的IShape 接口和实现。

标签: c# .net winforms


【解决方案1】:

我可以建议你在你的基类中有一个每个形状都覆盖的绘制函数。

    class shape
    {
        public Color color { get; set; }
        public int thickness { get; set; }
        public int startx { get; set; }
        public int starty { get; set; }

        public virtual void Draw(Graphics g)
        {
        }
    }

    class rectangle : shape
    {
        public int length { get; set; }
        public int width { get; set; }

        public override void Draw(Graphics g)
        {
            using (Pen pen = new Pen(color))
            {
                g.DrawRectangle(pen, new Rectangle(startx, starty, width, length));
            }
        }
    }

然后可以通过调用.Draw(graphics)来绘制任何形状。 定义你的矩形:

        rectangle rectangle = new rectangle();
        rectangle.startx = 20;
        rectangle.starty = 20;
        rectangle.width = 400;
        rectangle.length = 200;

然后在您的 OnPaint 中(或您将要做的任何地方):

Graphics g = panel1.CreateGraphics();
rectangle.Draw(g);

这样做的好处是你可以有一个 List 并遍历它们,一旦你有多个形状就绘制每个:

Graphics g = panel1.CreateGraphics();
foreach (shape s in shapes)          // Assuming shapes is List<shape>
    s.Draw(g);

【讨论】:

  • 非常感谢您。但是我应该如何在我的面板上调用它?
  • 获取面板的图形,例如:Graphics g = panel1.CreateGraphics();然后将其传递给您的形状绘制函数。例如,创建一个名为 rect1 的矩形后,您可以调用 rect1.Draw(g);将其绘制到您的面板1
  • 它无法识别 panel1_paint 中的 rectangle.Draw(g) :(
  • 你必须在全局范围内声明你的变量才能在类中的任何地方访问它,而不是在函数中。
  • @sara 不要使用 CreateGraphics。在e 参数中提供图形的情况下,使用面板的绘制事件。 CreateGraphics 是临时绘图,可以通过最小化和恢复表单等轻松擦除。
【解决方案2】:

以下代码允许您在 PictureBox 上拖动和绘制 Rectangle。 转换在 MyRectangle 中实现。我还使用了稍微不同的属性。

public class Shape
{
    public Color color { get; set; }
    public Point origin { get; set; }
}

public class MyRectangle : Shape
{
    public Size size { get; set; }

    public Rectangle ToRectangle()
    {
        return new Rectangle(origin, size);
    }
}

public partial class Form1 : Form
{
    Point mouseDownPoint;

    public Form1()
    {
        InitializeComponent();
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        mouseDownPoint = e.Location;
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        MyRectangle rect = new MyRectangle();
        rect.origin = mouseDownPoint;
        rect.size = Size.Subtract((Size)e.Location, (Size)mouseDownPoint);

        pictureBox1.CreateGraphics().DrawRectangle(new Pen(Brushes.Black), rect.ToRectangle());
    }
}

也许考虑使用 PascalCase 作为类名。 (形状而不是形状)

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多