【问题标题】:Fix Graphics draw area size修复图形绘制区域大小
【发布时间】:2011-09-02 12:37:15
【问题描述】:

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

在“扫描仪”上,我目前正在上面画一个圆圈。可以将组件添加到 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));
    }
}

【问题讨论】:

  • 我可能在这里遗漏了一些东西,但是... g.DrawEllipse(green, 25, 25, 250, 250);做你想做的事……?
  • 我想在一个 300x300 的图像上绘制“扫描仪”,然后将此图像传输到窗体上的实际控件,实际控件可以是任意大小(但始终是正方形)所以如果控件为 500x500,则 300x300 图像将被放大到 500x500。希望这会有所帮助

标签: c# winforms graphics drawing gdi


【解决方案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);
    }

}

【讨论】:

  • 要回答您的其他问题,您实际上不需要从 Panel 或 Picturebox 派生,除非您想使用它们现有的功能。您可以很好地从 Control 派生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 2015-11-10
相关资源
最近更新 更多