2016-11-08 3 views
2

Я очень новичок в кодировании окон, и я пытаюсь сделать minipaint, который имеет три кнопки (круг, прямоугольник и линия), и когда он получает кнопку в качестве входа, она нарисует форму в панели. У меня есть эта форма классаКартина прямоугольника

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

, который имеет цвет, ширина и стартовая позицию properties.then У меня есть этот класс прямоугольника, например:

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

, который наследует свойство доли от класса формы. теперь я хочу напечатать прямоугольник в панели. Я знаком с 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. У меня также есть проблема с назначением значения из кнопки щелчка в прямоугольник. Вы можете помочь мне?

+0

Вам нужно преобразовать MyRectangle в общий прямоугольник или просто выставить значения MyRectangle в массив точек, которые вы вычисляете из вашего startx/y и его длины, и использовать DrawPolygon. Я бы, вероятно, сделал метод в MyRectangle.GetRectangle(), который возвращает System.Drawing.Rectangle – Poody

+0

, должен ли я сделать метод draw в классе прямоугольника? что-то вроде «void draw() {System.Drawing.Rectangle (startx, starty, length, width);}« но это не работает – sara

+0

Я считаю, что ваше определение ширины в вашем классе формы должно, скорее всего, быть толщиной (так чтобы не путать с шириной в вашем унаследованном классе прямоугольника (и других). –

ответ

1

Возможно, у вас есть одна функция draw в вашем базовом классе, которая переопределяет каждую форму.

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 (графика). Определите прямоугольник:

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

, а затем в вашем OnPaint (или там, где ваши собираются это сделать):

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

красота делает это таким образом, вы можете иметь список и просто итерация через них и рисовать каждый раз у вас есть несколько форм:

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

Большое вам спасибо за это, но как я могу назвать это на моей панели ? – sara

+0

Получите графику для вашей панели, например: Graphics g = panel1.CreateGraphics(), а затем передайте ее функции рисования фигуры. После создания прямоугольника с именем rect1, например, вы можете просто вызвать rect1.Draw (g), чтобы привлечь его к panel1 –

+0

спасибо, что ты лучший :) – sara

0

следующий код позволяет перетаскивать и нарисовать прямоугольник на PictureBox. Преобразование реализовано в 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 для имен классов. (Форма вместо формы)

Смежные вопросы