創建系統欄托盤程序

<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); }

發佈了12 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章