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

VC++ 自繪按鈕播放 AVI 視頻流:動畫按鈕完整實作

     編輯:VC 教學

效果

滑鼠移入按鈕區域 → 自動播放 AVI 動畫 (如齒輪轉動、箭頭脈動) → 滑鼠移出 → 停止並顯示第一幀。適用於遊戲選單、3D 軟體工具列。

核心類別:CAviButton


class CAviButton : public CButton {
    UINT m_nAviID;           // AVI 資源 ID
    CAnimateCtrl m_anim;     // 動畫控制項
    BOOL m_bPlaying = FALSE;
    virtual void DrawItem(LPDRAWITEMSTRUCT);
    virtual BOOL Create(LPCTSTR, LPCTSTR, DWORD, const RECT&, CWnd*, UINT, CCreateContext*);
    afx_msg void OnMouseMove(UINT, CPoint);
    void LoadAvi(UINT nID) { m_nAviID = nID; }
    void DrawButton(CDC*, UINT, CRect); // 繪製 3D 按鈕邊框
    DECLARE_MESSAGE_MAP()
};

關鍵實作

DrawItem - 建立動畫控制項並繪製按鈕


void CAviButton::DrawItem(LPDRAWITEMSTRUCT lpDIS) {
    CRect rc; GetClientRect(&rc);
    if (!::IsWindow(m_anim.m_hWnd)) {
        m_anim.Create(WS_CHILD | WS_VISIBLE, rc, this, 0);
        m_anim.Open(m_nAviID); // 載入 AVI 資源
        m_anim.GetClientRect(rc);
    }
    CDC* pDC = CDC::FromHandle(lpDIS->hDC);
    DrawButton(pDC, lpDIS->itemState, rc); // 繪製按鈕邊框/背景
}

OnMouseMove - 播放/停止控制


void CAviButton::OnMouseMove(UINT nFlags, CPoint point) {
    ClientToScreen(&point);
    CRect rcWnd; GetWindowRect(&rcWnd);
    BOOL bOver = rcWnd.PtInRect(point) && IsWindowEnabled();

    if (bOver && ::IsWindow(m_anim.m_hWnd) && !m_bPlaying) {
        m_anim.Play(0, -1, 1); // 從頭播放到尾,1 次
        m_bPlaying = TRUE;
        SetCapture();
    } else if (!bOver) {
        m_bPlaying = FALSE;
        ReleaseCapture();
        m_anim.Stop(); m_anim.Seek(0); // 回到第一幀
    }
    CButton::OnMouseMove(nFlags, point);
}

DrawButton - 3D 按鈕外觀


void CAviButton::DrawButton(CDC* pDC, UINT nState, CRect rc) {
    COLORREF clrHilite = GetSysColor(COLOR_3DHILIGHT);
    COLORREF clrShadow = GetSysColor(COLOR_3DSHADOW);
    COLORREF clrFace   = GetSysColor(COLOR_BTNFACE);

    if (nState & ODS_SELECTED) { // 按下狀態
        pDC->Draw3dRect(rc, clrShadow, clrHilite);
        rc.DeflateRect(1,1);
        pDC->FillSolidRect(rc, clrFace);
    } else { // 正常狀態
        pDC->Draw3dRect(rc, clrHilite, clrShadow);
        rc.DeflateRect(1,1);
        pDC->FillSolidRect(rc, clrFace);
    }
    // 動畫控制項已覆蓋客戶區,此處僅畫邊框
}

資源準備

  1. Insert → Resource → Custom → "AVI" → 選擇 `.avi` 檔案 → ID `IDR_AVI_INTRO`。
  2. AVI 必須符合:無聲音、未壓縮或 RLE 壓縮、調色板固定,否則 `CAnimateCtrl` 無法播放。

對話框初始化


BOOL CMyDlg::OnInitDialog() {
    m_aviBtn.LoadAvi(IDR_AVI_INTRO);
    return TRUE;
}

擴展應用

  • 工具列按鈕:將 `CAnimateCtrl` 建立在 ToolBar 按鈕矩形內。
  • 狀態列面板:播放背景動畫 (如網路傳輸指示燈)。
  • 自訂 `Play(0,-1,-1)` 無限循環播放 (需 `ACS_AUTOPLAY` 風格)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved