如何在C#窗体中右键单击禁用按钮来启用该按钮



在我的C#迷你应用程序中,我有一个按钮,我想通过右键点击来启用和禁用它。即,当右键点击按钮时,它会变为禁用,当它被禁用时,右键点击它会将其状态变为启用。禁用启用按钮很简单,但通过右键单击启用按钮是不可能的;因为按钮被禁用,而不是事件被发送到emaciate代码。我该怎么办?

禁用控件的鼠标事件会传递到其Parent

您可以在那里捕捉它们,并测试光标是否在按钮上。

示例:

if (button1.Bounds.Contains(e.Location)) button1.Enabled = true;

如果你有几个按钮,你需要测试它们。:

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
foreach (Control ctl in panel1.Controls)
{
if (ctl is Button && ctl.Bounds.Contains(e.Location)) 
ctl.Enabled = true;
} 
}

如果只应该启用鼠标右键,那么添加一个测试,可能是这样的:

if (e.Button.HasFlag(MouseButtons.Right) && 
ctl is Button && ctl.Bounds.Contains(e.Location)) 

右键点击以启用和禁用按钮不是标准或推荐的按钮行为,因此API完全忽略了它的简单实现。一旦禁用按钮,它将不再捕获鼠标事件,但表单会捕获。

public partial class Form1 : Form
{
private Boolean _button1IsRightClicked;
public Form1()
{
InitializeComponent();
_button1IsRightClicked = false;
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hi");
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.X >= button1.Location.X && e.X <= (button1.Location.X + button1.Width) &&
e.Y >= button1.Location.Y && e.Y <= (button1.Location.Y + button1.Height))
{
_button1IsRightClicked = true;
}
else
{
_button1IsRightClicked = false;
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (e.X >= button1.Location.X && e.X <= (button1.Location.X + button1.Width) &&
e.Y >= button1.Location.Y && e.Y <= (button1.Location.Y + button1.Height))
{
_button1IsRightClicked = false;
enableDisableButton1(button1.Enabled);
}
else
{
_button1IsRightClicked = false;
}
}
private void enableDisableButton1(Boolean isEnabled)
{
if (isEnabled)
{
button1.Enabled = false;
isEnabled = false;
}else
{
button1.Enabled = true;
isEnabled = true;
}
}
private void button1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
_button1IsRightClicked = true;
}
else
{
_button1IsRightClicked = false;
}
}
private void button1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right && _button1IsRightClicked == true)
{
_button1IsRightClicked = false;
enableDisableButton1(button1.Enabled);
}
else
{
_button1IsRightClicked = false;
}
}
}

最新更新