CButtonST 功能強大,但缺少「滑入播放聲音」特效。本文示範如何擴充該類,支援預設提示音與自訂 WAVE 資源。
BCMenu.h/.cpp、BtnST.h/.cpp。BtnST.h:#include #pragma comment(lib, "Winmm.lib")private:
CString m_soundID;
BOOL m_bPlaySound;
public:
void PlaySound();
void SetPlaySound(BOOL bPlaySound, LPCTSTR sID = NULL);BtnST.cpp:m_bPlaySound = FALSE; m_soundID = _T("");void CButtonST::PlaySound()
{
if (!m_bPlaySound) return;
if (m_soundID.IsEmpty())
{
MessageBeep(-1); // 預設提示音
return;
}
HINSTANCE hInst = AfxGetInstanceHandle();
HRSRC hRes = FindResource(hInst, m_soundID, _T("WAVE"));
HGLOBAL hGlob = LoadResource(hInst, hRes);
LPSTR lpData = (LPSTR)LockResource(hGlob);
sndPlaySound(lpData, SND_MEMORY | SND_ASYNC);
FreeResource(hGlob);
}
void CButtonST::SetPlaySound(BOOL bPlaySound, LPCTSTR sID)
{
m_bPlaySound = bPlaySound;
m_soundID = sID ? sID : _T("");
}OnMouseMove 觸發懸停時呼叫 PlaySound():if (wndUnderMouse && wndUnderMouse->m_hWnd == m_hWnd && wndActive)
{
if (!m_bMouseOnButton)
{
m_bMouseOnButton = TRUE;
Invalidate();
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_LEAVE;
csTME.hwndTrack = m_hWnd;
::_TrackMouseEvent(&csTME);
PlaySound(); // 新增行
}
}
else CancelHover();// 對話框 OnInitDialog
m_btnDing.SetPlaySound(TRUE); // 僅啟用,不指定資源
IDR_WAVE1(含引號)。m_btnMusic.SetPlaySound(TRUE, _T("IDR_WAVE1"));編譯運行,滑過按鈕即可聽見聲音。注意:僅在 SetFlat(TRUE) 時生效。
微小改動即賦予按鈕聽覺回饋,提升介面互動體驗。同理可擴充點擊音效、長按音效等。