熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用VC設計托盤圖標程序

2013-11-13 09:48:19  來源: .NET編程 

  在Windows操作系統中任務欄的右邊(托盤)會常駐幾個圖標如輸入法切換圖標音量控制圖標等此外我們還經常遇到具有托盤圖標的軟件如金山詞霸實時監測功能的殺毒軟件等這些軟件在後台運行通常不占用太多的屏幕資源只在通知欄上放一個小小的標志必要時我們可以通過用鼠標點擊圖標對其進行選單操作或激活其主窗口有時我們自己編寫的程序也希望有類似的效果本文將詳細地介紹用VC設計托盤圖標程序的方法

  一 NOTIFYICONDATA結構

  NOTIFYICONDATA結構包含了系統用來處理托盤圖標的信息它包括選擇的圖標回調消息提示消息和圖標對應的窗口等內容其定義為

  typedef struct—NOTIFYICONDATA {

  DWORD cbSize;

  //以字節為單位的這個結構的大小

  HWND hWnd;

  //接收托盤圖標通知消息的窗口句柄

  UINT uID;

  //應用程序定義的該圖標的ID號

  UINT uFlags;

  //設置該圖標的屬性

  UINT uCallbackMessage;

  //應用程序定義的消息ID號此消息傳遞給hWnd

  HICON hIcon; //圖標的句柄

  char szTip[]; //鼠標停留在圖標上顯示的提示信息

  } NOTIFYICONDATA ?PNOTIFYICONDATA;

  該結構中成員uFlags可以是下列的組合或其中之一

  NIF_ICON設置成員hIcon有效

  NIF_MESSAGE設置成員uCallbackMessage有效

  NIF_TIP設置成員szTip有效

  二 Shell_NotifyIcon函數

  全局函數Shell_NotifyIcon()用於在托盤上增加刪除或修改圖標其原型為

  WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessagePNOTIFYICONDATA pnid);

  Pnid是上面的NOTIFYICONDATA結構的指針

  dwMessage是被傳遞的消息可以是以下消息之一

  NIM_ADD增加圖標

  NIM_DELETE刪除圖標

  NIM_MODIFY修改圖標

  三 托盤圖標程序設計示例

  首先我們用AppWizard創建一個不基於文檔和視圖結構的應用程序Tray我們並不想在應用程序啟動時顯示主窗口所以需要刪除應用程序類CTrayApp中成員函數InitInstance()的以下兩句代碼

  pFrame〉ActivateFrame();

  pFrame〉ShowWindow(SW_SHOW);

  在CMainFrame類中加入NOTIFYICONDATA結構的保護成員變量m_tnid並在其OnCreate函數中return語句前加入生成托盤圖標的代碼

  m_tnidcbSize=sizeof(NOTIFYICONDATA);

  m_tnidhWnd=this〉m_hWnd;

  m_tniduFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;

  m_tniduCallbackMessage=MYWM_NOTIFYICON;



  //用戶定義的回調消息

  CString szToolTip;

  szToolTip=_T(托盤圖標實例);

  _tcscpy(m_tnidszTip szToolTip);

  m_tniduID=IDR_MAINFRAME;

  HICON hIcon;

  hIcon=AfxGetApp()〉LoadIcon(IDR_MAINFRAME);

  m_tnidhIcon=hIcon;

  ::Shell_NotifyIcon(NIM_ADD&&m_tnid);

  if(hIcon)::DestroyIcon(hIcon);

  返回消息的ID應在主框架類的頭函數中定義

  #define MYWM_NOTIFYICON WM_USER+

  為了處理圖標返回消息如鼠標左鍵雙擊鼠標右鍵單擊消息我們重載WindowProc()函數此外我們還希望在主框架窗口最小化時圖標不在任務欄的空白區出現在此函數中同時作相應處理

  LRESULT CMainFrame::WindowProc(UINT message WPARAM wParam LPARAM lParam)

  {

  switch(message){

  case MYWM_NOTIFYICON:

  //如果是用戶定義的消息

  if(lParam==WM_LBUTTONDBLCLK){

  //鼠標雙擊時主窗口出現

  AfxGetApp()〉m_pMainWnd〉ShowWindow(SW_SHOW);

  }

  else if(lParam==WM_RBUTTONDOWN){ //鼠標右鍵單擊彈出選單

  CMenu menu;

  menuLoadMenu(IDR_RIGHT_MENU); //載入事先定義的選單

  CMenu?pMenu=menuGetSubMenu();

  CPoint pos;

  GetCursorPos(&&pos);

  pMenu〉TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTONposxposyAfxGetMainWnd());

  }

  break;

  case WM_SYSCOMMAND:

  //如果是系統消息

  if(wParam= =SC_MINIMIZE){

  //接收到最小化消息時主窗口隱藏

  AfxGetApp()〉m_pMainWnd〉ShowWindow(SW_HIDE);

  return ;

  }

  break;

  }

  return CFrameWnd::WindowProc(message wParam lParam);

  }

  為使應用程序退出時圖標消失映射WM_DESTROY消息在OnDestroy()函數中加入

  ::Shell_NotifyIcon(NIM_DELETE&&m_tnid);

  至此托盤圖標程序的常規功能我們均已實現我們還可以通過Shell_NotifyIcon()函數的調用實現不同狀態下圖標的改變

  本程序在VC++ Windows / Professional下調試通過


From:http://tw.wingwit.com/Article/program/net/201311/11634.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.