一个MP3播放器,现在我要让另一个程序能够控制它(通过发消息)播放器界面上有一个Pause按钮,映射到 OnButtonPause函数.所以,我在接收到上面定义的消息后,直接
调用OnButtonPause. 但是,这么做后界面上的按钮是表现正确(从Pause切换到Play,因为play和pause共用一个按钮),但是歌曲却还在放,歌曲的播放进度条也没有停下来.
然后我在调用OnButtonPause后,再调用一个AfxMessgaeBox随便弹了个对话框,这下就能正确运行了....但是,我不可能为了解决这个问题而每次都去弹对话框啊??!!!请教高手,问题出在哪里? 该怎么解决?
调用OnButtonPause. 但是,这么做后界面上的按钮是表现正确(从Pause切换到Play,因为play和pause共用一个按钮),但是歌曲却还在放,歌曲的播放进度条也没有停下来.
然后我在调用OnButtonPause后,再调用一个AfxMessgaeBox随便弹了个对话框,这下就能正确运行了....但是,我不可能为了解决这个问题而每次都去弹对话框啊??!!!请教高手,问题出在哪里? 该怎么解决?
{ if(!m_Playctrl)return;
m_Playctrl->OnPause();
// AfxMessageBox(L"Pause");
}
程序是执行到了这里的,把上面的注释去掉就能够表现正确. m_Playctrl的定义:IPlayCtrl *m_Playctrl;IPlayCtrl的声明:
struct IPlayCtrl
{
enum{T_Remove,T_Search,T_AddAll};
enum{STG_HDD,STG_SDMMC,STG_SCARD,STG_COUNT=STG_SCARD}; virtual BOOL InitMain(IPlayUI*,IMainUI*,HWND) PURE;
virtual void SetFileList(IFileList* pFileList) PURE;
virtual void OnTimer() PURE;
virtual void SetHide(UINT nInterval) PURE;
virtual void PlayCurFile() PURE;
virtual void ReadyForPlay() PURE; virtual void OnPause() PURE;
virtual void OnPrev(int nCount=1) PURE;
virtual void OnPlay() PURE;
virtual void OnNext(int nCount=1) PURE;
virtual void OnStop(BOOL) PURE;
virtual void OnMinimize() PURE;
virtual void OnQuit() PURE;
virtual void OnPosMoving(LONG) PURE;
virtual void OnVolMoving(LONG) PURE;
virtual void OnPosMoved(LONG) PURE;
virtual void OnVolMoved(LONG) PURE;
virtual void OnRepeating(UINT wParam) PURE;
virtual void OnRepeated(UINT wParam) PURE;
virtual BOOL OnKeyDown(UINT wParam) PURE;
virtual BOOL OnKeyUp(UINT wParam) PURE; virtual LRESULT OnGraphNotify(BOOL bLooping) PURE;
virtual LRESULT OnAutoStopped() PURE;
virtual LRESULT OnHotKey(UINT) PURE;
virtual LRESULT OnActivate(UINT) PURE;
virtual BOOL IsShow(int nIndex)PURE;
virtual BOOL IsReady() PURE; virtual void SetTitle(LPCTSTR) PURE;
virtual void SetLabelText(LPCTSTR,LPCTSTR,LPCTSTR) PURE; virtual void ReleaseStorage(int nStgIndex) PURE;
virtual void RefreshStorage(int nStgIndex) PURE;
virtual void SetCurManager(UINT nStgIndex) PURE;
virtual UINT NextManager() PURE;
virtual MediaFileManager *GetCurManager() PURE;
};
::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);
或者
::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),WM_LBUTTONDOWN,0,0);
::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),WM_LBUTTONUP,0,0);
都是跟直接调用OnButtonPause表现一样,而歌曲还是没有停下来
::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BST_FOCUS,0,0);
Sleep(100) ;???
是不是m_Playctrl->OnPause();里的问题呢?
::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);
Sleep(100) ;播放的声音暂停了一下然后又继续播放.但是如果只用AfxMessage,而不用::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);的话,对话框弹出来的时候,声音是不会有停顿的,看来Sleep(100)不能模仿AfxMessageBox
::SendMessage(GetDlgItem(IDC_BUTTON_PAUSE)->GetSafeHwnd(),BM_CLICK,0,0);
或者OnBtnPause都是在PreTranslateMessage里面做的