C# 如何将winforms与抽象类一起使用
我有一个抽象类“Element”,其实例必须使用System.Drawing中的函数DrawRectangle()。 问题是,由于类是抽象的,它无法从表单继承,因此程序无法识别这些类。。 我怎样才能解决这个问题? 我尝试在元素中放入一个Form类型的变量,但没有成功。 我也尝试了相反的方法,在表单中放入一个元素变量。 这是我第一次使用Winform和C#。。。 这应该是一个鼠标竞赛游戏,在页面中绘制的对象应该追逐鼠标或向其他方向移动,但我需要它是面向对象的C# 如何将winforms与抽象类一起使用,c#,winforms,oop,abstract-class,factory,C#,Winforms,Oop,Abstract Class,Factory,我有一个抽象类“Element”,其实例必须使用System.Drawing中的函数DrawRectangle()。 问题是,由于类是抽象的,它无法从表单继承,因此程序无法识别这些类。。 我怎样才能解决这个问题? 我尝试在元素中放入一个Form类型的变量,但没有成功。 我也尝试了相反的方法,在表单中放入一个元素变量。 这是我第一次使用Winform和C#。。。 这应该是一个鼠标竞赛游戏,在页面中绘制的对象应该追逐鼠标或向其他方向移动,但我需要它是面向对象的 using System; using
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace MyMouseGame
{
public abstract class Element
{
//Form1 myForm = new Form1();// not sure I need it
public enum EnumShape { Square, Circle, Triangle }
public enum EnumType { Chase, Escape, Random }
//variables
private double X { get; set; }
private double Y { get; set; }
private int Size { get; }
private int Speed { get; }
private EnumShape Shape { get; set; }
protected EnumType Type { get; set; }
private static Random R = new Random();
//methods
public int generateRandomNum()
{
int randomNum = R.Next(20, 100);
return randomNum;
}
public Element()
{
X= 0;
Y = 0;
Shape = 0;
Size = generateRandomNum();
Speed = generateRandomNum();
Type = 0;
}
public void ElementsFactory()
{
}
public void hitTarget(e) { }
public abstract void Draw(Form1 g); //here I tried to pass a form inside
public abstract void Move();
}
}
绘图程序需要两件事。图形对象,以及绘图区域的大小 例如,在图形区域的中心绘制圆
public void Draw(Graphics g, Size target)
{
int diameter = 16;
g.DrawEllipse(Pens.Black, target.Width/2 - diameter/2, target.Height/2 - diameter/2, diameter, diameter);
}
在窗体的绘制事件中,调用所有绘制函数
void panel1_Paint(object sender, PaintEventArgs e)
{
foreach(var item in Elements)
{
item.Draw(e.Graphics, pictureBox1.ClientSize);
}
}
Element
不需要是抽象的,是吗?我认为它需要是抽象的,因为它本身没有实现它的方法,但它的“child”是表单类不需要从Element
继承的-它需要传递具体的实例才能绘制.g=panel1.CreateGraphics();绘制事件应使用e.Graphics参数。另外:如果您想要持久图形,请不要尝试缓存图形对象。-另外:t.Tick+=neweventhandler(timer1\u Tick)代码>这会在每次绘制调用时添加另一个勾号调用。当然不是你想要的。你说永远不要试图缓存图形对象是什么意思?另外:e.CreateGaphics()无法识别create graphics方法。怎么办?另外:如果我想要绘制不同的元素,我应该在不同的线程中绘制吗?谢谢
void panel1_Paint(object sender, PaintEventArgs e)
{
foreach(var item in Elements)
{
item.Draw(e.Graphics, pictureBox1.ClientSize);
}
}