如果两个按钮重叠,在C#中如何随着鼠标的移动对被覆盖的按钮执行OnMouseHover?

问题描述 投票:0回答:1

我正在尝试在 Windows 窗体中制作数独游戏。该应用程序的功能就像有 81 个按钮(减去给定的图块),在其他图块上,我希望悬停时在小按钮中显示数字 1 到 9。

我的问题是,因为您位于按钮 1-9 上,所以鼠标似乎不在“主字段按钮”上,即使这些按钮是在内部创建的。

您对底层按钮执行“OnMouseHover”有什么建议吗?

c# winforms
1个回答
0
投票

虽然可能有更简单的方法来实现这个程序,并且可能不需要将按钮放在相同的位置,但是根据您的需要,如果两个按钮在表单中重叠,可以使用以下解决方案,即“OnMouseHover”方法两个按钮都可以调用。

假设按钮的名称是“TopButton”和“UnderlyingButton”。如果我们将以下行放入“TopButton_MouseHover”中,通过将鼠标移动到顶部按钮上,将找到另一个按钮并执行其“MouseHover”:

FindUnderlyingButtonsAndRaiseOnMouseHover(sender, e);

但是,我们可以更轻松地实现相同的结果,而不是对每个顶部按钮执行上述技巧。通过在主窗体的“OnLoad”事件处理程序中调用“SetOnMouseHoverForTopButtons”并传递顶部按钮列表作为参数,设置将被应用,并且当鼠标移动时,将对所有覆盖的按钮执行“OnMouseHover”。

程序如下:

public partial class FormMain : Form
{
    public FormMain()
    {
        InitializeComponent();
    }
    private List<DesiredType> GetListOfUnderlyingControls<DesiredType>(DesiredType TopControl) where DesiredType: Control
    {
        var listOfUnderlyingControls = new List<DesiredType>();
        var CenterPointOfTopControl = new Point((TopControl.Left + TopControl.Right) / 2, (TopControl.Top + TopControl.Bottom) / 2);
        foreach (Control UnderlyingControl in Controls)
            if (
                (UnderlyingControl.GetType() == typeof(DesiredType)) &&
                (UnderlyingControl.Name != TopControl.Name) &&
                UnderlyingControl.Bounds.Contains(CenterPointOfTopControl)
               )
                listOfUnderlyingControls.Add((DesiredType)UnderlyingControl);
        return listOfUnderlyingControls;
    }
    private void FindUnderlyingButtonsAndRaiseOnMouseHover(object sender, EventArgs e)
    {
        var ListOfUnderlyingButtons = GetListOfUnderlyingControls((Button)sender);
        foreach (var UnderlyingButton in ListOfUnderlyingButtons)
        {
            var OnMouseHoverEventHandler = UnderlyingButton.GetType().GetMethod("OnMouseHover", BindingFlags.Instance | BindingFlags.NonPublic);
            if (OnMouseHoverEventHandler != null)
                OnMouseHoverEventHandler.Invoke(UnderlyingButton, new object[] { e });
        }
    }

    private void TopButton_MouseHover(object sender, EventArgs e)
    {
        // FindUnderlyingButtonsAndRaiseOnMouseHover(sender, e);
    }

    private void UnderlyingButton_MouseHover(object sender, EventArgs e)
    {

    }
    private void FormMain_Load(object sender, EventArgs e)
    {
        SetOnMouseHoverForTopButtons(TopButton);
        // SetOnMouseHoverForTopButtons(TopButton, button1, button2);
    }
    public void SetOnMouseHoverForTopButtons(params Button[] ArrayOfTopMostButtons)
    {
        foreach (var ATopMostButton in ArrayOfTopMostButtons)
            ATopMostButton.MouseHover += (object sender, EventArgs e) => { FindUnderlyingButtonsAndRaiseOnMouseHover(sender, e); };
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.