CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

求一个能实现最小化到任务栏的源码!

楼主silentspring(Crush_Japan)2006-03-09 17:18:11 在 VC/MFC / 界面 提问

找一个能最小化到任务栏的MFC源码,最好能加右键菜单的那种. 问题点数:20、回复次数:6Top

1 楼rockersz(世上的无奈需要我去忍耐...)回复于 2006-03-09 17:21:26 得分 3

是不是就是托盘程序,www.vckbase.com上找吧,大把Top

2 楼lzzqqq(Jonersen)回复于 2006-03-09 17:25:11 得分 3

//   TrayNotifyIcon.cpp:   implementation   of   the   CTrayNotifyIcon   class.  
  //  
  //////////////////////////////////////////////////////////////////////  
   
  #include   "stdafx.h"  
  #include   "TrayNotifyIcon.h"  
   
  #ifdef   _DEBUG  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]=__FILE__;  
  #define   new   DEBUG_NEW  
  #endif  
   
  //////////////////////////////////////////////////////////////////////  
  //   Construction/Destruction  
  //////////////////////////////////////////////////////////////////////  
   
  CTrayNotifyIcon::CTrayNotifyIcon()  
  {  
      memset(&m_NotifyIconData,   0,   sizeof(m_NotifyIconData));  
      m_bCreated   =   FALSE;  
      m_pWnd   =   NULL;  
  }  
   
  CTrayNotifyIcon::~CTrayNotifyIcon()  
  {  
        RemoveIcon();  
  }  
   
  BOOL   CTrayNotifyIcon::Create(CWnd   *pNotifyWnd,   UINT   uID,   LPCTSTR   pszTooltipText,   HICON   hIcon,   UINT   nNotifyMessage)  
  {  
      //Make   sure   Notification   window   is   valid  
      ASSERT(pNotifyWnd   &&   ::IsWindow(pNotifyWnd->GetSafeHwnd()));  
      m_pWnd   =   pNotifyWnd;  
   
      //Make   sure   we   avoid   conflict   with   other   messages  
      ASSERT(nNotifyMessage   >=   WM_USER);  
   
      //Tray   only   supports   tooltip   text   up   to   64   characters  
      ASSERT(_tcslen(pszTooltipText)   <=   64);  
   
      m_NotifyIconData.cbSize   =   sizeof(m_NotifyIconData);  
      m_NotifyIconData.hWnd   =   pNotifyWnd->GetSafeHwnd();  
      m_NotifyIconData.uID   =   uID;  
      m_NotifyIconData.uFlags   =   NIF_ICON   |   NIF_MESSAGE   |   NIF_TIP;  
      m_NotifyIconData.uCallbackMessage   =   nNotifyMessage;  
      m_NotifyIconData.hIcon   =   hIcon;  
      _tcscpy(m_NotifyIconData.szTip,   pszTooltipText);  
   
      BOOL   rVal   =   Shell_NotifyIcon(NIM_ADD,   &m_NotifyIconData);  
      m_bCreated   =   rVal;  
   
      return   rVal;  
  }  
   
  void   CTrayNotifyIcon::RemoveIcon()  
  {  
      if   (m_bCreated)  
      {  
          m_NotifyIconData.uFlags   =   0;  
          Shell_NotifyIcon(NIM_DELETE,   &m_NotifyIconData);  
          m_bCreated   =   FALSE;  
      }  
  }  
   
  LRESULT   CTrayNotifyIcon::OnTrayNotification(WPARAM   wID,   LPARAM   lEvent)  
  {  
      CMenu   menu;  
      if   (!menu.LoadMenu(m_NotifyIconData.uID))  
          return   0;  
   
      CMenu*   pSubMenu   =   menu.GetSubMenu(0);  
      if   (!pSubMenu)    
          return   0;  
   
      //  
      if   (lEvent   ==   WM_RBUTTONUP)  
      {  
          //Clicking   with   right   button   brings   up   a   context   menu  
   
          //   Make   first   menu   item   the   default   (bold   font)  
          ::SetMenuDefaultItem(pSubMenu->m_hMenu,   0,   TRUE);  
   
          //Display   and   track   the   popup   menu  
          CPoint   pos;  
          GetCursorPos(&pos);  
          ::SetForegroundWindow(m_NotifyIconData.hWnd);      
          ::TrackPopupMenu(pSubMenu->m_hMenu,   0,   pos.x,   pos.y,   0,   m_NotifyIconData.hWnd,   NULL);  
      }    
      /*else   if   (lEvent   ==   WM_LBUTTONDBLCLK)    
      {  
          //   double   click   received,   the   default   action   is   to   execute   first   menu   item  
          ::PostMessage(m_NotifyIconData.hWnd,   WM_COMMAND,   pSubMenu->GetMenuItemID(0),   0);  
      }  
      */  
      return   1;  
  }  
   
  BOOL   CTrayNotifyIcon::ChangeIcon(HICON   hIcon)  
  {  
  m_NotifyIconData.hIcon   =   hIcon;  
  BOOL   rVal   =   Shell_NotifyIcon(NIM_MODIFY   ,   &m_NotifyIconData);  
  return   rVal;  
  }  
   
  BOOL   CTrayNotifyIcon::ChangeIcon(UINT   uIcon)  
  {  
  m_NotifyIconData.hIcon   =   LoadIcon(::AfxGetInstanceHandle(),MAKEINTRESOURCE(uIcon));  
  BOOL   rVal   =   Shell_NotifyIcon(NIM_MODIFY   ,   &m_NotifyIconData);  
  return   rVal;  
  }  
  Top

3 楼lzzqqq(Jonersen)回复于 2006-03-09 17:26:28 得分 3

然后在主窗口的OnCreate里面  
  //Tray   notification   icon.  
  if   (!m_TrayNotifyIcon.Create(this,IDM_TRAY,IDS_MAINFRAME,m_hIconTray,WM_MY_NOTIFY))    
  return   FALSE;Top

4 楼lzzqqq(Jonersen)回复于 2006-03-09 17:27:23 得分 3

然后在主窗口里映射消息   ON_MESSAGE(WM_MY_NOTIFY,OnTrayNotify)  
   
  LRESULT   CGGDlg::OnTrayNotify(WPARAM   wp,LPARAM   lp)  
  {  
  if   (lp   ==   WM_LBUTTONDBLCLK) //Left   button   double   click.  
  {  
  if   (m_lstMsg.IsEmpty())  
  {  
  m_bShow?SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0):ShowMainWindow(TRUE);  
  }  
  else  
  {  
  CDlgMsg*   pDlg=(CDlgMsg*)m_lstMsg.RemoveHead();  
  //::SetWindowPos(pDlg->m_hWnd,HWND_TOP,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);  
  pDlg->ShowWindow(SW_SHOW);  
  }  
  }  
  else //Other   notifycation   ,ignore.  
  m_TrayNotifyIcon.OnTrayNotification(wp,lp);  
   
  return   1;  
  }Top

5 楼ermu114(灿烂)回复于 2006-03-10 10:50:48 得分 0

upTop

6 楼LongLongAgoImBoy(ThereIsAMe)回复于 2006-03-10 10:52:53 得分 8

用VC设计托盘图标程序  
   
  中国矿业大学    
  宋端智  
     
   
  ----   Windows95/98/NT/2000中,任务栏的右边(托盘)常驻几个图标,如输入法切换图标、音量控制图标等,此外我们还经常遇到拥有托盘图标的软件,如金山词霸、有实时监测功能的杀毒软件等。这些软件在后台运行,通常不占用太多的屏幕资源,只在通知栏上放一个小小的标志。必要时我们可以通过用鼠标点击图标对其进行菜单操作或激活其主窗口。有时我们自己编写的程序也希望有类似的效果,本文详细地介绍用VC设计这种托盘图标程序的方法。    
   
  ----   一、NOTIFYICONDATA结构    
   
  ----   NOTIFYICONDATA结构包含了系统用来处理托盘图标的信息,它包括选择的图标、回调消息、提示消息、图标对应的窗口等内容。其定义为:    
   
          typedef   struct   _NOTIFYICONDATA   {    
                  DWORD   cbSize;                    
  //以字节为单位的这个结构的大小  
                  HWND   hWnd;          
  //接收托盘图标通知消息的窗口句柄  
                  UINT   uID;   //应用程序定义的该图标的ID号  
                  UINT   uFlags;                      
  //设置该图标的属性  
                  UINT   uCallbackMessage;        
  //应用程序定义的消息ID号,此消息传递给hWnd  
                  HICON   hIcon;                          
  //图标的句柄  
              char   szTip[64];                      
      //鼠标停留在图标上显示的提示信息  
          }   NOTIFYICONDATA,   *PNOTIFYICONDATA;  
  该结构中,成员uFlags可以使下列之一或组合:  
          NIF_ICON                 设置成员hIcon有效  
          NIF_MESSAGE         设置成员uCallbackMessage有效  
          NIF_TIP                       设置成员szTip有效  
   
  ----   二、Shell_NotifyIcon函数    
  ----   全局函数Shell_NotifyIcon()   用于在托盘上增加、删除或修改图标。其原型为:    
   
                        WINSHELLAPI     BOOL     WINAPI    
        Shell_NotifyIcon(   DWORD   dwMessage,    
                  PNOTIFYICONDATA   pnid);  
   
  ----   Pnid是上面的NOTIFYICONDATA结构的指针;   dwMessage是被传递的消息,可以是以下消息之一:    
                              NIM_ADD                           增加图标  
                              NIM_DELETE                     删除图标  
                              NIM_MODIFY                     修改图标  
   
  ----   三、托盘图标程序设计示例    
  ----   首先我们用AppWizard创建一个不基于文档/视图结构的应用程序Tray。我们并不想在应用程序启动时显示主窗口,所以删除应用程序类CTrayApp中InitInstance()函数中的以下两句使主窗口显示的代码:    
   
  pFrame->ActivateFrame();  
  pFrame->ShowWindow(SW_SHOW);  
                    在CMainFrame类中加入NOTIFYICONDATA结构的保护成员变量  
    m_tnid,并在其OnCreate函数中return  
    语句前加入生成托盘图标的代码:  
   
  m_tnid.cbSize=sizeof(NOTIFYICONDATA);  
  m_tnid.hWnd=this->m_hWnd;  
  m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;  
  m_tnid.uCallbackMessage=MYWM_NOTIFYICON;      
  //用户定义的回调消息  
  CString   szToolTip;  
  szToolTip=_T("托盘图标实例");  
                                        _tcscpy(m_tnid.szTip,   szToolTip);  
  m_tnid.uID=IDR_MAINFRAME;  
  HICON   hIcon;  
  hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);  
  m_tnid.hIcon=hIcon;  
  ::Shell_NotifyIcon(NIM_ADD,&m_tnid);  
  if(hIcon)::DestroyIcon(hIcon);  
   
  ----   回调消息的ID应在主框架类的头函数中定义:    
    #define     MYWM_NOTIFYICON     WM_USER+1  
   
  ----   为了处理图标回调消息,如鼠标左键双击、鼠标右键单击消息,我们重载WindowProc()函数。此外,我们还希望在主框架窗口最小化时图标不在任务栏的空白区出现,在此函数中同时作相应处理。    
                      LRESULT   CMainFrame::WindowProc  
      (UINT   message,   WPARAM   wParam,   LPARAM                  
      lParam)    
                    {  
  switch(message){  
   
  case   MYWM_NOTIFYICON:                
  //如果是用户定义的消息  
  if(lParam==WM_LBUTTONDBLCLK)  
  {     //鼠标双击时主窗口出现  
  AfxGetApp()->m_pMainWnd->  
  ShowWindow(SW_SHOW);  
  }  
  else   if(lParam==WM_RBUTTONDOWN){    
  //鼠标右键单击弹出菜单  
          CMenu   menu;  
   
          menu.LoadMenu(IDR_RIGHT_MENU);    
  //载入事先定义的菜单  
          CMenu*   pMenu=menu.GetSubMenu(0);  
          CPoint   pos;  
          GetCursorPos(&pos);  
                                                    pMenu->TrackPopupMenu  
        (TPM_LEFTALIGN|TPM_RIGHTBUTTON,  
  pos.x,pos.y,AfxGetMainWnd());  
  }  
  break;  
  case   WM_SYSCOMMAND:            
  //如果是系统消息  
  if(wParam==SC_MINIMIZE){    
  //接收到最小化消息时主窗口隐藏  
              AfxGetApp()->m_pMainWnd->  
      ShowWindow(SW_HIDE);  
              return   0;  
  }  
  break;  
  }  
  return   CFrameWnd::WindowProc  
  (message,   wParam,   lParam);  
                    }  
   
  ----   为使应用程序退出时图标消失,映射WM_DESTROY消息,在OnDestroy()函数中加入:    
  ::Shell_NotifyIcon(NIM_DELETE,&m_tnid);  
   
  ----   至此,托盘图标程序的常规功能我们均已实现。我们还可以通过Shell_NotifyIcon()函数的调用实现不同状态下图标的改变,就象金山词霸在主窗口打开与暂停取词时图标有所改变一样。    
  ----   本程序在VC++6.0,Windows98/2000   Professional下调试通过。    
  Top

相关问题

  • 在线等:最小化窗口时到任务栏,如何编程实现
  • 求教一个在windows的任务栏生成小图标的源码,例如窗口最小化后就只有一个小图标在任务栏,感谢!
  • 最小化到任务栏托盘
  • 如何用DELPHI实现程序最小化时缩在任务栏右边,就像OICQ、金山词霸一样?
  • 请问:怎样实现象金山词霸那样,点最小化以后,缩到任务栏,然后消失?
  • 求救!!请问大侠们如何实现窗体最小化时,窗体图标隐藏在任务栏中?
  • 如何实现程序最小化后图标是出现在任务栏的右边--像音量图标
  • 最小化后,不在任务栏上,像QQ一样,怎么实现,大家一起聊!
  • 最小化后,不在任务栏上,像QQ一样,怎么实现,大家一起聊!
  • 最小化后,不在任务栏上,像QQ一样,怎么实现,大家一起聊!

关键词

  • 函数
  • 消息
  • 应用程序
  • 鼠标
  • 结构
  • 图标
  • notifyicondata
  • ctraynotifyicon
  • tnid
  • 托盘

得分解答快速导航

  • 帖主:silentspring
  • rockersz
  • lzzqqq
  • lzzqqq
  • lzzqqq
  • LongLongAgoImBoy

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo