繁体   English   中英

C#Windows窗体鼠标事件问题中的自定义控件

[英]Custom controls in C# Windows Forms mouse event question

我有一个用于Panel控件的mouseenter和mouseleave事件,当鼠标进入时会改变背景颜色,当它离开时会返回白色。

我也在此面板中有Label控件,但当鼠标进入Label控件时,面板的mouseleave事件将触发。

这是有道理的,但是当鼠标位于其区域而其他控件不会影响它时,如何保持Panel的背景颜色相同?

您可以使用GetChildAtPoint()来确定鼠标是否在子控件上。

private void panel1_MouseLeave(object sender, EventArgs e)
{
    if (panel1.GetChildAtPoint(panel1.PointToClient(MousePosition)) == null)
    {
        panel1.BackColor = Color.Gray;
    }
}

如果控件实际上不是子控件,您仍然可以使用MousePosition和PointToScreen来确定鼠标是否仍在控件的范围内。

private void panel1_MouseLeave(object sender, EventArgs e)
{
    Rectangle screenBounds = new Rectangle(this.PointToScreen(panel1.Location), panel1.Size);
    if (!screenBounds.Contains(MousePosition))
    {
        panel1.BackColor = Color.Gray;
    }
}

为包含的控件添加事件意味着当您想要向面板添加另一个控件时,您也必须执行相同的练习。

为父控件添加事件意味着只要您想在其他位置使用面板,就必须为新父控件执行相同的操作。 当面板的要求发生变化时,您必须记住将处理从父控件的事件中取出。

所有这些都可能更加混乱。

我倾向于在面板的鼠标离开事件中进行一些坐标检查,并且只有在鼠标真的超出面板边界时才重置面板颜色。

这样,您的面板处理代码仅保留在相关面板上。

我找到了一个简单的解决方 我只是在标签上将enabled属性设置为false,这很好。

您可以为标签添加MouseEnter事件,该事件也设置Panel的背面颜色。 您不需要标签的MouseLeave事件。

要么:

  1. 为Panel设置MouseEnter事件以设置Panel的背景颜色。
  2. 设置Panel的父控件(例如Form)MouseEnter事件以重置Panel的背面颜色。

如果您想在不触及父控件代码的情况下执行上述第2点(根据其他用户的注释),您可以在Panel的ParentChanged事件中执行以下操作:

    private void panel1_ParentChanged(object sender, EventArgs e)
    {
        Panel thisPanel = sender as Panel;

        if(thisPanel != null && thisPanel.Parent != null)
        {
            thisPanel.Parent.MouseEnter += delegate(object senderObj, EventArgs eArgs) { thisPanel.BackColor = SystemColors.Control; };
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM