如何最小化托盘

一、托盘简介

所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。其实,托盘区的编程很简单,下面简要阐述一下子喽^_^

二、托盘编程相关函数

其实呢,把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。

绘制图标以及确定图标所传送消息的函数只有一个,那就是——————

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);

这个函数呢,负责向系统传递消息,以添加、修改或删除托盘区的图标。她的返回值呢,是个布尔类型的。就是说,如果返回0,那就是成仁啦,非0才成功。

参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。参数pnid就是具体的和程序在托盘区的图标有关系的结构了。它的定义如下:

typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;

下面就对该结构各个参数进行刨析:

cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。

HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。自然了,大多数情况下是this->m_hWnd喽。

uID : 在工程中定义的图标ID

uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述

hIcon : 要增加,删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。

uCallbackMessage : 这在对托盘区的操作中,是比较重要的数据成员。这是个消息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给Hwnd所代表的窗口。所以说,在uFlags中,一般都得标志它有效。这里一般都是自定义的消息。

szTip : 鼠标移动到托盘图标上时的提示文字。


三:程序实例

1、首先建立一个基于对话框的MFC程序;

2、在资源中的Icon中导入一个自己喜欢的图标,ID命名为IDR_MAINFRAME,将先前的IDR_MAINFRAME的图标删除掉;

3、在自己的Dialog头文件中定义一个变量  NOTIFYICONDATA m_nid,关于该结构体的具体信息可以查阅MSDN;

4、添加消息响应函数OnInitDialog(),并在该函数中添加以下代码,这样程序一启动,就在托盘中显示出了自己应用程序的图标。

    //---------------------------托盘显示---------------------------------//

    m_nid.cbSize  = (DWORD)sizeof(NOTIFYICONDATA);

    m_nid.hWnd    = this->m_hWnd;

    m_nid.uID     = IDR_MAINFRAME;

    m_nid.uFlags  = NIF_ICON | NIF_MESSAGE | NIF_TIP ;

    m_nid.uCallbackMessage = WM_SHOWTASK;             // 自定义的消息名称

    m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

    strcpy(m_nid.szTip, "服务器程序");                // 信息提示条为"服务器程序"

    Shell_NotifyIcon(NIM_ADD, &m_nid);                // 在托盘区添加图标

    这时候编译,会报WM_SHOWTASK的错,因为该消息要自己定义。

5、在Dialog头文件中声明消息和消息函数原型         

#define WM_SHOWTASK WM_USER+100                              

    LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);

6、在Dialog源文件中进行消息映射

    ON_MESSAGE(WM_SHOWTASK,OnShowTask)

7、在Dialog源文件中添加自定义的消息响应代码,左键双击弹出应用程序主窗口,右键单击弹出菜单。

    LRESULT CServerDlg::OnShowTask(WPARAM wParam, LPARAM lParam)

    {

           if(wParam != IDR_MAINFRAME)

                  return 1;

           switch(lParam)

           {

           case WM_RBUTTONUP:                                        // 右键起来时弹出菜单

                  {

                    

                         LPPOINT lpoint = new tagPOINT;

                         ::GetCursorPos(lpoint);                    // 得到鼠标位置

                         CMenu menu;

                         menu.CreatePopupMenu();                    // 声明一个弹出式菜单

                         menu.AppendMenu(MF_STRING, WM_DESTROY, "关闭");

                         menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this);

                         HMENU hmenu = menu.Detach();

                         menu.DestroyMenu();

                         delete lpoint;

                  }

                  break;

           case WM_LBUTTONDBLCLK:                                 // 双击左键的处理

                  {

                         this->ShowWindow(SW_SHOWNORMAL);         // 显示主窗口

                  }

                  break;

           }

           return 0;

    }

8、添加OnSize消息响应函数,处理最小化时的操作。

    void CServerDlg::OnSize(UINT nType, int cx, int cy)

    {

           CDialog::OnSize(nType, cx, cy);

           // TODO: Add your message handler code here

           if(nType == SIZE_MINIMIZED)  

           {  

                  ShowWindow(SW_HIDE); // 当最小化市,隐藏主窗口              

           }  

    }

9、添加关闭窗口时的消息响应函数,将托盘中的应用程序图标删除

    BOOL CServerDlg::DestroyWindow()

    {

           // TODO: Add your specialized code here and/or call the base class

           // 在托盘区删除图标

           Shell_NotifyIcon(NIM_DELETE, &m_nid);             

           return CDialog::DestroyWindow();

    }

    经过以上的步骤,就编写出了一个简单的可以最小化到托盘的程序。该程序在一启动时,在托盘创立应用程序的图标,最小化程序时隐藏主窗口,双击托盘区的图标时,显示主窗口,右键点击托盘区窗口时,弹出菜单进行相应的操作。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值