4.最后是自定义类的使用:在主对话框资源添加几控件用于提示效果测试,如我们例程添加有IDC_EDIT1,IDC_WAV ...
97上位机VC MFC提示条提示声音与文本
功能展示
提示条也就是CToolTipCtrl控件,默认情况下只能够简单的提示文本信息,我们当前例程实现了在提示文本的同时提示声音的功能,效果如图; 要点提示 例程播放声音的功能是通过微软自带的函数sndPlaySound()实现,在使用这个函数,我们工程中得添加它所在头文件及库也就是添加两行代码便可#include<mmsystem.h>#pragma comment(lib,“winmm.lib ”);然后我们现提示条位置发生变化时也就是处理WM_WINDOWPOSCHANGED消息函数时播放声音便可 ;
实现功能 1.新建基于对话框的应用程序 2.从CToolTipCtrl派生一个自定义 类class CSoundToolTip : publicCToolTipCtrl;头文件中包含两行代码#include <mmsystem.h>#pragmacomment(lib,“winmm.lib ”);添加变量WORD m_wWaveResourceID;用于保存声音文件ID,及它的设置函数voidSetPopupSound(WORD wResourceID) { m_wWaveResourceID = wResourceID;}再将此变量在构造函数中初始化为0,m_wWaveResourceID = 0;
3.添加WM_WINDOWPOSCHANGED消息处理函数及声音播放函数 - void CSoundToolTip::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
- {
- CToolTipCtrl::OnWindowPosChanged(lpwndpos);
- if (lpwndpos->flags & SWP_SHOWWINDOW)//窗口可见时
- if (m_wWaveResourceID)//声间文件已设置
- PlayResource(m_wWaveResourceID);
- }
- BOOL CSoundToolTip::PlayResource(WORD wResourceID)
- {
- // Get the handle to the current instance of the application
- HINSTANCE hInstance = AfxGetInstanceHandle();
- ASSERT (hInstance != NULL);
- // Find the WAVE resource
- HRSRC hResInfo = FindResource(hInstance, MAKEINTRESOURCE(wResourceID), _T("WAVE"));
- if(hResInfo == NULL)
- return FALSE;
复制代码- // Load the WAVE resource
- HANDLE hRes = LoadResource(hInstance, hResInfo);
- if (hRes == NULL)
- return FALSE;
- // Lock the WAVE resource and play it
- LPSTR lpRes = (LPSTR) LockResource(hRes);
- if(lpRes==NULL)
- return FALSE;
- if (sndPlaySound(lpRes, SND_MEMORY | SND_ASYNC) == NULL)
- return FALSE;
- // Free the WAVE resource and return success or failure.
- FreeResource(hRes);
- return TRUE;
- }
复制代码4.最后是自定义类的使用:在主对话框资源添加几控件用于提示效果测试,如我们例程添加有IDC_EDIT1,IDC_WAVE1IDC_WAVE2,IDC_SLIDER1;再添加 变量 CSoundToolTip m_ToolTip;在OnInitDialog()中初始化 m_ToolTip.Create(this);//创建 m_ToolTip.SetPopupSound(IDR_TOOLTIP_SOUND1);//设置声音 m_ToolTip.AddTool(GetDlgItem(IDC_WAVE1),"");//添加有提示文本的控件 m_ToolTip.AddTool(GetDlgItem(IDC_WAVE2),""); m_ToolTip.AddTool(GetDlgItem(IDC_EDIT1), "");m_ToolTip.AddTool(GetDlgItem(IDC_SLIDER1), ""); 在PreTranslateMessage()函数中调用RelayEvent()函数及添加提示文本 if(pMsg->message== WM_MOUSEMOVE) { m_ToolTip.RelayEvent(pMsg);//处理鼠标相关消息 m_ToolTip.UpdateTipText("文本框提示文本测试",GetDlgItem(IDC_EDIT1)); m_ToolTip.UpdateTipText("按钮提示文本测试",GetDlgItem(IDC_WAVE1)); m_ToolTip.UpdateTipText("按钮提示文本测试",GetDlgItem(IDC_WAVE2)); m_ToolTip.UpdateTipText("滑块提示文本测试",GetDlgItem(IDC_SLIDER1)); }
我们来演示下功能实现的整个过程
|