制作任务栏托盘菜单

1)准备一个菜单资源,并导入一个图标资源(用作任务栏上显示的图标)

2)在你的程序中添加两个变量,一个是CMenu对象m_Menu,一个是NOTIFYICONDATA结构体对象m_NotifyData,这个结构体作用是"包含系统需要的用来传递托盘区域消息的信息",具体请查询MSDN

3)自定义一个消息,在窗口最小化时向任务栏注册该消息,以便在左单击任务栏上的图标时能够恢复显示对话框或右键显示菜单.

#define WM_TRAYMESSAGE WM_USER + 1

4)在对话框初始化时加载菜单资源,并初始化m_NotifyData结构体对象.

具体代码如下:

    m_TrayMenu.LoadMenu(IDR_MENU);        //加载菜单资源
    //初始化m_NotifyData
    m_NotifyData.cbSize = sizeof(NOTIFYICONDATA);
    m_NotifyData.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
    m_NotifyData.hWnd = m_hWnd;
    char szTrayText[11] = "系统管理";
    strncpy(m_NotifyData.szTip,szTrayText,strlen(szTrayText) + 1);
    m_NotifyData.uCallbackMessage = WM_TRAYMESSAGE;
    m_NotifyData.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;

5)在对话框的OnSysCommand函数中截获窗口最小化的消息,调用Shell_NotifyIcon外壳函数向任务栏注册托盘信息

Shell_NotifyIcon函数作用是向任务栏区域发送一个增加,改变,或删除图标的消息

Shell_NotifyIcon(NIM_ADD,&m_NotifyData);           //注册任务栏信息,将消息WM_TRAYMESSAGE与图标关联起来

6)添加消息WM_TRAYMESSAGE处理函数OnTrayMenu(WPARAM wParam,LPARAM lParam);(注意手动添加消息映射时,响应函数返回值是LRESULT而不是void,在VS2008上若为void会报错)

代码如下:

LRESULT CTrayMenuDlg::OnTrayMessage(WPARAM wParam, LPARAM lParam)
{
    if(lParam == WM_LBUTTONDOWN)
    {
        ShowWindow(SW_RESTORE);         //还原显示窗口
    }
    else if(lParam == WM_RBUTTONDOWN)
    {
        CPoint curPT;
        ::GetCursorPos(&curPT);
        CMenu* pSubMenu = m_TrayMenu.GetSubMenu(0); //获取子菜单
        pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,curPT.x,
            curPT.y,AfxGetApp()->m_pMainWnd,TPM_LEFTALIGN);  //弹出菜单
    }
    return 1;
}
添加消息映射宏

ON_MESSAGE(WM_TRAYMESSAGE,OnTrayMessage)

7)最后添加OnCancel()函数,在对话框关闭时删除任务栏中的托盘图标

代码如下:

    Shell_NotifyIcon(NIM_DELETE,&m_NotifyData);        //删除托盘菜单
    CDialog::OnCancel();

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值