Перетащите картинку в поле «Форма» - PullRequest
2 голосов
/ 26 сентября 2011

Я пишу игру. Игрок может выбрать предметы (например, оружие) и перетащить их в форму. Элементы находятся сбоку, в PictureBox элементах управления. Я установил Form.AllowDrop на True. Когда я перетаскиваю один из элементов pictureBoxes, pictureBox не падает, даже не перетаскивается.

Я хочу перетащить изображение в поле или хотя бы узнать положение в форме, в которое игрок хочет перетащить его.

РЕДАКТИРОВАТЬ: посмотрите на логотип выше. При нажатии и перетаскивании (без отпускания) он перетаскивается.

Ответы [ 2 ]

5 голосов
/ 26 сентября 2011

В 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);
}
1 голос
/ 26 сентября 2011

Для перетаскиваемых элементов необходимо вызвать метод DoDragDrop в событии MouseDown.Убедитесь, что для вашей формы (или цели) для свойства 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...