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

2008-10-20 22:36 4502 5 5 分类: 软件与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);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条