處理程序退出

  郵箱太多,用起來難免混亂。市面的郵箱軟件功能太強大,需要配POP什麼的,很麻煩。於是自己突發奇想,自作一個郵箱管理,可是在做管理窗口的時候出現了問題。管理窗口並非ShowDialog,那麼也就不能在方法的結束Dispose掉這個窗體。只能等待用戶關閉,但是如果用戶沒有關閉,再次調用顯示方法時,就會又顯示一個管理窗口。但是這是不願出現。

  現在通過窗體Visable來僞關閉,並將Closing事件的e.Cancel置爲true,阻止窗口關閉。在顯示方法中判斷是否存在窗體,窗體存在就SHOW,存在但Visable爲false的則控制Visable爲true,並激活到前臺。

  但是,在整個程序將退出時出了問題.

  因爲,Application.Exit()將停止消息泵,並通知各窗體Close。因此,Exit方法會觸發Closing事件,那麼此時,管理窗口的關閉將永遠被阻止。導致父窗體也不關閉。於是在管理窗體的FormClosing事件中處理

  1. private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
  2.   e.Cancel = !(this.visable = WillClose); 

  通過控制窗體全局變量WillClose來控制是否真正關閉。並新增關閉方法

  1. public void EnClose() 
  2.   WillClose = true
  3.   this.Close(); 

  供外部調用,以真正關閉窗體。

  Application.Exit()會通知各窗體關閉,但關閉會被阻止,也就說這個方法是不強制關閉窗體的。那麼爲了保證能完全關閉所有窗體,同時停止消息泵。那麼將退出按鈕寫爲

  1. private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) 
  2.  { 
  3.   this.Close(); 
  4.  } 

  在Closing事件中再Application.Exit()。但是Exit通知各窗體Close,是會觸發Closing事件的,那麼會再次執行事件的處理方法. 這也是部分人爲什麼在關閉時詢問是否關閉程序時,詢問兩遍的原因。

 因此應該在Closed事件處理Application.Exit(). 最終

  1. private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
  2.     ManageForm.EnClose(); 
  3.  
  4. private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
  5.     Application.Exit(); 

注:WillClose爲私有,且默認爲false;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章