在网上看了许多人问怎么样实现在WINDOWS托盘程序中,当点击最小化时将窗体隐藏在任务栏中,而点击托盘栏中的程序托盘时又会显示出窗体的正常状态的功能。许多人的思路是找到最小化时触发的事件或者是程序最小化时执行的方法,可是怎么也找不到。其实实现这种功能很简单,只不过许多人的思路一直停留在找到最小化的方法体上了,以为只要在此方法体中再加上一些语句就可以实现,可是怎么也找不到,于是就卡在这里了。其实实现这种功能很简单,可以通过以下方法实现:
1.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标。
2.添加窗体最小化事件(在这里实现隐藏任务栏图标,有两种方法):
方法一:
// this.SizeChanged += new System.EventHandler(this.Form1_SizeChanged);
//上面一行是主窗体InitializeComponent()方法中需要添加的引用
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState==FormWindowState.Minimized)
{
this.Hide();或者是this.Visible = false;
this.notifyIcon1.Visible=true;
}
}
方法二:
this.Resize += new System.EventHandler(this.Form1_Resize);
//上面一行是主窗体InitializeComponent()方法中需要添加的引用
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
this.Visible = false;
}
3.添加点击图标事件(实现点击左键显示主窗体正常状态):
private void notifyIcon1_Click(object sender, EventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
}
4.可以给notifyIcon添加右键菜单:
主窗体中拖入一个ContextMenu控件contextMenu1,点中控件,在上下文菜单中添加菜单,notifyIcon1的ContextMenu行为中选中contextMenu1作为上下文菜单。(可以在子菜单中添加行为)……
在这里主要谈谈在第二步中的两种方法。
这里使用的是两种最常规,也是最常用的办法。第一种的SizeChanged()事件,其本意是当控件上的Size属性更改时引发的事件。而第二种方法Resize()事件,是在调整控件大小时引发的事件。可在这里为什么都可以实现同样的功能?可以做一下实验看看两个事件到底是什么时候发生的。
private void Form1_SizeChanged(object sender, EventArgs e)
{
MessageBox.Show("sizechange即将发生");
if (this.WindowState == FormWindowState.Minimized)
this.Visible = true;
}
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
this.Visible = false;
MessageBox.Show("resize发生了");
}
private void notifyIcon1_Click(object sender, EventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
}
将这些代码都加在同一个程序中,编译执行可以看到。当我们手工的扩大或缩小我们的窗体大小时,会弹出消息框"resize发生了",接着就会弹出消息框"sizechange即将发生"。从这个小例子可以看出这两个事件其实是大同小异的,只不过Resize先执行而SizeChanged后执行罢了。从这两个事件的MSDN解释上我们也不难看出,当我们改变控件大小,这时候必先触发Resize()(在调整控件大小时引发的事件),而我们改变了大小也必然会导致Size属性的改变,这时又会触发SizeChanged事件。这个先后道理我想不难理解。所以说这两个事件是乎有着某种必然的联系!
最小化(最大化)其实和我们手工改变窗体的大小是一个道理。而之所以能用两种方法得到相同的效果的道理也正是如以上所述,当然就可以达到异曲同工之妙!
1.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标。
2.添加窗体最小化事件(在这里实现隐藏任务栏图标,有两种方法):
方法一:
// this.SizeChanged += new System.EventHandler(this.Form1_SizeChanged);
//上面一行是主窗体InitializeComponent()方法中需要添加的引用
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState==FormWindowState.Minimized)
{
this.Hide();或者是this.Visible = false;
this.notifyIcon1.Visible=true;
}
}
方法二:
this.Resize += new System.EventHandler(this.Form1_Resize);
//上面一行是主窗体InitializeComponent()方法中需要添加的引用
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
this.Visible = false;
}
3.添加点击图标事件(实现点击左键显示主窗体正常状态):
private void notifyIcon1_Click(object sender, EventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
}
4.可以给notifyIcon添加右键菜单:
主窗体中拖入一个ContextMenu控件contextMenu1,点中控件,在上下文菜单中添加菜单,notifyIcon1的ContextMenu行为中选中contextMenu1作为上下文菜单。(可以在子菜单中添加行为)……
在这里主要谈谈在第二步中的两种方法。
这里使用的是两种最常规,也是最常用的办法。第一种的SizeChanged()事件,其本意是当控件上的Size属性更改时引发的事件。而第二种方法Resize()事件,是在调整控件大小时引发的事件。可在这里为什么都可以实现同样的功能?可以做一下实验看看两个事件到底是什么时候发生的。
private void Form1_SizeChanged(object sender, EventArgs e)
{
MessageBox.Show("sizechange即将发生");
if (this.WindowState == FormWindowState.Minimized)
this.Visible = true;
}
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
this.Visible = false;
MessageBox.Show("resize发生了");
}
private void notifyIcon1_Click(object sender, EventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
}
将这些代码都加在同一个程序中,编译执行可以看到。当我们手工的扩大或缩小我们的窗体大小时,会弹出消息框"resize发生了",接着就会弹出消息框"sizechange即将发生"。从这个小例子可以看出这两个事件其实是大同小异的,只不过Resize先执行而SizeChanged后执行罢了。从这两个事件的MSDN解释上我们也不难看出,当我们改变控件大小,这时候必先触发Resize()(在调整控件大小时引发的事件),而我们改变了大小也必然会导致Size属性的改变,这时又会触发SizeChanged事件。这个先后道理我想不难理解。所以说这两个事件是乎有着某种必然的联系!
最小化(最大化)其实和我们手工改变窗体的大小是一个道理。而之所以能用两种方法得到相同的效果的道理也正是如以上所述,当然就可以达到异曲同工之妙!