从多个类中调用Form1上的pictureBox1的最佳方法是什么?

时间:2016-12-19 23:57:02

标签: c# .net winforms

我有两节课。和form1上的pictureBox1。 在第一堂课我正在使用pictureBox1:

在课堂上:

public System.Windows.Forms.PictureBox pb1;

然后在类构造函数中:

InitializeTest(pb1);

在InitializeTest里面我正在使用pb1。

在Form1中:

DopplerRadar dr = new DopplerRadar();
dr.pb1 = pictureBox1;
dr.Init();

现在我有另一个班级:

class GeneratePoints
    {
        private Bitmap backImage;
        public Color backImagecolor;
        public Bitmap imageWithPoints;
        public int numberOfPoints;
        public bool randomPoints;
        public bool randomColors;

        private List<Point> points = new List<Point>();
        private Random r = new Random();

        private void Init()
        {
            backImage = new Bitmap(pb1.Width, pb1.Height);

而且在这个类中我想在form1中使用pictureBox1。 我可以在这个类中声明pb1:

public System.Windows.Forms.PictureBox pb1;

问题是,是否有更好的方法可以做到这一点? 如果我想在另一个项目中使用这两个类?

1 个答案:

答案 0 :(得分:0)

两种方法

您可以将对PictureBox的引用传递给将要使用它的函数或方法。然后该功能可以进行绘图。

例如,如果您的Generatepoints类需要能够将其绘制到PictureBox上,请定义一个如下所示的方法:

class GeneratePoints 
{
    ...
    public void Draw(PictureBox pictureBox)
    {
        using (Graphics g = Graphics.FromHwnd(pictureBox.Handle))
        {
            foreach (var p in points)
            {
                //Draw the point
            }
        }
    }
}

这种方法不太直观,但更常见。

为PictureBox的Paint事件创建一个事件处理程序。在处理程序中,出去抓取GeneratePoints类的当前实例并使用其数据绘制点。

这种方法的优点是只有在需要绘制图片框时才会运行;如果图片框包含在隐藏的表单上(例如,通过其上方的另一个窗口),它将无法运行。