C# 如何使用轨迹栏绘制?

C# 如何使用轨迹栏绘制?,c#,graphics,paint,trackbar,C#,Graphics,Paint,Trackbar,那么,如何使用变量绘制C#呢 我设法画了一些形状,但只有在我硬编码长度的时候。我需要使用轨迹条绘制形状以获得长度 public abstract class Shape { //private String shape; private int length; } public virtual void setLength(int newLength) { this.length = newLength; } public virtual int getLength(

那么,如何使用变量绘制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)
        {

        }
    }
}
是的,它非常混乱,正如你所看到的,我试过各种各样的东西

面板1_油漆和onPaint有什么区别? 正如您所见,我不太确定如何使用eventhandler,onCircleClick基本上是一个菜单项按钮,但如何激活另一个eventhandler(onCircleClick)中的不同eventhandler(panel1_Paint)

图形是否需要使用*_paint/OnPaint方法绘制?我让我的画在正常的面板上

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

对于c#,在java中重绘()的等价性是什么?我试过了;但它不起作用,它会画出形状,然后让它消失

我是否正确地编写了setter/getter?或者我应该使用

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

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

这非常简单,假设您希望在
panel2
上绘制。 你所要做的就是把它写在你的
private void panel2\u Paint(对象发送器,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
    在绘制形状后不会像以前那样被清除

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


不要像编写Java一样编写C。使用大写字母和属性。呃,我看到
CreateGraphics
。使用面板的绘制事件,并在需要更新时使面板无效。请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标签就是为了这个目的。