2

那么如何使用变量在 C# 中绘制?

我设法绘制了一些形状,但只有当我硬编码长度时。我需要使用轨迹栏绘制形状来获取长度。

public abstract class Shape
{
    //private String shape;
    private int length;
}

public virtual void setLength(int newLength)
{
    this.length = newLength;
}

public virtual int getLength()
{
    return length;
}

//public String getShape()
//{
//    return shape;
//}

//abstract public double getLength(float length);

abstract public float getPerimeter(int length);

abstract public float getArea(int length);

只显示正方形类,但这个项目还包括三角形和正方形。

using System;
using System.Drawing;

public class Square : Shape
{
    private float perimeter, area;

    public override float getPerimeter(int length)
    {
        perimeter = length*4;
        return perimeter;
    }

    public override float getArea(int length)
    {
        area = length*length;
        return area;
    }
}

这是我所有的事件处理程序的类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace shapes
{
    //private System.Windows.Forms.TrackBar trackBar1;

    public partial class Form1 : Form
    {        
        private Shape shape;
        private int length = 0;
        private int shapeL = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void panel2_Paint(object sender, PaintEventArgs e)
        {

        }

        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            label3.Text = "Length Slider: " + trackBar1.Value;

            textBox1.Text = shape.getPerimeter(shape.getLength()).ToString("0.00");
            textBox2.Text = shape.getArea(shape.getLength()).ToString("0.00");

            textBox1.Refresh();
            textBox2.Refresh();

            length = trackBar1.Value;
            shape.setLength(length);
        }

        private void onCircleClick(object sender, EventArgs e)
        {
            shape = new Circle();
            //length = trackBar1.Value;
            length = shape.getLength();
            this.Refresh();

            using (Graphics g = this.panel1.CreateGraphics())
            {
                Pen pen = new Pen(Color.Black, 2);
                Graphics formGraphics;
                formGraphics = this.panel1.CreateGraphics();
                formGraphics.DrawEllipse(pen, 50, 50, length, length);
                //g.DrawEllipse(pen, 100, 100, length, length);

            }
        }

        private void onSquareClick(object sender, EventArgs e)
        {
            shape = new Square();
            length = trackBar1.Value;


            using (Graphics g = this.panel1.CreateGraphics())
            {
                Pen pen = new Pen(Color.Black, 2);

                g.DrawRectangle(pen, 50, 50, length, length);

                System.Windows.Forms.MessageBox.Show("lenght is: " + length);
            }
        }

        private void onTriangleClick(object sender, EventArgs e)
        {
            shape = new Triangle();
            length = trackBar1.Value;

            using (Graphics g = this.panel1.CreateGraphics())
            {
                SolidBrush blueBrush = new SolidBrush(Color.Blue);

                // Create points that define polygon.
                Point point1 = new Point(50, 50);
                Point point2 = new Point(50, 100);
                Point point3 = new Point(100, 50);
                Point[] curvePoints = { point1, point2, point3};

                // Draw polygon to screen.
                g.FillPolygon(blueBrush, curvePoints);
            }
        }

        private void shapeToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);

            Pen pen = new Pen(Color.Black, 2);

            Graphics g = pe.Graphics;
            g = this.CreateGraphics();
            g.DrawRectangle(pen, 50, 50, length, length);
        }

        private void OnPaint(object sender, PaintEventArgs e)
        {

        }
    }
}

是的,它非常混乱,正如你所看到的,我尝试了各种方法。

panel1_paint 和 onPaint 有什么区别?正如您所看到的,我不太确定如何使用事件处理程序,onCircleClick 基本上是一个菜单项按钮,但我如何从另一个事件处理程序(onCircleClick)激活不同的事件处理程序(panel1_Paint)?

图形需要在 *_paint/OnPaint 方法中绘制吗?我让我的画在普通面板上。

接下来是将轨迹栏值获取到形状对象并再次返回到方法的最佳操作过程是什么?是的,当我使用 displayMessage(shape.getLength) 时,数据正在被保存(我认为)它显示长度并且通常是一次性的。

c# 的 java 中 repaint() 的等价物是什么?我试过 this.Refresh(); 但它不起作用它会绘制形状然后使其消失。

我是否正确地编写了我的设置器/获取器?还是我应该使用

public int X
{
    get {return x;}
    set {x = value;}
}

在java中,图形将在任何面板上绘制,在c#中是否需要在特定容器中?

4

1 回答 1

0

这很简单,假设你想在panel2. 你所要做的就是把它写在你的private void panel2_Paint(object sender, PaintEventArgs e)身体里。

    {
        e.Graphics.Clear(panel1.BackgroundColor);
        int length = trackBar1.Value;
        Pen pen = new Pen(Color.Black, 2);
        e.Graphics.DrawRectangle(pen, 50, 50, length, length);
    }

并且每当您想刷新绘图时,都可以调用panel2.Refresh()panel2.Invalidate()。两者都能胜任。

  • 请注意,如果您这样做了,panel2在绘制形状后不会像之前发生的那样被清除。

  • 另请注意,当您更改轨迹栏值时,面板会闪烁。我知道如何处理这个问题,但我现在不想使解决方案复杂化。

于 2020-07-22T12:29:56.423 回答