修复图形绘制区域大小

本文关键字:区域 绘制 图形 | 更新日期: 2023-09-27 17:57:54

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

在"扫描仪"上,我正在上面画一个圆圈。该组件可以添加到winform中,当winform调整大小时,使用停靠将调整大小。目前,我正在计算组件的大小,以计算圆的大小,但我想做的基本上是说,无论组件的大小如何,"画布"总是300 x 300宽,所以我可以说圆应该定位在25,25,大小为250x250。

正如你可能从"扫描仪"的名称中猜到的那样,我想在它上绘制点,但这些点将从中心(150150)位置计算。

下面是我的代码,基本上画了一个圆圈。

非常感谢您在这方面的帮助。

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));
    }
}

修复图形绘制区域大小

根据您最近的评论,我理解您希望在固定大小的画布上绘制,并在控件内绘制此画布,使其尽可能大。

试试下面的代码:

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);
    }
}