现在的位置: 首页 > 综合 > 正文

创建系统栏托盘程序

2017年11月19日 ⁄ 综合 ⁄ 共 1993字 ⁄ 字号 评论关闭

1) 新建MFC单文档应用程序,取消"文档/视图结构支持"前面的钩。其他可随意。

2) 在程序CMainFrame.cpp中找到OnCreate函数,在最后加入:
NOTIFYICONDATA tnd;

tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = this->m_hWnd;
tnd.uID = IDR_MAINFRAME;
tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnd.uCallbackMessage = WM_MYMESSAGE; 
tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
wcscpy(tnd.szTip, _T("鼠标放到图标上的提示"));

Shell_NotifyIcon(NIM_ADD, &tnd);

其中IDR_MAINFRAME是个图标资源
WM_MYMESSAGE定义为:#define WM_MYMESSAGE WM_USER + 101 在CMainFrame.cpp中定义

3) 在BEGIN_MESSAGE_MAP(CTrayTestDlg, CFrameWnd)和END_MESSAGE_MAP()中加入:
ON_MESSAGE(WM_MYMESSAGE, CMainFrame::OnMyMessage)宏

4) 定义OnMYMESSAGE函数:
LRESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
  UINT uID;//发出该消息的图标的ID
  UINT uMouseMsg;//鼠标动作
 
  uID=(UINT)wParam;
  uMouseMsg=(UINT)lParam;
 if(uMouseMsg == WM_RBUTTONDOWN) //如果是单击右键
     {
  switch(uID)
  {
  case IDR_MAINFRAME:        //如果是我们的图标
   show();
   break;
  default:
   break;
  }    
     }
 return FALSE;
}

5) 定义显示函数:
void CMainFrame::show()
{
 CMenu menu, * pSubMenu;    //定义下面要用到的cmenu对象
 menu.LoadMenu(IDR_MYMENU); //装载自定义的右键菜单
 pSubMenu = menu.GetSubMenu(0);//获取弹出菜单,所以第一个菜单必须有子菜单
 CPoint point;             //定义一个用于确定光标位置的位置
 GetCursorPos(&point);    //获取当前光标的位置,以便使得菜单可以跟随光标
 SetForegroundWindow();     //其他地方单击,菜单消失
 pSubMenu->TrackPopupMenu (TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, this); //显示弹出菜单

不要忘记在CMainFrame.h中加入OnMyMessage和show的定义。
IDR_MYMENU是自定义的菜单,上标题有个占位相,可命名为NoName,他下面的子菜单项为要显示的菜单,如:退出(&X)。

6) 如果不想让任务栏上显示图标可以修改PreCreateWindow如下:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 cs.style |= WS_POPUP;  //不显示主窗体
 cs.dwExStyle |= WS_EX_TOOLWINDOW; //不显示任务按钮
 return CFrameWnd::PreCreateWindow(cs);
}

7) 增加退出时调用的函数,点退出按钮调用的事件中调用
DestroyWindow();

8) 为了程序结束时,系统栏图标消失,加入OnDestroy函数,
在BEGIN_MESSAGE_MAP(CTrayTestDlg, CFrameWnd)和END_MESSAGE_MAP()中加入:
ON_WM_DESTROY()宏

CMainFrame.h中加入OnDestroy函数声明:
afx_msg void OnDestroy();

函数体如下:
void CMainFrame::OnDestroy()
{
 NOTIFYICONDATA tnid;

 tnid.cbSize = sizeof(NOTIFYICONDATA);
 tnid.hWnd = this->m_hWnd;
 tnid.uID = IDR_MAINFRAME; //保证删除的是我们的图标
 Shell_NotifyIcon(NIM_DELETE,&tnid);
}

 

 

抱歉!评论已关闭.