在Winforms屏幕上绘制控件

时间:2014-04-02 13:55:24

标签: c# windows winforms

我的flowLayoutPanel中有一个拖放操作。现在,在拖动某些控件时,我希望通过鼠标在鼠标坐标上移动来显示该控件。

我在我的主要课程中有这个

Panel dragAble = new Panel();

在我的dragDrop事件中我有这个

dragAble.Width = item.Width;
dragAble.Height = item.Height;
dragAble.Left = e.X;
dragAble.Top = e.Y;

我指定新控件(必须显示)的宽度和高度以拖动宽度和高度。并将其坐标设置为鼠标坐标。

我需要在dragEnter事件处理程序上绘制它。如何在屏幕上显示?

在Windows中也是如此,当拖动文件或文件夹时,您可以在拖动时看到它。

2 个答案:

答案 0 :(得分:0)

您可以使用MouseDown,MouseMove,MouseUp事件来处理此问题 创建一个像IsMouseDown = false的布尔标志 在MouseDown上将IsMouseDown设置为true 在MouseMove上检查flage是否为true然后更改left和top属性dragAble.Left = e.X; dragAble.Top = e.Y; 在MouseUp上只是将IsMouseDown设置为false

答案 1 :(得分:0)

您需要将isipro推荐的自定义光标与此处的教程http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop(v=vs.110).aspx

结合使用

这比你想要的工作多一点,但这也是一个相当复杂的问题。

编辑:
这里有一些代码可以满足您的要求。它可以设计得更好,但它可以解决问题:

class Dragger
{
    private readonly Form _parent;
    private Panel _dragee;

    public Dragger(Form parent)
    {
        _parent = parent;
    }

    public void MouseMoved(object sender, MouseEventArgs e)
    {
        if (_dragee != null)
        {
            _dragee.Location = _parent.PointToClient(Cursor.Position);
        }
    }

    public void StartDragging(Panel panel)
    {
        _dragee = panel;
    }

    public void StopDragging()
    {
        _dragee = null;
    }
}


public partial class Form1 : Form
{
    private readonly Dragger _dragger;

    public Form1()
    {
        InitializeComponent();
        _dragger = new Dragger(this);
        panel1.MouseMove += _dragger.MouseMoved;
        panel1.MouseDown += panel1_MouseDown;
        panel1.MouseUp += panel1_MouseUp;
    }

    void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        _dragger.StopDragging();
    }

    void panel1_MouseDown(object sender, MouseEventArgs e)
    {

        _dragger.StartDragging((Panel)sender);
    }

}

重要说明:如果单击面板并拖动它,则对象本身就是开始生成mousemove事件的对象。所以你必须倾听它们,而不是形式本身。您还需要确保拖动的控件在前面。

祝你好运 - 真的,自定义光标是要走的路:)