C# 固定图形绘制区域大小

C# 固定图形绘制区域大小,c#,winforms,graphics,drawing,gdi,C#,Winforms,Graphics,Drawing,Gdi,我刚刚开始学习用于绘制直线、圆等的GDI+系统。我创建了一个组件(扫描仪),它继承了一个要绘制的面板(不确定面板或图片框是否最佳) 在“扫描仪”上,我正在上面画一个圆圈。可以将组件添加到winform,并在winform调整大小时使用停靠调整大小。目前,我正在获取组件的大小,以计算圆的大小,但我想做的基本上是说,无论组件的大小如何,“画布”总是300 x 300宽,因此我可以说,圆应该定位在25,25,大小为250x250 正如您可能从名称“扫描仪”猜到的,我想在其上绘制点,但这些点将从中心(1

我刚刚开始学习用于绘制直线、圆等的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));
    }
}
公共部分类扫描仪:面板
{
公共扫描器(){
初始化组件();
this.DoubleBuffered=true;
}
受保护的覆盖无效OnPaint(PaintEventArgs e){
图形g=e.图形;
抽签(g);
基础漆(e);
}
受保护的覆盖void OnResize(事件参数e){
Graphics g=this.CreateGraphics();
抽签(g);
基数(e);
}
私人空间绘制(图形g){
g、 清晰(颜色为黑色);
g、 PageUnit=GraphicsUnit.Pixel;
钢笔绿色=新钢笔(颜色为绿色);
Font fnt=新字体(“Arial”,10);
SolidBrush sb=新的SolidBrush(颜色为红色);
int pos=(this.Width
根据您最近的评论,我知道您希望在固定大小的画布上进行绘制,并在控件内绘制此画布,使其尽可能大

请尝试以下代码:

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

}

我可能错过了什么,但是。。。g、 抽屉(绿色,25,25,250,250);我想在300x300图像上绘制“扫描仪”,然后将此图像传输到表单上的实际控件,实际控件可以是任意大小(但始终为正方形),因此如果控件为500x500,则300x300图像将放大到500x500。希望这有助于回答您的另一个问题,您实际上不需要从Panel或Picturebox派生,除非您想使用它们现有的功能。你可以很好地从控制中派生。