專案結構
- 表單:
TForm1,含 OKButton、CancelButton、Label1。
- 托盤圖示:
yxg.ico (專案目錄下)。
- 自訂訊息:
WM_MYICON = WM_APP + 100。
關鍵程式碼片段
1. 表單類別宣告 (Unit1.h)
class TForm1 : public TForm {
__published:
TButton *OKButton, *CancelButton;
TLabel *Label1;
void __fastcall FormCreate(TObject* Sender);
void __fastcall FormDestroy(TObject* Sender);
void __fastcall OKButtonClick(TObject* Sender);
void __fastcall CancelButtonClick(TObject* Sender);
private:
unsigned ugIconMessage; // WM_MYICON
void AddTray(); // 新增托盤圖示
void DeleteTray(); // 移除托盤圖示
protected:
virtual void __fastcall WndProc(TMessage& Message); // 訊息處理
public:
__fastcall TForm1(TComponent* Owner);
};
2. 托盤新增/移除 (Unit1.cpp)
void TForm1::AddTray() {
NOTIFYICONDATA nid = { sizeof(nid) };
nid.hWnd = Handle; nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage = ugIconMessage;
nid.hIcon = Application->Icon->Handle; // 使用應用程式主圖示
strncpy(nid.szTip, "我的任務", sizeof(nid.szTip));
Shell_NotifyIcon(NIM_ADD, &nid);
}
void TForm1::DeleteTray() {
NOTIFYICONDATA nid = { sizeof(nid) };
nid.hWnd = Handle;
Shell_NotifyIcon(NIM_DELETE, &nid);
}
3. 視窗程序處理托盤滑鼠事件
void __fastcall TForm1::WndProc(TMessage& Message) {
if (Message.Msg == ugIconMessage) {
if (Message.LParam == WM_LBUTTONDBLCLK) {
Application->Terminate(); // 雙擊左鍵退出程式
}
else if (Message.LParam == WM_RBUTTONDBLCLK) {
ShowWindow(Application->Handle, SW_SHOW); // 雙擊右鍵顯示主視窗
Application->ShowMainForm = true;
Visible = true;
}
return;
}
TForm::WndProc(Message);
}
4. 表單生命週期綁定
void __fastcall TForm1::FormCreate(TObject* Sender) {
ugIconMessage = WM_APP + 100;
AddTray();
Label1->Caption = "按 OK 結束程式,右鍵雙擊托盤圖示顯示視窗";
}
void __fastcall TForm1::FormDestroy(TObject* Sender) {
DeleteTray();
}
void __fastcall TForm1::OKButtonClick(TObject* Sender) {
Application->Terminate();
}
void __fastcall TForm1::CancelButtonClick(TObject* Sender) {
ShowWindow(Application->Handle, SW_HIDE); // 隱藏到托盤
Application->ShowMainForm = false;
Visible = false;
}
關鍵設計點
| 設計 | 說明 |
自訂訊息 WM_APP+100 | 避免與系統訊息衝突,WM_APP 以上保留給應用程式 |
使用 Application->Icon | 專案選項→Application→Icon 設定主圖示,無需額外 LoadIcon |
| 雙擊左鍵退出、右鍵顯示 | 示範不同滑鼠動作綁定不同邏輯 |
| Cancel 隱藏而非關閉 | 實現「最小化到托盤」行為 |
| FormDestroy 呼叫 DeleteTray | 確保資源釋放,避免殘留圖示 |
擴展建議
- 右鍵單擊彈出
TPopupMenu (含「顯示」「設定」「退出」)。
- 氣球提示 (
NIF_INFO, szInfo, szInfoTitle, uTimeout) 顯示狀態變更。
- 動畫圖示 (
TTrayIcon.Animate) 表示後台活動。
- 處理
WM_TASKBARCREATED 重建托盤圖示。
總結
此範例展示了系統托盤圖示的**最小完整閉環**:建立 → 顯示 → 滑鼠互動 (雙擊左/右鍵) → 隱藏/顯示主視窗 → 銷毀清理。掌握此流程,即可構建任意托盤常駐應用。實際專案建議直接使用 TTrayIcon 元件,將上述邏輯封裝為屬性/事件配置。
- 上一篇文章: C++Builder 任務列圖示動畫:Timer 驅動 Shell_NotifyIcon 圖示切換
- 下一篇文章: Windows NT 服務程式設計:Service Control Manager 操作 API 詳解
Copyright ©
程式碼之家 All Rights Reserved