2016-11-08 146 views
2

我對窗體編碼非常陌生,我試圖製作一個具有三個按鈕(圓形,矩形和線條)的小型圖形,當它獲得一個按鈕作爲輸入時,它將繪製形狀在面板中。 我有這種形狀類繪製一個矩形

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轉換爲通用Rectangle或將MyRectangle的值混合到從startx/y計算出的點數組中,並且它的長度和使用DrawPolygon。 我可能會在MyRectangle.GetRectangle()返回System.Drawing.Rectangle – Poody

+0

我應該在矩形類中繪製一個方法嗎?像「void draw(){System.Drawing.Rectangle(startx,starty,length,width);}」但這不起作用 – sara

+0

我相信你的形狀類中寬度的定義應該很可能是厚度因爲不要與你的矩形繼承類(和其他人)的寬度混淆。 –

回答

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(圖形)可以繪製任何形狀。 定義您的矩形:

 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上拖動和繪製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作爲類名。 (形狀而不是形狀)