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

VC++ 標題欄動態動畫圖標實現方案

     編輯:關於VC++

核心原理

準備一組連續幀位圖(16×16),利用 CImageList 管理,定時器觸發幀切換,調用 WM_SETICON 更新視窗圖標,形成動畫效果。

封裝類設計:CAnimateIcon

頭文件 AnimateIcon.h

class CAnimateIcon {
protected:
    CImageList m_imgList;     // 圖像列表
    int m_iImageCounter;      // 當前幀索引
    int m_iMaxNumOfImages;    // 總幀數
    HICON hIcon, hPrevIcon;   // 圖標句柄
public:
    CAnimateIcon();
    ~CAnimateIcon();
    bool SetImageList(int IDOfImageListResource, int numberOfImages, COLORREF transparentColor);
    bool ShowNextImage();
};

實現文件 AnimateIcon.cpp

CAnimateIcon::CAnimateIcon() : m_iImageCounter(-1), m_iMaxNumOfImages(-100) {
    m_imgList.m_hImageList = NULL;
}
CAnimateIcon::~CAnimateIcon() { if (hPrevIcon) DestroyIcon(hPrevIcon); }

bool CAnimateIcon::SetImageList(int IDOfImageListResource, int numberOfImages, COLORREF transparentColor) {
    if (numberOfImages <= 0) return false;
    m_iMaxNumOfImages = numberOfImages;
    return m_imgList.Create(IDOfImageListResource, 16, 1, transparentColor);
}

bool CAnimateIcon::ShowNextImage() {
    if (!m_imgList.m_hImageList) return false;
    m_iImageCounter = (m_iImageCounter + 1) % m_iMaxNumOfImages;
    hIcon = m_imgList.ExtractIcon(m_iImageCounter);
    hPrevIcon = (HICON)AfxGetMainWnd()->SendMessage(WM_SETICON, TRUE, (LPARAM)hIcon);
    if (hPrevIcon) DestroyIcon(hPrevIcon);
    return true;
}

對話框專案整合步驟

  1. 資源編輯器導入位圖條帶,ID 設為 IDB_BITMAP_ANIM
  2. 專案加入 AnimateIcon.h/.cpp
  3. 主對話框類添加成員:CAnimateIcon m_animIcon; UINT m_timerID;
  4. OnInitDialog 初始化:
m_animIcon.SetImageList(IDB_BITMAP_ANIM, 6, RGB(0,0,0)); // 6 幀,黑色透明
m_timerID = SetTimer(99, 500, NULL); // 500ms 間隔
  1. 添加 WM_TIMER 處理:
void CAnimateDlgIconDlg::OnTimer(UINT nIDEvent) {
    m_animIcon.ShowNextImage();
    CDialog::OnTimer(nIDEvent);
}
  1. 添加 WM_DESTROY 清理:
void CAnimateDlgIconDlg::OnDestroy() {
    if (m_timerID) KillTimer(m_timerID);
    CDialog::OnDestroy();
}

進階優化建議

  • 幀率自適應:根據動畫複雜度調整 SetTimer 間隔(建議 100~500ms)
  • 資源釋放:析構函數確保 DestroyIcon 避免 GDI 洩漏
  • 多圖標支援:擴展類別管理大/小圖標分別動畫(WM_SETICON 參數 TRUE/FALSE)
  • 暫停/恢復:添加 Pause()/Resume() 控制定時器狀態

適用場景

  • 長時間運算任務狀態指示
  • 網絡連線/傳輸動態圖標
  • 品牌標識動態展示
  • 系統托盤圖標動畫(配合 Shell_NotifyIcon)

總結

通過 CImageList + 定時器 + WM_SETICON 三步走策略,輕鬆實現標題欄動畫圖標。封裝類 CAnimateIcon 復用性強,代碼量極小,是 MFC 應用提升專業度的低成本高回報技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved