【问题标题】:Drawing controls on screen Winforms在屏幕 Winforms 上绘制控件
【发布时间】:2014-04-02 13:55:24
【问题描述】:

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

我的主课上有这个

Panel dragAble = new Panel();

在我的 dragDrop 事件中我有这个

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

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

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

在Windows中也是一样,拖动文件或文件夹时,拖动时可以看到。

【问题讨论】:

标签: c# windows winforms


【解决方案1】:

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

【讨论】:

  • 这不会解决这个问题。问题是怎么画。
  • 是的,如何在鼠标位置上绘制新控件
【解决方案2】:

您需要将推荐的 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 事件的对象。所以你必须听他们的,而不是形式本身。您还需要确保拖动的控件在前面。

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

【讨论】:

  • 意味着我必须创建一个新光标?我不能只在 Mike 的鼠标位置上绘制控件吗?
  • 这可能是个坏主意——你必须把光标画在上面,它可能看起来很丑。自定义光标是正确的答案。动态移动控件,而 an 答案,将是更多的问题。也就是说,我会玩一玩,看看我能解决什么问题。
  • 迈克你有什么新东西吗?
  • 非常感谢 Mike :) 为我工作! :)
  • 我很高兴。如果它解决了您的问题,请将其标记为答案:)
猜你喜欢
  • 1970-01-01
  • 2017-02-25
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多