2009-10-18 82 views
1

有没有什么办法让窗体在被移动时变成半透明,然后在不再移动时变为不透明?我试过Form_Move事件,但没有运气。
我卡住了,有帮助吗?C# - 使窗体移动时半透明

+0

您在Form_Move事件改变了Form.Opacity房产吗? – gn22 2009-10-18 07:19:05

+0

是的,但程序第一次运行时,它是半透明的。 – user 2009-10-18 07:27:38

回答

4

表单加载为半透明的原因是因为表单必须移动到触发Move事件的起始位置。您可以通过确定是否设置不透明度来确定表单是否已完全加载。

后一种形式已完成移动,所以这样的事情应该工作的ResizeEnd事件触发:

bool canMove = false; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    canMove = true; 
} 

private void Form1_Move(object sender, EventArgs e) 
{ 
    if (canMove) 
    { 
     this.Opacity = 0.5; 
    } 
} 

private void Form1_ResizeEnd(object sender, EventArgs e) 
{ 
    this.Opacity = 1; 
} 
+0

好的!当用户完成移动表单时,我不知道ResizeEnd被触发。我注意到ResizeBegin在用户开始移动表单时触发,所以也许他可以使用这个而不是Form_Load/canMove/Form_Move技巧? – itowlson 2009-10-18 08:18:11

+0

非常感谢!太棒了!我会更多地尝试它。顺便说一句,爱你的头像鲍尔;)。 – user 2009-10-18 08:19:49

+0

使用Windows键将窗口移动到屏幕上某个Tile位置时,有人遇到问题吗? 例如,当我使用Windows + LeftKey时,表单保持不透明状态,直到我再次手动调整它的大小后,它才会重置为正常状态。 所以我做了什么来解决这个问题是采取@itowlson的建议,并使用Form1_ResizeBegin而不是Form1_Move。这似乎是诀窍。 – 2015-12-21 19:03:59

2

要做到这一点正确我希望你需要重写消息处理来响应标题栏被举行等,但你可以作弊,只是使用一个计时器,让你使它不透明的一个小而移动时,使连续动作作品:

[STAThread] 
static void Main() 
{ 
    using (Form form = new Form()) 
    using (Timer tmr = new Timer()) 
    { 
     tmr.Interval = 500; 
     bool first = true; 
     tmr.Tick += delegate 
     { 
      tmr.Stop(); 
      form.Opacity = 1; 
     }; 
     form.Move += delegate 
     { 
      if (first) { first = false; return; } 
      tmr.Stop(); 
      tmr.Start(); 
      form.Opacity = 0.3; 
     }; 
     Application.Run(form); 
    } 
} 

很明显,你可以调整这个以淡入/淡出,等等 - 这是只是为了显示整体概念。

+0

我收到一条错误消息,说“在应用程序中创建第一个IWin32Window对象之前,必须调用SetCompatibleTextRenderingDefault”。 – user 2009-10-18 07:43:21

+0

所以那样做......我没有得到那个错误,可能与文化有关。 – 2009-10-18 07:51:09

+0

好的,我把Application.SetCompatibleTextRenderingDefault(false);在一切之前,它运行。但表单移动时不透明。 – user 2009-10-18 07:54:46