微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使禁用的控件允许拖动或通过鼠标移动?

如何解决如何使禁用的控件允许拖动或通过鼠标移动?

我使用鼠标拖动控制

问题是如果 Control.Enabled = false。拖动不行吗?有没有什么方法可以重载来防止这种行为?

    static void control_MouseEnter(object sender,EventArgs e)
    {
        (sender as Control).Enabled = false;
        (sender as Control).Cursor = Cursors.SizeAll;
    }
    static void control_MouseLeave(object sender,EventArgs e)
    {
        (sender as Control).Enabled = true;
    //    (sender as Control).Cursor = Cursors.Default;
    }

    static void control_MouseDown(object sender,MouseEventArgs e)
    {
        mouseLocation = e.Location;
        // turning on dragging
        draggables[(Control)sender] = true;
    }
    static void control_MouseUp(object sender,MouseEventArgs e)
    {
        // turning off dragging
        draggables[(Control)sender] = false;
    }
    static void control_MouseMove(object sender,MouseEventArgs e)
    {
        // only if dragging is turned on
        if (draggables[(Control)sender] == true)
        {
            var control = (sender as Control);

            control.Left = e.X + control.Left - mouseLocation.X;
            control.Top = e.Y + control.Top - mouseLocation.Y;
        }
    }

解决方法

您可以使用 IMessageFilter 捕获 WM_MOUSEMOVE。

在这里,当鼠标在pictureBox1 中移动时,我正在更改表单的标题。它还告诉您鼠标左键是否按下:

public partial class Form1 : Form
{

    private MyFilter mf;

    public Form1()
    {
        InitializeComponent();
    }



    private void Form1_Load(object sender,EventArgs e)
    {
        pictureBox1.Enabled = false;

        mf = new MyFilter();
        mf.PreFilterMouseMove += Mf_PreFilterMouseMove;
        Application.AddMessageFilter(mf);
    }

    private void Mf_PreFilterMouseMove()
    {
        Point pt = pictureBox1.PointToClient(Cursor.Position);
        if (pictureBox1.ClientRectangle.Contains(pt))
        {
            bool leftDown = (Control.MouseButtons == MouseButtons.Left);
            this.Text = "leftDown = " + leftDown + " : position = " + pt.ToString();
        }
        else
        {
            this.Text = "...not within pictureBox1...";
        }
    }
}

public class MyFilter : IMessageFilter
{

    private const int WM_MOUSEMOVE = 0x200;
    public delegate void dlgMouseMove();
    public event dlgMouseMove PreFilterMouseMove;

    public bool PreFilterMessage(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_MOUSEMOVE:
                if (PreFilterMouseMove != null)
                {
                    PreFilterMouseMove();
                }
                break;
        }
        return false;
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。