给托盘添加右击菜单--变化的背景图

南京航空航天大学张庆利

下载本文示例工程

  图1 变化的背景图

给托盘添加右击菜单

  一般的商业程序都有托盘图标和在托盘上弹出右击菜单的功能,那么如何给自已的程序添加这样的功能呢?本文通过改变背景图的实例,介绍一种实现托盘上弹出右击菜单的方法。 

一、添加托盘图标

给程序添加托盘图标的方法在很多VC书中都有实例,通常在程序中按下面的步骤就可以实现:

1、在XXDlg.CPP文件头部加入

#define WM_NOTIFYICONWM_USER+5   
            NOTIFYICONDATA nd;

2、在程序的初始化中加入下面代码

nd.cbSize= sizeof (NOTIFYICONDATA);
            nd.hWnd= m_hWnd;
            nd.uID= IDR_MAINFRAME;
            nd.uFlags= NIF_ICON|NIF_MESSAGE|NIF_TIP;
            nd.uCallbackMessage= WM_NOTIFYICON;
            nd.hIcon= m_hIcon;
            strcpy(nd.szTip, "我的托盘");
            Shell_NotifyIcon(NIM_ADD, &nd);      
3、在程序的退了函数中加入删除托盘图标语句 

 

Shell_NotifyIcon(NIM_DELETE, &nd); 
二、在资源中添加菜单

1、建立菜单 

图2 菜单

2、建立菜单对应的函数

void CbackdropDlg::OnShow()
            {
            ShowWindow( SW_SHOWNORMAL);//恢复正常显示
            }
            void CbackdropDlg::OnExit()
            {
            ::PostQuitMessage(0); //退出
            }
            void CbackdropDlg::OnHide()
            {
            ShowWindow(SW_HIDE);//隐藏
            }
            void CbackdropDlg::OnMin()
            {
            ShowWindow(SW_SHOWMINIMIZED);//最小化
            }
            
三、添加响应函数 

 

1、在类中加入托盘消息响应函数

LONG CbackdropDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)      
2、手中添加消息映射
//}}AFX_MSG_MAP
            ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//手工添加消息映射
            END_MESSAGE_MAP()       
3、在托盘消息响应函数中添加代码
LONG CbackdropDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
            {
            // 响应在托盘图标上的单击
            //wParam中是响应消息的图标ID,lParam中则是Windows的消息
            // The backdrop icon sent us a message.  Let''s see what it is
            switch ( lParam )
            {
            case WM_RBUTTONDOWN:
            {
            // 用户在托盘图标上单击鼠标右键,弹出菜单
            CMenu pMenu;
            if (pMenu.LoadMenu(IDR_MENU1))
            {
            CMenu* pPopup = pMenu.GetSubMenu(0);
            ASSERT(pPopup != NULL);
            CPoint Point;
            if(IsIconic()) pPopup->EnableMenuItem(IDC_MIN,MF_BYCOMMAND |
            MF_DISABLED | MF_GRAYED);
            if (IsWindowVisible())// 根据对话框窗口的状态对相关菜单项使能
            {
            if(!IsIconic())
            pPopup->EnableMenuItem(IDC_SHOW,MF_BYCOMMAND |
            MF_DISABLED | MF_GRAYED);
            }
            else
            pPopup->EnableMenuItem(IDC_HIDE,MF_BYCOMMAND |
            MF_DISABLED | MF_GRAYED);
            if (bkbmp)// 根据对话框背景图状态改变菜单名称
            pMenu.ModifyMenu(IDC_FIX,MF_STRING,IDC_FIX,"变化背景");
            else
            pMenu.ModifyMenu(IDC_FIX,MF_STRING,IDC_FIX,"固定背景)");
            // 确定鼠标位置以便在该位置附近显示菜单
            GetCursorPos( &Point );
            SetForegroundWindow();
            pPopup->TrackPopupMenu(
            TPM_LEFTALIGN | TPM_RIGHTBUTTON,
            Point.x, Point.y, this);?
            }
            }
            break;
            case WM_LBUTTONDBLCLK:
            case WM_LBUTTONDOWN:
            // OnShow();
            break;
            }
            return 0;
            }      
结束语
  自本人有幸找到VCKBASE以来的大半年里得到了论坛中的众多高手指点,收益匪浅,所以想为VCKBASE论坛做点什么,因本人水平较低,故只能将在VCKBASE论坛中现学会的关于托盘右击菜单的方法结合变化背景图实例向大家汇报一下。要进一步了解背景图的内容请参考背景图实例中代码,如想了解更多的托盘资料请参考本站有关文章和实例。由于时间、水平限制,缺点和不足之处在所难免,敬请各位高手多多批评指正.。在此再一次对本论坛和在论坛中对我提供帮助的众多高手深深表示感谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值