如何使禁用的控件允许鼠标拖动或移动?
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_MouseEnter
和 control_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;
【讨论】:
以上是关于如何使禁用的控件允许鼠标拖动或移动?的主要内容,如果未能解决你的问题,请参考以下文章