博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何将Winform窗体最小化的时候将其显示到系统拖盘

Posted on 2011-07-19 23:09  itcfj  阅读(277)  评论(0编辑  收藏  举报

如何将Winform窗体最小化的时候将其显示到系统拖盘

- 王大海 2009-03-02 05:51

RT

- 环零殇 2009-03-02 05:51

抄来的:

先将窗体的Text属性设置为 "动画系统图标示例 ",MaximiseBox、MinimiseBox、ShowInTaskbar属性均设置为False。  
  
  再往窗体上添加NotifyIcon控件、ContextMenu控件各一个。  
  
  将NotifyIcon控件的Icon属性设置为一个图标文件,Name属性设置为“m_trayIcon”;ContextMenu属性设置为 "contextMenu1 ";接下来开始编辑ContextMenu控件

现在我们开始编写代码部分:
private   bool   m_bFlag;
private   bool   m_bShowWnd;  
修改Form1()函数为:  
  
  public   Form1()
  {
  //
  //   Required   for   Windows   Form   Designer   support
  //
  InitializeComponent();
  //
  //   TODO:   Add   any   constructor   code   after   InitializeComponent   call
  //
  m_bFlag=true;
  m_bShowWnd=true;
       }

       private   void   menuItem1_Click(object   sender,   System.EventArgs   e)
  {
  Application.Exit();//退出应用程序
  }

       private   void   m_trayIcon_Click(object   sender,   System.EventArgs   e)
  {
  if(m_bShowWnd   ==   true)//隐藏主界面
  {
  this.Visible   =   false;
  m_bShowWnd   =   false;
  }
  else//显示主界面
  {
  this.Visible   =   true;
  m_bShowWnd   =   true;
  }
  }

- 布泽 2009-03-02 05:51

从我收藏的资料里找到的


用Visual   C#做托盘程序


      所谓托盘程序顾名思义就是象托起的盘子一样的程序。而所谓的托起的盘子就是程序运行中显示出的图标,而托起的位置就是视窗系统的的工具栏了。托盘程序具有 直观、占用屏幕空间较小并且可以为它定义多个功能菜单,这就给操作者带来了方便,所以越来越多的程序设计者都把程序设计成托盘这种方式。我们已经看过了用 其他语言设计托盘程序的例子,其中的大部分,整个设计过程还是相对烦琐的。而对于微软公司极力推荐的下一代程序开发语言--Visual   C#来说,却可以十分方便设计出一个托盘程序。本文就是介绍Visual   C#设计托盘程序的具体过程。

     首先来介绍一下本文中设计托盘程序所需要的环境:

     (1).微软公司视窗2000服务器版

     (2)..Net   FrameWork   SDK   Beta   2

     一.   托盘程序的主要步骤及解决方法:

      为什么说用Visual   C#可以十分方便的做一个托盘程序,主要的原因是在.Net框架的软件开发包(   .Net   FrameWork   SDK   )中的WinForm组件中定义了一个专门用来开发托盘程序的组件--NotifyIcon组件。下面就来介绍一下这个组件的具体用法和程序设计中的主要 的技巧。

     (1).如何在程序运行后隐藏窗体:

     我们知道托盘程序运行后是无法看见主窗体的,他只会显示在工具栏上。在用Visual   C#设计此类程序的时候,可以用二种方法使得程序运行后不显示主窗体。其中一种方法是重载主窗体中的OnActivated(   )事件,OnActivated(   )事件是在窗体激活的时候才触发的。通过重载此事件可以达到隐藏主窗体的目的。具体程序代码如下:
 
protected   override   void   OnActivated   (   EventArgs   e   )
{
this.Hide   (   )   ;
}    

     另外一种方法是在初始化主窗体的时候完成的,通过设定主窗体的属性来达到不显示的目的。具体的程序代码如下:
 
this.MaximizeBox   =   false   ;
this.MinimizeBox   =   false   ;
this.WindowState   =   System.Windows.Forms.FormWindowState.Minimized   ;    

     在本文介绍的程序中,使用了第二种方法。
     (2).如何为托盘程序设定显示图标:

      在NotifyIcon组件中有一个属性icon就是来设定托盘图标的,由于Visual   C#是一个完全的OOP   (面向对象)语言,在Visual   C#中任何东西都可以作为对象来处理。当然对应一个icon来说,也可以用对象的方法来处理他。我们通过下列语句来得到一个icon对象:
 
private   Icon   mNetTrayIcon   =   new   Icon   (   "Tray.ico "   )   ;    

     请注意:在编译好的程序中,必须要在同一个目录中有一个Tray.ico图标文件,否则程序运行时候会出错的。

     通过下列语句把此icon对象付给NotifyIcon组件中的icon属性,此时如果程序正确编译,则此icon就会显示在工具栏中了。
 
TrayIcon.Icon   =   mNetTrayIcon   ;    

     (3).设定当鼠标停留在托盘程序上显示的文本内容:

     NotifyIcon组件中有一个属性Text。设定这个属性的内容,就是鼠标停留在托盘图标上显示的内容了。具体语句如下:
 
TrayIcon.Text   =   "用Visual   C#做托盘程序 "   +   "\n "   +   "作者:马金虎于2001.12.08 "   ;    

     (4).如何在托盘程序加入菜单:

     在NotifyIcon组件中有一个对象叫ContextMenu,在托盘程序中显示出的菜单就是通过设定此对象来实现的。以下的程序代码是为托盘程序加入菜单项:
 
notifyiconMnu   =   new   ContextMenu   (   mnuItms   )   ;
TrayIcon.ContextMenu   =   notifyiconMnu   ;
//为托盘程序设定菜单    

     (5).如何设定ContextMenu对象的内容:

      ContextMenu对象是托盘程序的菜单的结构,所以如何设定此对象,在本程序中是比较关键的。在程序中,是通过定义一个菜单项数组,并对这个数组设 定不同的值(这当中包括菜单的一些属性和事件),然后把这个数组同时赋值给ContextMenu对象,来实现对ContextMenu对象的设置过程 的。以下是程序中具体代码:
 
//定义一个MenuItem数组,并把此数组同时赋值给ContextMenu对象
MenuItem   [   ]   mnuItms   =   new   MenuItem   [   3   ]   ;
mnuItms   [   0   ]   =   new   MenuItem   (   )   ;
mnuItms   [   0   ]   .Text   =   "用Visual   C#做托盘程序! "   ;
mnuItms   [   0   ]   .Click   +=   new   System.EventHandler   (   this.showmessage   )   ;

mnuItms   [   1   ]   =   new   MenuItem   (   "- "   )   ;
mnuItms   [   2   ]   =   new   MenuItem   (   )   ;
mnuItms   [   2   ]   .Text   =   "退出系统 "   ;
mnuItms   [   2   ]   .Click   +=   new   System.EventHandler   (   this.ExitSelect   )   ;
mnuItms   [   2   ]   .DefaultItem   =   true   ;

notifyiconMnu   =   new   ContextMenu   (   mnuItms   )   ;
TrayIcon.ContextMenu   =   notifyiconMnu   ;
//为托盘程序加入设定好的ContextMenu对象    

     当成功加入了ContextMenu对象后,在程序编译完成运行时,当鼠标右键点击托盘图标,程序会自动弹出ContextMenu对象封装好的菜单。
     二.   本文介绍的程序源代码(   Tray.cs   )和编译后程序运行界面:

下图时Tray.cs成功编译后的运行界面:
 
|
     图01:程序运行界面    

     Tray.cs源程序代码:
 
using   System   ;
using   System.Drawing   ;
using   System.Collections   ;
using   System.ComponentModel   ;
using   System.Windows.Forms   ;
using   System.Data   ;
//导入在程序中使用到的名称空间
public   class   Tray   :   Form
{
    private   System.ComponentModel.Container   components   =   null   ;
    private   Icon   mNetTrayIcon   =   new   Icon   (   "Tray.ico "   )   ;
    private   NotifyIcon   TrayIcon   ;
    private   ContextMenu   notifyiconMnu   ;

    public   Tray()
    {
     //初始化窗体中使用到的组件
     InitializeComponent   (   )   ;
     //初始化托盘程序的各个要素
     Initializenotifyicon   (   )   ;
    }

private   void   Initializenotifyicon   (   )
{
    //设定托盘程序的各个属性
    TrayIcon   =   new   NotifyIcon   (   )   ;
    TrayIcon.Icon   =   mNetTrayIcon   ;
    TrayIcon.Text   =   "用Visual   C#做托盘程序 "   +   "\n "   +   "作者:马金虎于2001.12.08 "   ;
    TrayIcon.Visible   =   true   ;
    TrayIcon.Click   +=   new   System.EventHandler   (   this.click   )   ;

    //定义一个MenuItem数组,并把此数组同时赋值给ContextMenu对象
    MenuItem   [   ]   mnuItms   =   new   MenuItem   [   3   ]   ;
    mnuItms   [   0   ]   =   new   MenuItem   (   )   ;
    mnuItms   [   0   ]   .Text   =   "用Visual   C#做托盘程序! "   ;
    mnuItms   [   0   ]   .Click   +=   new   System.EventHandler   (   this.showmessage   )   ;

    mnuItms   [   1   ]   =   new   MenuItem   (   "- "   )   ;

    mnuItms   [   2   ]   =   new   MenuItem   (   )   ;
    mnuItms   [   2   ]   .Text   =   "退出系统 "   ;
    mnuItms   [   2   ]   .Click   +=   new   System.EventHandler   (   this.ExitSelect   )   ;
    mnuItms   [   2   ]   .DefaultItem   =   true   ;

    notifyiconMnu   =   new   ContextMenu   (   mnuItms   )   ;
    TrayIcon.ContextMenu   =   notifyiconMnu   ;
    //为托盘程序加入设定好的ContextMenu对象
}
public   void   click   (   object   sender   ,   System.EventArgs   e   )
{
    MessageBox.Show   (   "Visual   C#编写托盘程序中的事件响应 "   )   ;
}

public   void   showmessage   (   object   sender   ,   System.EventArgs   e   )
{
    MessageBox.Show   (   "你点击了菜单的第一个选项 "   )   ;
}

public   void   ExitSelect   (   object   sender   ,   System.EventArgs   e   )
{
    //隐藏托盘程序中的图标
    TrayIcon.Visible   =   false   ;
    //关闭系统
    this.Close   (   )   ;
}
//清除程序中使用过的资源
public   override   void   Dispose   (   )
{
    base.Dispose   (   )   ;
    if   (   components   !=   null   )
     components.Dispose   (   )   ;
}

private   void   InitializeComponent   (   )
{
    this.SuspendLayout   (   )   ;
    this.AutoScaleBaseSize   =   new   System.Drawing.Size   (   5   ,   13   )   ;
    this.ClientSize   =   new   System.Drawing.Size   (   320   ,   56   )   ;
    this.ControlBox   =   false   ;
    this.MaximizeBox   =   false   ;
    this.MinimizeBox   =   false   ;
    this.WindowState   =   System.Windows.Forms.FormWindowState.Minimized   ;

    this.Name   =   "tray "   ;
    this.ShowInTaskbar   =   false   ;
    this.Text   =   "用Visual   C#做托盘程序! "   ;
    this.ResumeLayout   (   false   )   ;

}
static   void   Main   (   )
{
    Application.Run   (   new   Tray   (   )   )   ;
}
}    

     三.   总结:

      通过以上介绍,可以看出用Visual   C#做一个托盘程序并不是一件复杂的事情,而是一件比较轻松的事情。同样也可使我们明白,Visual   C#虽然是一种功能强大的程序设计语言,但它只是一个打开.Net   FrameWork   SDK的钥匙,正是这个内容丰富的软件包,才使得各个.Net程序开发语言有了施展自身功能更广阔的舞台

- 王大海 2009-03-02 05:51

先拖一个NotifyIcon控件到窗体上,给这个控件设置一个ICON图片。
然后在事件里写上以下代码:
         private   void   notifyIcon1_MouseDoubleClick(object   sender,   MouseEventArgs   e)
               {
//双击控件事件,就显示窗体到任务栏,让窗体的尺寸成普通模式,使窗体获得焦点。
                       this.ShowInTaskbar   =   true;
                       this.WindowState   =   FormWindowState.Normal;
                       this.Activate();
                       
               }

               private   void   Form1_SizeChanged(object   sender,   EventArgs   e)
               {
//窗体尺寸变体事件中,如何窗体是最小化状态就让窗体不显示在任务栏上
                       if   (this.WindowState   ==   FormWindowState.Minimized)
                       {
                               this.ShowInTaskbar   =   false;
                       }
                     

               }

- 笑眯眯 2009-03-02 05:51

恩,解决了,谢谢大家
然后在窗体的Resize里判断是否最小化,是的话隐藏掉就可以了   ^_^

- 雅宝贝 2009-03-02 05:51

我想lengzi(Lengzi)   的是正解,   我也有同样的问题.   我开始想寻找minimizebox点击的消息,   以建立消息响应函数,   看来lengzi(Lengzi)   的方法应该可以.

页码: 1