原创 VC下实现托盘程序(转帖)

2008-10-20 22:36 4070 0 分类: 软件与OS

托盘程序有时显得很必要,而且会让别人认为你的程序够专业。其实实现托盘程序很简单。


实现托盘程序,主要用到这个函数:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
); 它负责绘制图标以及确定图标所传送消息。关于它的详细介绍,可以自己查看msdn.

程序实现细节:


最小化到托盘程序:
拦截程序wm_size消息,判断它的消息是最小化时,将窗口最小化到托盘:
void CScanServerDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);


// TODO: 在此处添加消息处理程序代码
if(nType==SIZE_MINIMIZED)
       toTray();


}


void CScanServerDlg::toTray()
{
   NOTIFYICONDATA nid;
   nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
   nid.hWnd=this->m_hWnd;
    nid.uID=IDR_MAINFRAME;
   nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
   nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
   nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
   strcpy(nid.szTip,"123456..."); //信息提示条为“123456”
   Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
   ShowWindow(SW_HIDE); //隐藏主窗口
}


然后,在dlg.cpp文件中定义一个消息:


#define WM_SHOWTASK (WM_USER + 1983) //托盘消息影射


同时添加消息实现函数 afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);


LRESULT CScanServerDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
   return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
   {


     LPPOINT lpoint="new" tagPOINT;
     ::GetCursorPos(lpoint);//得到鼠标位置
     CMenu menu;
     menu.CreatePopupMenu();//声明一个弹出式菜单
    / /增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口,将程序结束。
    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_SHOW);//简单的显示主窗口完事儿
    }
   break;
   }
return 0;
}
并在cpp文件中将消息和消息实现链接起来
BEGIN_MESSAGE_MAP(CScanServerDlg, CDialog)
ON_MESSAGE(WM_SHOWTASK,onShowTask)
END_MESSAGE_MAP()


到此,你的托盘程序已然实现了。不过还有一个小问题,就是关闭窗口后托盘图标还在任务栏中显示,所以
要捕捉wm_destroy消息,将托盘图标给删掉:
void CScanServerDlg::OnDestroy()
{
   CDialog::OnDestroy();


    // TODO: 在此处添加消息处理程序代码
     //删除托盘图标
   NOTIFYICONDATA tnid;
    tnid.cbSize = sizeof(NOTIFYICONDATA);
    tnid.hWnd = m_hWnd;
    tnid.uID = IDR_MAINFRAME;
    //用NIM_DELETE删除图标
    Shell_NotifyIcon(NIM_DELETE, &tnid);
}

文章评论0条评论)

登录后参与讨论
相关推荐阅读
雁塔菜农 2012-04-05 17:51
2012年度新唐Cortex-M0助学开发套件有约束条件赠送申报贴
2012年度新唐Cortex-M0助学套件从4月起每月有约束条件发放16套。 申报人必须是21ic或 EDNC 会员 并具备1月的会龄。 申报时必须注明“遵守约束条件,缴纳250元订金,上...
雁塔菜农 2012-04-05 17:04
2012年度Cortex-M0助学园地推广框图
...
雁塔菜农 2012-04-01 17:59
2012年度Cortex-M0助学园地奖励计划细则
抢楼请点击:菜地公告:即日起创建《菜农Cortex-M0助学园地》(盖楼入口) 每月10号和25号的下午2:50进行2次抢楼,规则同去年12月的疯狂抢楼活动。 奖品由21IC、北航、广州迪圣...
雁塔菜农 2012-02-03 08:19
菜农谋略:搞定牛人宋俊德,对女牛人孙昌旭说:“记住,俺是雁塔菜农~~~ ”
http://www.baidu.com/s?wd=%B2%CB%C5%A9%D0%A6%CC%B8%A1%B6%D0%C2%C0%CB%C3%FB%C8%CB%D0%A7%D3%A6%A1%B7...
我要评论
0
0
1
2
3
4
5
6
7
8
9
0
关闭 热点推荐上一条 /3 下一条