尝试使用visual studio e在c#中绘制一个pacman开始画点,但是我有一些麻烦,我写这个类来制作圆点。
public class draw : System.Windows.Forms.Control
{
public draw(int x, int y, int h, int c) {
System.Drawing.SolidBrush brush1 = new System.Drawing.SolidBrush(System.Drawing.Color.Yellow);
System.Drawing.Graphics formGraphics = this.CreateGraphics();
formGraphics.FillEllipse(brush1, new System.Drawing.Rectangle(x, y, h, c));
brush1.Dispose();
formGraphics.Dispose();
}
}
然后在按下按钮的形式,它应该创建一些点,但没有任何反应
draw d = new draw(100,100,100,100);
draw d1 = new draw(200,200,200,200);
答案 0 :(得分:0)
您的代码中有两个错误:
1 - 对表格或控件的绘制是非持久性的;所有绘图必须在Paint
事件中发生或从那里触发。一个好的解决方案是在那里调用绘图代码,并将e.Graphics
事件的Paint
作为参数传递。
2 - 您使用CreateGraphics
并尝试绘制。一旦你结果,结果就会消失。最小化您的窗口并恢复它。但事实上,首先没有任何表现。为什么?好吧,你的绘制blob是一个内部类,这里关键字this
指的是而不是表单,而指的是绘图类。所以你为一个不可见的控件创建一个Graphics(没有大小,而且不是表单的一部分),当然,没有任何反应..
如果你想要绘图项目,他们应该
存储他们的大小,位置,状态等(在他们的构造函数中)和
有一个绘图方法,你可以从外面调用,然后交给一个Graphics对象然后自己绘制..
他们也应该有一个更好的名字,比如 Dot 或 PacDot 等。
这是最小版本:
// a list of all PacDots:
public List<PacDot> theDots = new List<PacDot>();
public class PacDot : System.Windows.Forms.Control
{
public PacDot(int x, int y, int w, int h)
{
Left = x; Top = y; Width = w; Height = h;
}
public void Draw(Graphics G)
{
G.FillEllipse(Brushes.Brown,
new System.Drawing.Rectangle(Left, Top, Width, Height));
}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
foreach (PacDot dot in theDots) dot.Draw(e.Graphics);
}
// a test button:
private void button1_Click(object sender, EventArgs e)
{
theDots.Add(new PacDot(30, 10, 5, 5));
theDots.Add(new PacDot(30, 15, 5, 5));
theDots.Add(new PacDot(15, 10, 5, 5));
this.Invalidate();
}
PS:由于你的绘图类确实是一个Control descedent,你也可以使用form1.Controls.Add(..);将它们添加到Form中。但是他们仍然需要有一个油漆事件,他们自己画画..