邮箱太多,用起来难免混乱。市面的邮箱软件功能太强大,需要配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;