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

Posted

技术标签:

【中文标题】如何使禁用的控件允许鼠标拖动或移动?【英文标题】:How to make disabled control allow to be draggable or move by mouse? 【发布时间】:2021-06-27 11:40:19 【问题描述】:

我用鼠标拖动控制

问题是如果 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;
        
    

【问题讨论】:

让它看起来被禁用但实际上不是? 我不明白为什么要为此禁用/启用控件。您是否出于某种原因修改了原始代码?因为从未使用过mouseOffset,即使这似乎是一种扩展方法,这里也没有定义扩展。 没有完全禁用 Control.Enabled = false。无论如何修改示例它不起作用,因为我无法复制整个代码。因为 SO 阻止了用更少的文字写很多代码。 为您的控件拍摄快照,并仅在控件处于“可拖动”状态时显示它而不是您的控件。 不是重点。 control_MouseEntercontrol_MouseLeave 实际上是原始代码的一部分吗?这两个与在运行时拖动控件并不完全相关,并且根本没有理由为此禁用控件。如果您从 NuGet 包中获得此信息,请验证该包是否有更新(使用 NuGet 包管理器),因为如果原始代码是您提供的代码,则它存在错误。 【参考方案1】:

您可以使用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;
    


【讨论】:

以上是关于如何使禁用的控件允许鼠标拖动或移动?的主要内容,如果未能解决你的问题,请参考以下文章

Cesium.js禁止三维球鼠标旋转、缩放、鼠标中键拖动

在 C# 中通过鼠标拖动来移动控件

C#怎么才能实现拖动控件时窗体也跟着移动

ScrollView 允许拖动内容。这怎么能被禁用?

WPF实现鼠标拖动控件并带有中间动效

canvas里有一张图,怎么实现鼠标可以拖动该图片移动,放大缩小旋转