用 C++Builder 編寫 Tray 程式 (轉)

worldblog發表於2007-12-09
用 C++Builder 編寫 Tray 程式 (轉)[@more@]

  Tray(托盤)是9x任務條上的一個特殊區域,它的技術名稱為“工作列佈告區”,一些(如金山詞霸Ⅲ)執行時會在托盤上放置一個圖示,使一眼就能知道這個正在後臺執行,要想啟用它也很容易,通常只需單擊一下這個圖示即可,非常方便。 
  Tray的比較特殊,但並不難,主要包括圖示、工具提示和訊息等三個方面,它是程式設計的一部分。Shell提供了Shell—NotifyIcon,用它可以增加、刪除或者修改托盤中的圖示,在托盤上放置圖示後,Windows Shell會負責把發生在圖示上的滑鼠事件通知應用程式。Shell—NotifyIcon函式定義如下: 

  WINSHELLAPI BOOL WINAPI Shell—NotifyIcon(D dwMessage,PNOTIFYICONDATA pnid); 

  dwMessage表示要完成的操作:NIM—ADD(增加圖示)、NIM—DELETE(刪除圖示)、NIM—MODIFY(修改圖示或提示文字),pnid是一個指向NOTIFYICONDATA結構的指標,結構的定義如下: 

typedef struct —NOTIFYICONDATA{ 
  DWORD cbSize;//結構所佔的位元組數,必須用結構的大小來初始化。 
  HWND hWnd;//接受Tray圖示訊息的視窗控制程式碼 
  UINT uID;//由應用程式定義的圖示ID 
  UINT uFlags;//用來鑑別那些需要改變其值的域,
  //NIF_ICON表示hIcon有效,可用來修改圖示,
  //NIF_MESSAGE表示uCallbackMessage有效,用來定義訊息,
  //NIF—TIP表示szTip引數有效,可修改工具提示。 
  UINT uCallbackMessage;//應用程式定義的訊息 
  HICON hIcon;//Tray圖示的控制程式碼 
  char szTip[64];//工具提示的文字 
} NOTIFYICONDATA; 

  下面我們就透過一個具體例子來說明實現方法,程式執行時不會顯示主窗體,只在托盤上增加一個圖示,雙擊圖示可關閉程式。

  新建一個工程,放置一個Timer到窗體上。開啟unit1.h,增加標頭檔案說明#include ,在TForm1定義的private段增加一些資料成員和方法的宣告: 

  unsigned int iconmessage;//定義的訊息 
  void AddTrayIcon();//在托盤上增加圖示 
  void RemoveTrayIcon();//從托盤中刪除圖示 

  由於要增加對自定義訊息的處理,所以必須過載視窗過程函式WndProc,在TForm1的定義中增加protected段:virtual void ——fastcall WndProc(Messages::Tmessage& Message); 

  在unit1.cpp中定義相應的成員函式: 

void TForm1::AddTrayIcon() 
{
  NOTIFYICONDATA icondata; 
  memset(&icondata,0,sizeof(icondata)); 
 
  //將結構icondata的各域初始化為0 
  icondata.cbSize=sizeof(icondata); 
  icondata.hWnd=Handle; 
  strncpy(icondata.szTip,″未知狀態″,sizeof(icondata.szTip)); 
  icondata.hIcon=Application->Icon->Handle; 
  icondata.uCallbackMessage=iconmessage; 
  icondata.uFlags=NIF—MESSAGE|NIF—ICON|NIF—TIP; 
  Shell—NotifyIcon(NIM—ADD,&icondata); 

void TForm1::RemoveTrayIcon() 

  NOTIFYICONDATA icondata; 
  memset(&icondata,0,sizeof(icondata)); 
  icondata.cbSize=sizeof(icondata); 
  icondata.hWnd=Handle; 
  Shell—NotifyIcon(NIM—DELETE,&icondata); 

過載TForm1的WndProc函式,加入對自定義訊息的處理程式碼,這其實相當於建立了TForm類的子類。 

void __fastcall TForm1::WndProc(Messages::TMessage& Message) 

  if(Message.Msg==iconmessage) 
  { 
  if(Message.LParam==WM—LBUTTONLCLK) 
  { 
  Application->Tenate(); 
  //如果雙擊圖示,則關閉應用程式 
  } 
  return; 
  } 
  TForm::WndProc(Message);//對於其他的訊息,基礎類的WndProc函式讓Windows進行預設處理。 

建立窗體的OnCreate事件控制程式碼: 

void __fastcall TForm1::FormCreate(T *Sender) 

  iconmessage=RegisterWindowMessage(″IconNotify″); 
  AddTrayIcon(); 

這裡透過呼叫RegisterWindowMessage函式來定義一個使用者訊息,也可以透過WM_USER+n來獲得一個沒有使用的訊息編號。 

void __fastcall TForm1::FormDestroy(TObject *Sender) 

  RemoveTrayIcon(); 
  //窗體在關閉時刪除托盤中的圖示 

編寫Timer1的Timer事件程式碼,當使用者將滑鼠停留在圖示上時,顯示提示文字: 

void __fastcall TForm1::Timer1Timer(TObject *Sender) 

  NOTIFYICONDATA icondata; 
  memset (&icondata, 0, sizeof (icondata)); 
  icondata.cbSize = sizeof (icondata); 
  icondata.hWnd = Handle; 
  String s=″我的圖示!″;//定義提示文字 
  strncpy (icondata.szTip, s.c_str(), sizeof (icondata.szTip)); 
  icondata.uFlags = NIF—T; 
  Shell—NotifyIcon (NIM—MODIFY,&icondata); 

  程式執行時不顯示主窗體,只在托盤上放置相應的程式圖示,從C++ Builder主選單中選擇View|Project ,在WinMain函式的Application→Initialize()語句後增加程式碼: 

  ShowWindow(Application→Handle,SW—H); 
  Application→ShowMainForm=false; 

  按F9編譯並執行程式,托盤上就會出現相應的圖示。以上程式碼在C++ Builder3、P環境下編譯、執行透過。 

-=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
 /
 __________/LB___ OUTINN
 / _[]_ /____ 
/_________/| () |__ /">
 | ____ /-| __ |-| Welcome to visit OUTINN!
 |__|==|___| || |__|
 -=--=--=- |_||_| =- Fancy, to:outinn@china.com">outinn@china.com

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990013/,如需轉載,請註明出處,否則將追究法律責任。

相關文章