我有一个要求,我的表格是透明的,如果我的鼠标进入它,表格应该变得可见,如果我的鼠标离开表格它变得透明,我有三个不同的控件放在我的表格,每个控制鼠标离开和鼠标输入与表单相同 . 如果我的鼠标进入窗体并进入控件form_mouseleaveevent并且control_mouseenterd被触发,那么我无法实现它,如何克服这个问题 .
下面是这段代码:
private void TransToOpac()
{
if (!isTransparent)
return;
if (TtoOON == false )
{
TtoOON = true;
for (i = this.Opacity; i <= 1; i = i + 0.02)
{
this.Opacity = i;
Thread.Sleep(50);
}
isTransparent = false;
TtoOON = false;
}
}
private void OpacToTrans()
{
if (isTransparent)
return;
if (OtoTON == false )
{
OtoTON = true;
for (i = this.Opacity; i >= 0.5; i = i - 0.02)
{
this.Opacity = i;
Thread.Sleep(50);
}
isTransparent = true;
OtoTON = false;
}
}
private void OnMouseEntered(object sender,EventArgs e){TransToOpac(); } private void OnMouseLeft(object sender,EventArgs e){OpacToTrans(); }
2 回答
您无法使用MouseEnter / Leave事件完成此操作 . 较小的问题是,如果控件靠近边缘,则表单的Leave事件可能永远不会触发 . 更大的问题是,当光标移动到非客户区域(边框, Headers )时会触发,当用户尝试关闭或调整窗口大小时,您不希望淡化窗体 .
原始但有效的解决方案是使用计时器来检查鼠标的位置:
您还可以检查
Form_MouseLeave
鼠标指针是否仍在表单的边界内,在这种情况下不会淡出 .EDIT
有几种方法可以确定鼠标是否仍在表单范围内 . 最简单的方法是使用
Mouse.GetPosition
方法查找当前鼠标位置 . 结果是鼠标指针在屏幕坐标中的位置 . 然后,您可以检查表单的边界矩形是否包含该位置 .