闪屏振动的原理其实很简单,创建一个线程,在线程中MoveWindow或SetWindowPos即可。
核心代码:
#include "mmsystem.h"
#pragma comment(lib,"winmm.lib")
UINT ShakeThread(LPVOID pParam);
int m_nXStrength(5),m_nYStrength(5);
void CShakeDlg::OnButton1() //点击后即可振动
{
AfxBeginThread(ShakeThread,
this,
THREAD_PRIORITY_NORMAL,
0,0,NULL);
}
UINT ShakeThread(LPVOID pParam)
{
CShakeDlg *pDlg = (CShakeDlg *)pParam;
::srand (::GetTickCount());//初始化随机数发生器
CRect rect;
GetWindowRect(AfxGetMainWnd()->m_hWnd,&rect);
// GetClientRect(AfxGetMainWnd()->m_hWnd,&rect);
::PlaySound ("Shake.wav",NULL,SND_FILENAME |SND_ASYNC );//播放音乐
for(int i=39;i>=0;i--){
int x=pDlg->GetSign()*rand()%m_nXStrength*i/10+rect.left;
int y=pDlg->GetSign()*rand()%m_nXStrength*i/10+rect.top;
::SetWindowPos(AfxGetMainWnd()->m_hWnd,0,x,//振动效果
y,0,0,SWP_NOSIZE|SWP_NOREPOSITION );
::Sleep (20);
}
::SetWindowPos(AfxGetMainWnd()->m_hWnd,0,rect.left,
rect.top,0,0,SWP_NOSIZE|SWP_NOREPOSITION );//还原原来的位置
return 0;
}
示例工程已上传。