程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 讓CButtonST 類支持鼠標掠過時發聲

讓CButtonST 類支持鼠標掠過時發聲

編輯:vc教程

  介紹了一個功能強大的CButton派生類CButtonST,但在使用時我覺得這個類有一點小小的功能“缺陷”。我想大家都有這樣的經驗,有的軟件當鼠標劃過按鈕時,會發出聲音。我對CButtonnST進行了一點改造,使它有了此功能。

  好了,現在就Follow me,Step by step do it。

  首先,建立一個基於對話框的工程 test,然後把原BCMenu.cpp, BCMenu.h, BtnST.cpp, BtnST.h 四個文件加入到工程中。

  接下來我們開始改造CButtonST 類。

  1.打開CButtonST類的頭文件BtnST.h 在它的開始部分加入對多媒體頭文件及庫文件的引用:

#include <mmsystem.h>
#pragma comment(lib,"Winmm.lib")
2.向CButtonST類中添加兩個成員變量和兩個成員函數:
private:
      CString SoundID;
      BOOL m_bPlaySound;
public:
      void PlaySound();
      void SetPlaySound(BOOL bPlaySound,LPCTSTR sID=NULL);
3. 變量的初始化:

  向CButtonST類的構造函數中加入代碼:

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支持了以下功能:

  1. 簡單的發出ding的聲音

  2. 可以播放我們加入工程中的WAVE 資源

  SetPlaySound 使用方法:

  SetPlaySound有兩個參數BOOL bPlaySound和LPCTSTR sID。第一個參數默認為false 也就是按鈕默認鼠標掠過時不發聲。第二個參數默認為NULL。

  將第一個參數設成TRUE,不使用第二個參數時,鼠標掠過按鈕發出Ding 的聲音

  將第一個參數設成TRUE,第二個參數設成WAVE的ID時,鼠標掠過按鈕播放聲

  音

其他說明:

  以上只有當按鈕的SetFlat 屬性為TRUE 時有效

  讓我們測試一下

  測試一:當鼠標掠過按鈕時,按鈕發出ding的聲音:

  1. 在對話框中加入一個Button 控件,修改其屬性:

ID: IDC_DING
Caption: Ding
2. 給按鈕添加相關聯的成員變量:
CButtonST  m_btnDing;
說明:

  添加方法:可以直接在對話框類中添加,也可以用ClassWizard,在Member Variables給按鈕添加一個CButton 的變量,然後再找到相關處,將CButton 改為CButtonST

  3. 在對話框類的 OnInitDialog() 中添加如下代碼:

  

m_btnDing.SetPlaySound(true);
現在編譯後就可以看到結果了,當鼠標掠過按鈕時,會發出DingDing的聲音

  測試二: 當鼠標掠過按鈕時,播放插入工程中的WAVE資源:

  1. 在對話框中加入一個Button 控件,修改其屬性:

ID: IDC_MUSIC
Caption: MUSIC
2. 給按鈕添加相關聯的成員變量:
CButtonST  m_btnMusic;
3. 在對話框類的 OnInitDialog() 中添加如下代碼:
m_btnMusic.SetPlaySound(true,"IDR_WAVE1");
4. 向工程中添加WAVE資源,修改屬性,ID為"IDR_WAVE1" (注意:一定要有引號)

  好了,現在可以編譯看結果了。

本文示例代碼或素材下載

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved