2011-05-26 75 views
0

我刚刚开始学习GDI +绘制线条,圆圈等系统。我创建了一个组件(扫描仪),它继承了一个Panel来绘制(不确定面板或图片框是最好)。Fix Graphics绘图区域大小

在“扫描仪”我正在其上画一个圆圈。该组件可以添加到winform中,并且在winform调整大小时使用对接将调整大小。此刻,我得到组件的大小来计算圆的大小,但我想要做的事情基本上是说,无论组件大小是多少,“画布”总是300 x 300宽,所以我可以说该圆应位于25,25,大小为250x250。

正如您可能从名称“扫描仪”中猜出的那样,我想在它上面绘制点,但这些将从中心(150,150)位置计算得出。

下面是我有的代码,基本上绘制了圆圈。

非常感谢您的帮助。

public partial class Scanner : Panel 
{ 
    public Scanner() { 
     InitializeComponent(); 
     this.DoubleBuffered = true; 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
     Graphics g = e.Graphics; 
     Draw(g); 
     base.OnPaint(e); 
    } 
    protected override void OnResize(EventArgs e) { 
     Graphics g = this.CreateGraphics(); 
     Draw(g); 
     base.OnResize(e); 
    } 

    private void Draw(Graphics g) { 
     g.Clear(Color.Black); 
     g.PageUnit = GraphicsUnit.Pixel; 
     Pen green = new Pen(Color.Green); 
     Font fnt = new Font("Arial", 10); 
     SolidBrush sb = new SolidBrush(Color.Red); 

     int pos = (this.Width < this.Height ? this.Width : this.Height)/2; 
     int size = (int)(pos * 1.9); 
     pos -= ((int)size/2); 
     g.DrawEllipse(green, pos, pos, size, size); 
     g.DrawString(this.Width.ToString(), fnt, sb, new Point(0, 0)); 
    } 
} 
+0

我可能失去了一些东西,但是... g.DrawEllipse(绿色,25,25,250,250);做你想要的...? – 2011-05-26 13:42:01

+0

我想在300x300图像上绘制“扫描仪”,然后将该图像转移到窗体上的实际控件上,实际控件的大小可以是任意大小(但始终为正方形),所以如果控件是500x500,那么300x300图像将被放大到500x500。希望这可以帮助 – harag 2011-05-26 14:13:47

回答

1

根据您最近的评论,我理解你想要做您的绘图一个固定大小的画布上,并绘制控制这里面的帆布,大如将适合的控制。

尝试下面的代码:

public class Scanner : Panel 
{ 
    private Image _scanner; 

    public Scanner() 
    { 
     this.SetStyle(ControlStyles.ResizeRedraw, true); 

     CreateScanner(); 
    } 

    private void CreateScanner() 
    { 
     Bitmap scanner = new Bitmap(300, 300); 
     Graphics g = Graphics.FromImage(scanner); 

     g.DrawEllipse(Pens.Green, 25, 25, 250, 250); 

     g.Dispose(); 
     _scanner = scanner; 
    } 

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

     int shortestSide = Math.Min(this.Width, this.Height); 

     if (null != _scanner) 
      e.Graphics.DrawImage(_scanner, 0, 0, shortestSide, shortestSide); 
    } 

} 
+0

并回答您的其他问题,除非您想使用其现有功能,否则实际上并不需要从Panel或Picturebox派生。你可以从Control中派生出来。 – 2011-05-26 14:41:09

+0

非常感谢,似乎很好! – harag 2011-05-26 18:51:08