<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
网上大部分都是基于对话框的托盘程序,基本文档视力的例子很少,此处举一例希望对大家有用.
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); }