首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++Builder 系統托盤圖示演示:完整生命週期與右鍵選單

     編輯:VC 教學

專案結構

  • 表單: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;
}

關鍵設計點

擴展建議

  • 右鍵單擊彈出 TPopupMenu (含「顯示」「設定」「退出」)。
  • 氣球提示 (NIF_INFO, szInfo, szInfoTitle, uTimeout) 顯示狀態變更。
  • 動畫圖示 (TTrayIcon.Animate) 表示後台活動。
  • 處理 WM_TASKBARCREATED 重建托盤圖示。

總結

此範例展示了系統托盤圖示的**最小完整閉環**:建立 → 顯示 → 滑鼠互動 (雙擊左/右鍵) → 隱藏/顯示主視窗 → 銷毀清理。掌握此流程,即可構建任意托盤常駐應用。實際專案建議直接使用 TTrayIcon 元件,將上述邏輯封裝為屬性/事件配置。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
設計說明
自訂訊息 WM_APP+100避免與系統訊息衝突,WM_APP 以上保留給應用程式
使用 Application->Icon專案選項→Application→Icon 設定主圖示,無需額外 LoadIcon
雙擊左鍵退出、右鍵顯示示範不同滑鼠動作綁定不同邏輯
Cancel 隱藏而非關閉實現「最小化到托盤」行為
FormDestroy 呼叫 DeleteTray確保資源釋放,避免殘留圖示