滑鼠移入按鈕區域 → 自動播放 AVI 動畫 (如齒輪轉動、箭頭脈動) → 滑鼠移出 → 停止並顯示第一幀。適用於遊戲選單、3D 軟體工具列。
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()
};
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); // 繪製按鈕邊框/背景
}
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);
}
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);
}
// 動畫控制項已覆蓋客戶區,此處僅畫邊框
}
BOOL CMyDlg::OnInitDialog() {
m_aviBtn.LoadAvi(IDR_AVI_INTRO);
return TRUE;
}