工具列 (CToolBar) 本質是控制列 (CControlBar),可包含非按鈕子視窗。利用 CAnimateCtrl (封裝 SysAnimate32 通用控制項) 播放無聲 AVI 動畫,增加視覺回饋 (如處理中、連線狀態)。
Open 而非 Open 檔案路徑)。
class CMainFrame : public CFrameWnd {
// ...
BOOL m_bAnimationActive; // 播放狀態旗標
CAnimateCtrl m_wndAnimate; // 動畫控制項
// ...
};
CMainFrame::CMainFrame() : m_bAnimationActive(TRUE) {}
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;
}
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); // 可選:隱藏佔位
}
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 關鍵樣式| 樣式 | 說明 |
|---|---|
| ACS_CENTER | 動畫置中於控制項矩形 |
| ACS_AUTOPLAY | Open 後自動播放 |
| ACS_TIMER | 使用內建定時器執行緒播放 (不阻塞 UI) |
| ACS_TRANSPARENT | 透明背景 (需視窗支援 WS_EX_TRANSPARENT) |