我有一个要求我的表格是透明的,如果我的鼠标进入表格
应该变得可见,如果我的鼠标离开表单它变得透明,我在表单中放置了三个不同的控件,每个控件鼠标离开和鼠标进入与表单相同。如果我的鼠标进入表单并进入控件
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)无效 OnMouseEntered(对象发送者,EventArgs e)
{
TransToOpac();
}
私有(private)无效 OnMouseLeft(对象发送者,EventArgs e)
{
OpacToTrans();
}
最佳答案
您无法使用 MouseEnter/Leave 事件完成此操作。较小的问题是如果控件靠近边缘,窗体的 Leave 事件可能永远不会触发。更大的问题是当光标移动到非客户区域(边框、标题)时它会触发,当用户尝试关闭或调整窗口大小时,您不希望淡化表单。
粗略但有效的解决方案是使用计时器来检查鼠标的位置:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
this.Opacity = 0.99; // Avoid flicker
mFadeTimer.Interval = 15;
mFadeTimer.Tick += new EventHandler(mFadeTimer_Tick);
mMouseTimer.Interval = 200;
mMouseTimer.Tick += new EventHandler(mMouseTimer_Tick);
mMouseTimer.Enabled = true;
}
void mMouseTimer_Tick(object sender, EventArgs e) {
if (this.Bounds.Contains(Control.MousePosition)) {
if (mFade <= 0) { mFade = 1; mFadeTimer.Enabled = true; }
}
else {
if (mFade >= 0) { mFade = -1; mFadeTimer.Enabled = true; }
}
}
void mFadeTimer_Tick(object sender, EventArgs e) {
double opaq = this.Opacity + mFade * 0.05;
if (opaq >= 0.99) { opaq = 0.99; mFadeTimer.Enabled = false; }
if (opaq <= 0.15) { opaq = 0.15; mFadeTimer.Enabled = false; }
this.Opacity = opaq;
}
private Timer mFadeTimer = new Timer();
private Timer mMouseTimer = new Timer();
private int mFade = 0;
}
关于c# - 淡入淡出表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2927955/