開發具有Windows工作列佈告區圖示的應用程式 (轉)

worldblog發表於2007-12-06
開發具有Windows工作列佈告區圖示的應用程式 (轉)[@more@]

 開發具有工作列佈告區圖示的應用
 
  北京1303信箱15分箱 尹小功
 
  許多應用程式,如輸入法管理器、等均在工作列佈告區中放置一個有自已特色的圖示,該圖示讓知道有一個後臺程式正在執行,同時也提供了一種修改設定的快捷方法,本文將以C++
  Builder為例簡述它的實現方法。
 
開啟一個新工程,將工程取名為test、單元檔案取名為main。在視窗上放置二個按鈕、一個標籤,其屬性按如下設定屬性值
Label1   Caption  按OK按鈕...終目程式
OKButton   Caption  &OKButton
CancelButton  Caption  &CancelButton
開啟檔案main.h,加入斜體部分宣告(以手工輸入部分均以斜體表示,以下同)
class TForm1 : public TFo
{
__published: // -managed Components
 
 TButton *OKButton;
 TButton *CancelButton;
 TLabel *Label1;
 
 void __fastcall FormCreate(T *Sender);
 void __fastcall FormDestroy(TObject *Sender);
 void __fastcall OKButtonClick(TObject *Sender);
 void __fastcall CancelButtonClick(TObject *Sender);
 
private: // User declarations
 unsigned ugIconMessage;
 void AddTray();
 void DeleteTray();
protected:
 virtual void __fastcall WndProc(Messages::TMessage &Message);
public: // User declarations
 __fastcall TForm1(TComponent* Owner);
};
 
切換到main.cpp,加入以下及宣告
#include
#pragma hdrstop
 
#include "main.h"
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
#pragma re "*.dfm"
TForm1 *Form1;
 
//---------------------------------------------------------------------------
 
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
 
}
 
//---------------------------------------------------------------------------
 
void TForm1::AddTray()//建立工作列佈告區圖示
{
 NOTIFYICONDATA icondata;①
   memset(&icondata,0,sizeof(icondata));②
   icondata.cbSize=sizeof(icondata);
 icondata.hWnd=Handle;③
   strncpy(icondata.szTip,"我的任務",sizeof(icondata.szTip));④
   Application->Icon->LoadFromFile("e:yxgmapsystemicoyxg.ico");
   icondata.hIcon=Application->Icon->Handle; ⑤
   icondata.uCallbackMessage=ugIconMessage;⑥
   icondata.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;⑦
   _NotifyIcon(NIM_ADD,&icondata);⑧
}

void TForm1::DeleteTray()//刪除工作列佈告區圖示
{
 NOTIFYICONDATA icondata;
   memset(&icondata,0,sizeof(icondata));
   icondata.cbSize=sizeof(icondata);
 icondata.hWnd=Handle;
   Shell_NotifyIcon(NIM_DELETE,&icondata); ⑧
}

void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
 
 if(Message.Msg==ugIconMessage)//如果產生的是與該圖示相關的訊息
 {
   if(Message.LParam==WM_LBUTTONLCLK)
 Application->Tenate();⑨
   if(Message.LParam==WM_RBUTTONDBLCLK)
 {
   ShowWindow(Application->Handle,SW_SHOW);//
   Application->ShowMainForm=true;
 Form1->Visible=true; ⑩
 }
   return;
 }

 TForm::WndProc(Message);
}
 
①申請一個工作列佈告區圖示的結構變數;
②將結構變數的內容清零;
③取得當前視窗的控制程式碼;
④輸入滑鼠經過該圖示時的提示字串;
⑤將自已所喜愛的圖示檔案作為工作列佈告區的圖示;
⑥取得回撥資訊變數;
⑦當結構變數中成員hIcon、uCallbackMessage與szTip出錯時將給出錯誤標誌;
⑧函式Shell_NotifyIcon()在工作列佈告區產生或刪除一個圖示;
⑨當滑鼠左鍵在該圖示處雙擊時,終止程式執行;
⑩當滑鼠右鍵在該圖示處雙擊時,顯示與該圖示相關的應用程式。我們知道,所有的TWinControl派生來的VCL類都有一個WndProc函式,呼叫這個函式可以傳送訊息並被相關的視窗接收,WndProc被定義成一個虛擬函式,這樣一個派生類就可以定義它自已的WndProc函式來代替其父類的WndProc函式。在這裡,與工作列佈告區圖示相關的訊息由子類的WndProc函式處理,否則呼叫父類的WndProc處理。
 
在Form1的OnCreate事件中加入以下程式碼:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 ugIconMessage=RegisterWindowMessage("IconNotify");①
 AddTray();②
   Form1->Visible=false;③
}
 
①呼叫RegisterWindowMessage()函式來建立一個獨一無二的訊息編號,以確保沒有衝突;
②在工作列佈告區建立圖示;
③顯示窗體;
 
在Form1的OnDestroy事件中加入DeleteTray()函式以刪除圖示。
 
將OKButton與CancelButton按鈕的OnClick事件增加程式碼以隱藏主視窗及終止程式執行。
void __fastcall TForm1::OKButtonClick(TObject *Sender)
{
 Form1->Visible=false;
 ShowWindow(Application->Handle,SW_HIDE);
   Application->ShowMainForm=false;
}
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::CancelButtonClick(TObject *Sender)
{
 Application->Terminate();
}
 
最後,在WinMain函式中增加兩行程式碼以便程式在開始執行時就隱藏主窗體。
WIN WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
 try
 {
 Application->Initialize();
   Application->CreateForm(__classid(TForm1), &Form1);
   ShowWindow(Application->Handle,SW_HIDE);
   Application->ShowMainForm=false;
 Application->Run();
 }
 catch (Exception &exception)
 {
   Application->ShowException(&exception);
 }
 return 0;
}


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

相關文章