在C#中拖放鼠标时移动控件 [英] Move controls when Drag and drop on panel in C#

查看:165
本文介绍了在C#中拖放鼠标时移动控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在面板上拖动控件,拖动时我想移动控件并将其位置放在面板上。我已经尝试了mouseUp,mouseDown,MouseMove事件的控件。但这不是我正在寻找。我想在面板上启动DragDrop事件并移动控件。我可以这样做吗如果你能给我一个想法,那将是巨大的。以下是我的代码的一部分。请纠正我非常感谢。

I want to drag controls on panel and when dragging I want to move the control and get its location to drop on to panel. I have tried out mouseUp, mouseDown, MouseMove events of control.But that is not what I am looking for. I want to fire DragDrop event on panel and move control. Can I do this? If you can give me an idea it will be great. Below is part of my code. Please correct me. Thanks a lot.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DragnDrop
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }
        Control mycontrol;
        int x, y;
        //Form1 f = new Form1();
        private void Form1_Load(object sender, EventArgs e)
        {

            foreach (Control c in this.panel1.Controls)
            {
                c.MouseMove += new MouseEventHandler(lblDragger_MouseMove);
                c.MouseUp += new MouseEventHandler(lblDragger_MouseUp);
                c.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
                c.MouseDoubleClick += new MouseEventHandler(pictureBox1_MouseDown);
            }
            panel2.AllowDrop = true;
            foreach (Control c in this.panel2.Controls)
            {
                c.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
            }
            panel2.DragOver += new DragEventHandler(panel2_DragOver);
            panel2.DragDrop += new DragEventHandler(panel2_DragDrop);  
        }

        bool isDragging ;
        int  clickOffsetX ;
        int  clickOffsetY ;

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            //  this.Cursor = Cursors.SizeAll;
            //pictureBox1 = (PictureBox)sender;
            Control c = sender as Control;

            //DoDragDrop(pictureBox1.Image, DragDropEffects.Copy);
            // validation = true;
            isDragging = true;
            clickOffsetX = e.X;
            clickOffsetY = e.Y;
            //  c.DoDragDrop(c, DragDropEffects.Move);  
        }

        private void lblDragger_MouseUp(System.Object sender, System.Windows.Forms.MouseEventArgs e)
        {
            isDragging = false;
        }

        private void panel2_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(Bitmap)))
            {
                e.Effect = DragDropEffects.Copy;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }

        private void panel2_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;  
        }

        private void panel2_DragDrop(object sender, DragEventArgs e)
        {
            Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control;
            mycontrol = c;
            if (c != null)
            {
                c.Location = this.panel2.PointToClient(new Point(e.X, e.Y));
                this.panel2.Controls.Add(c);
            }  
        }

        private void lblDragger_MouseMove(System.Object sender,
          System.Windows.Forms.MouseEventArgs e)
        {
            Control c = sender as Control;
            // bool isDragging = true;
            if (isDragging == true)
            {
                c.Left = e.X + c.Left - clickOffsetX;
                c.Top = e.Y + c.Top - clickOffsetY;
            }
        }

        private void panel1_MouseLeave(object sender, EventArgs e)
        {
            Control c = sender as Control;

            c.DoDragDrop(c, DragDropEffects.Move); 
        }
    }
}


推荐答案

如果您的控件已经在面板上,而您只是在同一个面板中移动,那么使用Mouse事件可能是最简单的方法。我的理解是,拖放更多的是在控件之间传递数据,甚至是应用程序。例如,如果您想允许控件在面板之间进行转移,拖放将是一个很好的选择。

If your control is already on the panel and you're simply moving it within the same panel, then using the Mouse events is probably the easiest way to do this. My understanding is that Drag and Drop is more about conveying data between controls or even applications. Drag and drop would be a good fit if you're trying to allow a control to transfer between panels, for example.

如果你想同时做这两个,那么这里有一个可能的想法:

If you want to do both, then here's one possible idea:


  1. 使用鼠标事件在同一个面板中执行移动

  1. Perform move dragging within the same panel using your Mouse events.

当您在面板上获取MouseLeave事件时,开始一个DragDrop操作(一些例子 here )您可以从面板中删除控件或者添加某种灰色效果来表示控件可能正在离开。

When you get a MouseLeave event on the panel, begin a DragDrop operation (some examples here) You can either remove the control from the panel or add some sort of 'gray out' effect to indicate that the control may be leaving.

在目标面板上处理DragDrop,并将控件放在

Handle the DragDrop on your target panel and place the control at the mouse location of the drop.

这结合了拖动控件的直观感觉,同时也提供了一种方法拖动过去面板并转到新的表面。

This combines the intuitive feel of dragging the control around, while also providing a way to drag 'past' the panel and on to a new surface.

这篇关于在C#中拖放鼠标时移动控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆