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

工具列動畫技巧:在 MFC 工具列嵌入 CAnimateCtrl 播放 AVI 動畫

     編輯:關於C語言

核心思路

工具列 (CToolBar) 本質是控制列 (CControlBar),可包含非按鈕子視窗。利用 CAnimateCtrl (封裝 SysAnimate32 通用控制項) 播放無聲 AVI 動畫,增加視覺回饋 (如處理中、連線狀態)。

實作步驟

1. 準備 AVI 檔案

  • 尺寸建議小於工具列按鈕 (預設 24×22 像素),範例 27×14 像素、4-bit 深度。
  • 必須為 **未壓縮** 或 **RLE 壓縮** AVI,無音軌,否則無法播放。
  • 放置專案目錄或資源 (若為資源需用 Open 而非 Open 檔案路徑)。

2. 主框架類別新增成員


class CMainFrame : public CFrameWnd {
    // ...
    BOOL m_bAnimationActive; // 播放狀態旗標
    CAnimateCtrl m_wndAnimate; // 動畫控制項
    // ...
};

3. 建構函式初始化


CMainFrame::CMainFrame() : m_bAnimationActive(TRUE) {}

4. OnCreate 中建立動畫控制項


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
        return -1;

    // 關鍵:在工具列中預留空間 (插入分隔器或空白按鈕)
    // 假設在工具列資源中 ID_ANIMATE 為佔位按鈕
    int nIndex = m_wndToolBar.CommandToIndex(ID_ANIMATE);
    if (nIndex >= 0) {
        m_wndToolBar.SetButtonInfo(nIndex, ID_ANIMATE, TBBS_SEPARATOR, 100); // 寬度 100 像素
        CRect rect;
        m_wndToolBar.GetItemRect(nIndex, &rect);
        rect.DeflateRect(2, 2); // 留邊距

        // 建立動畫控制項,父視窗為工具列
        if (m_wndAnimate.Create(WS_CHILD|WS_VISIBLE|ACS_CENTER|ACS_AUTOPLAY|ACS_TIMER,
            rect, &m_wndToolBar, ID_ANIMATE)) {
            m_wndAnimate.Open(_T("c:\\temp\\sample.avi")); // 或資源 ID
            m_wndAnimate.Play(0, -1, -1); // 循環播放
        }
    }
    return 0;
}

5. 選單切換播放/停止


void CMainFrame::OnViewAnimate() {
    m_bAnimationActive = !m_bAnimationActive;
    if (m_bAnimationActive)
        m_wndAnimate.Play(0, -1, -1);
    else
        m_wndAnimate.Stop();
    m_wndToolBar.GetToolBarCtrl().HideButton(ID_ANIMATE, !m_bAnimationActive); // 可選:隱藏佔位
}

6. 視窗大小調整時同步動畫位置


void CMainFrame::OnSize(UINT nType, int cx, int cy) {
    CFrameWnd::OnSize(nType, cx, cy);
    // 重新取得工具列中佔位按鈕矩形並移動動畫控制項
    int nIndex = m_wndToolBar.CommandToIndex(ID_ANIMATE);
    if (nIndex >= 0) {
        CRect rect;
        m_wndToolBar.GetItemRect(nIndex, &rect);
        rect.DeflateRect(2, 2);
        m_wndAnimate.MoveWindow(rect);
    }
}

CAnimateCtrl 關鍵樣式

常見問題

  • AVI 不播放: 檢查壓縮格式 (需無壓縮/RLE)、尺寸、色深、無音軌、路徑正確。
  • 動畫閃爍: 雙重緩衝、確保工具列無 WS_CLIPCHILDREN 衝突。
  • 資源釋放: OnDestroy 中呼叫 m_wndAnimate.Close()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
樣式說明
ACS_CENTER動畫置中於控制項矩形
ACS_AUTOPLAYOpen 後自動播放
ACS_TIMER使用內建定時器執行緒播放 (不阻塞 UI)
ACS_TRANSPARENT透明背景 (需視窗支援 WS_EX_TRANSPARENT)