簡體   English   中英

如何使用軌跡欄繪制?

[英]How to draw using 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()
{
    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(); 但它不起作用它會繪制形狀然后使其消失。

我是否正確編寫了我的 setter/getter? 或者我應該使用

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

在java中,圖形可以在任何面板上繪制,在c#中是否需要在特定的容器中?

這很簡單,假設您想在panel2panel2 您所要做的就是將其寫入您的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

  • 另請注意,當您更改軌跡欄值時,面板會閃爍。 我知道如何處理這個問題,但我現在不想使解決方案復雜化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM