2009-10-18 93 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