分类:
2008-10-13 16:08:53
让CButtonST 类支持鼠标掠过时发声
作者:
介绍了一个功能强大的CButton派生类CButtonST,但在使用时我觉得这个类有一点小小的功能“缺陷”。我想大家都有这样的经验,有的软件当鼠标划过按钮时,会发出声音。我对CButtonnST进行了一点改造,使它有了此功能。
好了,现在就Follow me,Step by step do it。
首先,建立一个基于对话框的工程 test,然后把原BCMenu.cpp, BCMenu.h, BtnST.cpp, BtnST.h 四个文件加入到工程中。
接下来我们开始改造CButtonST 类。
1.打开CButtonST类的头文件BtnST.h
在它的开始部分加入对多媒体头文件及库文件的引用:
#include2.向CButtonST类中添加两个成员变量和两个成员函数:#pragma comment(lib,"Winmm.lib")
private: CString SoundID; BOOL m_bPlaySound; public: void PlaySound(); void SetPlaySound(BOOL bPlaySound,LPCTSTR sID=NULL);3. 变量的初始化:
m_bPlaySound=false; SoundID="";4.PlaySound(),SetPlaySound 函数的代码如下:
void CButtonST::PlaySound() { if(!m_bPlaySound) return; if(SoundID=="") { MessageBeep(-1); return; } else { CString sID="IDR_WAVE1"; HINSTANCE h=AfxGetInstanceHandle(); HRSRC hr=FindResource(h,sID,"WAVE"); HGLOBAL hg=LoadResource(h,hr); LPSTR lp=(LPSTR)LockResource(hg); ////sndPlaySound(lp,SND_MEMORY|SND_SYNC); sndPlaySound(lp,SND_MEMORY|SND_ASYNC); FreeResource(hg); } } void CButtonST::SetPlaySound(BOOL bPlaySound, LPCTSTR sID) { m_bPlaySound=bPlaySound; SoundID=sID; }5.在CButtonST的OnMouseMove函数的最后一个if语句的嵌套中加入一句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(); //此句为我们添加的 } // if } else CancelHover();好了现在我们的CButtonST 类就改造完成了!现在的CButtonST支持了以下功能:
SetPlaySound 使用方法:
SetPlaySound有两个参数BOOL bPlaySound和LPCTSTR sID。第一个参数默认为false 也就是按钮默认鼠标掠过时不发声。第二个参数默认为NULL。
将第一个参数设成TRUE,不使用第二个参数时,鼠标掠过按钮发出Ding 的声音
将第一个参数设成TRUE,第二个参数设成WAVE的ID时,鼠标掠过按钮播放声
音
ID: IDC_DING Caption: Ding2. 给按钮添加相关联的成员变量:
CButtonST m_btnDing;说明:
m_btnDing.SetPlaySound(true);现在编译后就可以看到结果了,当鼠标掠过按钮时,会发出DingDing的声音
ID: IDC_MUSIC Caption: MUSIC2. 给按钮添加相关联的成员变量:
CButtonST m_btnMusic;3. 在对话框类的 OnInitDialog() 中添加如下代码:
m_btnMusic.SetPlaySound(true,"IDR_WAVE1");4. 向工程中添加WAVE资源,修改属性,ID为"IDR_WAVE1" (注意:一定要有引号)