我刚刚开始学习绘制线条,圆形等的GDI +系统。我创建了一个继承了Panel的组件(扫描仪)(不确定面板或图片框是否最好)。
在“扫描仪”上我正在画一个圆圈。可以将组件添加到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 :(得分: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);
}
}