分享

桌面搜索-系统托盘 - 林建华的专栏

 accesine 2005-08-27
桌面搜索-系统托盘

在程序最小化时,不在windows的任务栏中出现,而是在右下角的系统托盘中显示一个小图标,当鼠标单击时显示功能菜单,双击时打开主界面。这就是系统托盘程序的一般功能,想qq和很多桌面搜索程序都是这么做了,给人的感觉比较清爽,不用的时候就缩在一个小角落里,用的时候也能很快的找到。

在技术实现上

首先是创建托盘:

void CDiskSearchDlg::InitTray()
{
 m_NotifyID.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
 m_NotifyID.hWnd=this->m_hWnd;
 m_NotifyID.uID=IDR_MAINFRAME;
 m_NotifyID.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
 m_NotifyID.uCallbackMessage=WM_NOTIFYICON;//自定义的消息名称
 m_NotifyID.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
 strcpy(m_NotifyID.szTip,"桌面搜索");//信息提示
 Shell_NotifyIcon(NIM_ADD,&m_NotifyID);//在托盘区添加图标
}

上面的代码就是一个一般创建的方法,其中定义NOTIFYICONDATA m_NotifyID;

WM_NOTIFYICON是自定义的消息,我们可以用

#define WM_NOTIFYICON WM_USE+5

来定义

调用InitTray()后会在托盘上出现一个小图标,当然我们也同时要把任务栏中的程序任务去掉,只要调用ShowWindow(SW_HIDE)就可以了

接下来是创建一个菜单资源,假设为IDR_MENU_TP

然后要做的是添加WM_NOTIFYICON消息:

在BEGIN_MESSAGE_MAP(CDiskSearchDlg, CDialog)内要添加

ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//手工添加托盘消息映射

并定义函数

LONG CDiskSearchDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
 //wParam中是响应消息的图标ID,lParam中则是Windows的消息
    switch ( lParam )
 {
 case WM_RBUTTONDOWN:
  {// 用户在托盘图标上单击鼠标右键,弹出菜单
   CMenu pMenu;
   if (pMenu.LoadMenu(IDR_MENU_TP))
   {
    CMenu* pPopup = pMenu.GetSubMenu(0);
    ASSERT(pPopup != NULL);
    CPoint Point;
    GetCursorPos( &Point );
    SetForegroundWindow();
    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, Point.x, Point.y, this);
   }          
  }
  break;
 case WM_LBUTTONDBLCLK:
//  OnMenuitemShow();
  break;
 case WM_LBUTTONDOWN:
  {// 用户在托盘图标上单击鼠标右键,弹出菜单
   CMenu pMenu;
   if (pMenu.LoadMenu(IDR_MENU_TP))
   {
    CMenu* pPopup = pMenu.GetSubMenu(0);
    ASSERT(pPopup != NULL);
    CPoint Point;
    GetCursorPos( &Point );
    SetForegroundWindow();
    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, Point.x, Point.y, this);
   }          
  }
  break;
 default:break;
 }
    return 0;
}

上面这段代码中,添加了鼠标单击的消息,双击和其他消息其实是一样的。

最后,在退出的时候记得要调用

Shell_NotifyIcon(NIM_DELETE, &m_NotifyID);

来把托盘图标删除。

当然还有做动画托盘,就是托盘上的图标是变化的,这个可以在上面的dlg类中添加Timer函数,定时更换图标就可以了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多