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

C++Builder 任務列圖示動畫:Timer 驅動 Shell_NotifyIcon 圖示切換

     編輯:VC 教學

動畫原理:週期性修改托盤圖示

利用 TTimer 定時觸發,在 OnTimer 事件中呼叫 Shell_NotifyIcon(NIM_MODIFY, ...) 切換 hIcon,形成動畫效果。關鍵:圖示資源預載、狀態機切換、資源釋放。

核心實現步驟

1. 準備圖示資源

  • 使用 **Image Editor** 建立多個 .ico (建議 16x16, 32x32 含多種色深)。
  • 加入專案資源 (Project → Resources) 或用 TImageList 載入。
  • 範例:兩幅圖示「開門」(IDI_OPEN)、「關門」(IDI_CLOSE)。

2. 表單成員變數


int currentIcon = 0;  // 0=開, 1=關
HICON hIcons[2];      // 圖示控制代碼陣列
UINT timerInterval = 1000; // 1 秒切換一次

3. FormCreate 載入圖示、建立托盤


void __fastcall TForm1::FormCreate(TObject* Sender) {
    hIcons[0] = LoadIcon(HInstance, MAKEINTRESOURCE(IDI_OPEN));
    hIcons[1] = LoadIcon(HInstance, MAKEINTRESOURCE(IDI_CLOSE));

    NOTIFYICONDATA nid = { sizeof(nid) };
    nid.hWnd = Handle; nid.uID = 1; nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
    nid.uCallbackMessage = WM_MYTRAYICON; nid.hIcon = hIcons[0];
    lstrcpyn(nid.szTip, "動畫托盤示範", 128);
    Shell_NotifyIcon(NIM_ADD, &nid);

    Timer1->Interval = timerInterval;
    Timer1->Enabled = true;
}

4. Timer 事件切換圖示


void __fastcall TForm1::Timer1Timer(TObject* Sender) {
    currentIcon = 1 - currentIcon;  // 0↔1 切換
    NOTIFYICONDATA nid = { sizeof(nid) };
    nid.hWnd = Handle; nid.uID = 1; nid.uFlags = NIF_ICON;
    nid.hIcon = hIcons[currentIcon];
    Shell_NotifyIcon(NIM_MODIFY, &nid);
}

5. FormDestroy 清理


void __fastcall TForm1::FormDestroy(TObject* Sender) {
    Timer1->Enabled = false;
    Shell_NotifyIcon(NIM_DELETE, &(NOTIFYICONDATA){ sizeof(NOTIFYICONDATA), Handle, 1 });
    if (hIcons[0]) DestroyIcon(hIcons[0]);
    if (hIcons[1]) DestroyIcon(hIcons[1]);
}

進階:TTrayIcon 元件簡化動畫

  • 拖放 TTrayIcon,設定 Icons 集合 (多個 TIcon)。
  • 屬性:Animate = true, AnimateInterval = 1000 (ms)。
  • **零代碼**實現循環動畫,支援設計時預覽、自動資源管理。

注意事項

應用場景

  • 網路傳輸指示 (上傳/下載動畫)。
  • 後台任務進度 (旋轉齒輪、脈衝)。
  • 狀態變化提醒 (新郵件閃爍、警告脈動)。
  • 品牌曝光 (Logo 輕微動態)。

總結

任務列圖示動畫核心是 **Timer + NIM_MODIFY 切換 hIcon**。手動實現需管理圖示載入/銷毀、Timer 生命週期、Explorer 重啟恢復。**強烈建議使用 TTrayIcon 元件** (Animate/AnimateInterval/Icons) 獲得零代碼、自動資源管理、設計時支援的最佳體驗。動畫間隔建議 500ms-2000ms,避免過於頻繁干擾使用者。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題解決
動畫卡頓/不同步Timer 精度 ~10-15ms,接受;避免在 OnTimer 做耗時操作
圖示模糊/縮放失真提供 16x16, 32x32, 48x48 多尺寸內嵌於 .ico
資源洩漏FormDestroy 必須 DestroyIcon 所有 LoadIcon 取得的 HICON
Explorer 重啟圖示消失處理 WM_TASKBARCREATED 重新 NIM_ADD
高 DPI 模糊啟用 Per-Monitor DPI Awareness,提供高解析度圖示