拖,将一个pictureBox放到Form上

本文关键字:pictureBox 一个 放到 Form | 更新日期: 2023-09-27 18:09:33

我正在编写一款游戏。玩家可以选择道具(如武器)并将其拖拽到表单中。项目在一侧,在PictureBox控件中。我将Form.AllowDrop设置为True。当我拖动其中一个项目pictureBoxes时,pictureBox不下降,甚至不拖动。

我想在窗体上拖动一个pictureBox,或者至少知道玩家想要将其拖动到窗体中的位置

编辑:看上面的标志。当你点击它并拖动(不释放)时,它会拖动。

拖,将一个pictureBox放到Form上

在Winforms中,您需要更改光标。下面是一个完整的示例,启动一个新的窗体项目并在窗体上放置一个图片框。将其Image属性设置为一个小位图。单击并拖动可将图像的副本拖放到窗体上。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.AllowDrop = true;
        this.pictureBox1.MouseDown += pictureBox1_MouseDown;
    }
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            var dragImage = (Bitmap)pictureBox1.Image;
            IntPtr icon = dragImage.GetHicon();
            Cursor.Current = new Cursor(icon);
            DoDragDrop(pictureBox1.Image, DragDropEffects.Copy);
            DestroyIcon(icon);
        }
    }
    protected override void OnGiveFeedback(GiveFeedbackEventArgs e) {
        e.UseDefaultCursors = false;
    }
    protected override void OnDragEnter(DragEventArgs e) {
        if (e.Data.GetDataPresent(typeof(Bitmap))) e.Effect = DragDropEffects.Copy;
    }
    protected override void OnDragDrop(DragEventArgs e) {
        var bmp = (Bitmap)e.Data.GetData(typeof(Bitmap));
        var pb = new PictureBox();
        pb.Image = (Bitmap)e.Data.GetData(typeof(Bitmap));
        pb.Size = pb.Image.Size;
        pb.Location = this.PointToClient(new Point(e.X - pb.Width/2, e.Y - pb.Height/2));
        this.Controls.Add(pb);
    }
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    extern static bool DestroyIcon(IntPtr handle);
}

对于可拖动项,您需要在MouseDown事件中调用DoDragDrop方法。确保您的表单(或目标)将AllowDrop属性设置为true。

对于目标,您需要连接拖动事件:

private void Form1_DragOver(object sender, DragEventArgs e)
{
  e.Effect = DragDropEffects.Copy;
}
private void Form1_DragDrop(object sender, DragEventArgs e)
{
  // Examine e.Data.GetData stuff
}