c# - 引用多个实例化图片框

标签 c# winforms mouseevent picturebox eventargs

我对 C# 很陌生,但正在尝试学习,所以如果我的语法不准确,请耐心等待。我可以创建一个带有按钮的图片框,它会出现在屏幕上。然后我可以使用鼠标按下/鼠标移动功能在屏幕上移动它。然后,我按下按钮来实例化另一个要创建的图片框,并且也可以移动该图片框,但是当我尝试移动第一个图片框时,第二个图片框会移动并变得疯狂。有没有一种方法可以在实例化时引用或标记这些框,以便当我单击其中任何一个框时,我可以在屏幕上移动它们?

public partial class Form1 : Form
{
    Point MP;
    private static Control PB;        

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        int picSizeX = Properties.Resources.police.Width / 3;
        int picSizeY = Properties.Resources.police.Height / 3;

        PictureBox pb = new PictureBox();
        pb.Location = new Point(100, 100);
        pb.Size = new Size(picSizeX, picSizeY);
        pb.Image = new Bitmap(Properties.Resources.police);
        pb.SizeMode = PictureBoxSizeMode.StretchImage;
        Controls.Add(pb);
        pb.Tag = "veh";
        PB = pb;

        pb.MouseDown += Pb_MouseDown;
        pb.MouseMove += Pb_MouseMove;
        pb.MouseHover += Pb_MouseHover;
    }

    private void Pb_MouseHover(object sender, EventArgs e)
    {
        PB.MouseHover += PB_MouseHover;
    }

    private void PB_MouseHover(object sender, EventArgs e)
    {

    }

    private void Pb_MouseDown(object sender, MouseEventArgs e)
    {
        MP = e.Location;
    }

    private void Pb_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
           PB.Left = e.X + PB.Left - MP.X;
           PB.Top = e.Y + PB.Top - MP.Y;
        }
    }
}

最佳答案

实际上不需要在类级别进行控制。

在事件方法中,有一个名为对象发送者的参数,其中包含对引发事件的控件/对象的引用。

Point MP;
//private Control PB; //commented out as it is not required

public Form1()
{
    InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
     int picSizeX = Properties.Resources.police.Width / 3;
     int picSizeY = Properties.Resources.police.Height / 3;

     PictureBox pb = new PictureBox();
     pb.Location = new Point(100, 100);
     pb.Size = new Size(picSizeX, picSizeY);
     pb.Image = new Bitmap(Properties.Resources.police);
     pb.SizeMode = PictureBoxSizeMode.StretchImage;
     Controls.Add(pb);
     pb.Tag = "veh";
     //PB = pb;

     pb.MouseDown += Pb_MouseDown;
     pb.MouseMove += Pb_MouseMove;
     pb.MouseHover += Pb_MouseHover;
}

private void Pb_MouseHover(object sender, EventArgs e)
{
     Control pbObj = sender as PictureBox; //sender refers to control that raised the event
     pbObj.MouseHover += PB_MouseHover;
}

private void PB_MouseHover(object sender, EventArgs e)
{

}

private void Pb_MouseDown(object sender, MouseEventArgs e)
{
    MP = e.Location;
}

private void Pb_MouseMove(object sender, MouseEventArgs e)
{
     Control pbObj = sender as PictureBox; //sender refers to control that raised the event

     if (e.Button == MouseButtons.Left)
     {
         pbObj.Left = e.X + pbObj.Left - MP.X;
         pbObj.Top = e.Y + pbObj.Top - MP.Y;
     }
}

关于c# - 引用多个实例化图片框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38464929/

相关文章:

c# - Databind 无法通过 IBindableComponent 进行转换

c# - 如何在禁用的按钮上显示工具提示?

java - 处理两个重叠节点上的鼠标事件 - Javafx

c# - SharePoint 列值包含额外的 ;# 字符

c# - 如何设置刻度线的间隔?

python - .rect 上鼠标 'click' 时的 Pygame Action ?

c - Linux 中的鼠标事件处理?

c# - 反序列化似乎不适用于 IDE 中的强命名对象

c# - 生物识别指纹正在提供其他人的信息

c# - 两位小数 float 在单元格中更改为多位小数