📄 emlplayerdlg.cpp
字号:
{
// TODO: Add your control notification handler code here
m_Complete = TRUE;
m_Start = FALSE;
return;
}
BOOL CEMLplayerDlg::OpenCOM(void)
{
// TODO: Add your control notification handler code here
//打开串口
if (!m_ceSeries.OpenPort(this, m_portNo, m_baud, m_parity, m_databits, m_stopbits))
{
AfxMessageBox(L"Open COM failed!");
return FALSE;
}
else //打开成功的话,将关闭按钮和发送按钮置为可用
{
//m_strConFlag = _T(" Connected");
//this->UpdateData(FALSE);
//IPicture *pPic = (IPicture*)GetDlgItem(IDC_SCOMSTATE);
//CWnd *pWnd = GetDlgItem(IDC_SCOMSTATE);
//pWnd->SetIcon(::LoadIcon(NULL,(const unsigned short *)"res\\connection.ico"),FALSE);
CString name = "COM Conneted!";
this->SetWindowText(name);
m_ConnFlag = TRUE;
m_hReadCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
//创建读串口线程
//m_hReadThread = CreateThread(NULL,0,ReadThreadFunc,this,0,&m_dwReadThreadID);
}
return TRUE;
}
void CEMLplayerDlg::CloseCOM(void)
{
if (m_ConnFlag==TRUE)
{
//关闭串口
m_ceSeries.ClosePort();
m_strConFlag = _T(" No Connected");
this->UpdateData(FALSE);
//关闭读线程
CloseReadThread();
}
m_ConnFlag = FALSE;
}
//串口读线程函数
DWORD CEMLplayerDlg::ReadThreadFunc(LPVOID lparam)
{
CEMLplayerDlg *pDlg = (CEMLplayerDlg *)lparam;
CCESeries *ceSeries = &(pDlg->m_ceSeries);
BYTE * readBuf = NULL;//读取的字节
DWORD actualReadLen=0;//实际读取的字节数
BOOL bRState=FALSE;
CEdit * pEdit;
pEdit = (CEdit *)pDlg->GetDlgItem(IDC_EDTRECV);
//while ( ceSeries->m_hComm!=INVALID_HANDLE_VALUE )
while ( 1 )
{
readBuf = new BYTE[512];
ceSeries->ReadPort(ceSeries->m_hComm, readBuf, &actualReadLen);
if(!bRState)
{
AfxMessageBox(CString("无法从串口读取数据!"));
}
else
{
//如果读取的数据大于0,
if (actualReadLen>0)
{
//触发读取回调函数
char aucBuf[255];
memcpy( aucBuf, readBuf, actualReadLen);
aucBuf[actualReadLen] = '\0';
CString strRecv;
strRecv = aucBuf;
strRecv = pDlg->m_strRecv+aucBuf;
pDlg->m_strRecv = strRecv;
pDlg->SetDlgItemText( IDC_EDTRECV, strRecv );
}
}
delete[] readBuf;
}
return 0;
}
//关闭读线程
void CEMLplayerDlg::CloseReadThread(void)
{
CCESeries *ceSeries = &m_ceSeries;
SetEvent(m_hReadCloseEvent);
//设置所有事件无效无效
SetCommMask(ceSeries->m_hComm, 0);
//清空所有将要读的数据
PurgeComm( ceSeries->m_hComm, PURGE_RXCLEAR );
//等待10秒,如果读线程没有退出,则强制退出
if (WaitForSingleObject(m_hReadThread,10000) == WAIT_TIMEOUT)
{
TerminateThread(m_hReadThread,0);
}
m_hReadThread = NULL;
}
//播放线程函数
DWORD PlayThreadFunc(LPVOID lparam)
{
HRESULT hr = S_OK;
CButton *pButton;
CEMLplayerDlg *pDlg = (CEMLplayerDlg *)lparam;
// TODO: Add your control notification handler code here
// Get COM interfaces
CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(pDlg->GetInterfaces()))
{
CoUninitialize();
return -1;
}
// Now play the movie
pDlg->PlayMedia();
pButton = (CButton*)pDlg->GetDlgItem(IDC_OPEN);
pButton->EnableWindow(FALSE);
pButton = (CButton*)pDlg->GetDlgItem(IDC_PLAY);
pButton->EnableWindow(FALSE);
pButton = (CButton*)pDlg->GetDlgItem(IDC_STOP);
pButton->EnableWindow(TRUE);
pButton = (CButton*)pDlg->GetDlgItem(IDC_STEP);
pButton->EnableWindow(TRUE);
pDlg->ProcessEventLoop();
pDlg->OnStop1();
if (FAILED(hr))
{
return hr;
}
pButton = (CButton*)pDlg->GetDlgItem(IDC_STOP);
pButton->EnableWindow(FALSE);
pButton = (CButton*)pDlg->GetDlgItem(IDC_STEP);
pButton->EnableWindow(FALSE);
pButton = (CButton*)pDlg->GetDlgItem(IDC_OPEN);
pButton->EnableWindow(TRUE);
pButton = (CButton*)pDlg->GetDlgItem(IDC_PLAY);
pButton->EnableWindow(TRUE);
// Release COM interfaces
pDlg->CleanupInterfaces();
CoUninitialize();
return 0;
}
void CEMLplayerDlg::OnRun(void)
{
HRESULT hr = S_OK;
// Start playback
hr = pMC->Run();
if (SUCCEEDED(hr))
{
long evCode;
pME->WaitForCompletion(0,&evCode);
}
}
void CEMLplayerDlg::OnStop1(void)
{
HRESULT hr = S_OK;
pMC->Stop();
if (SUCCEEDED(hr))
{
}
}
//关闭读线程
void CEMLplayerDlg::ClosePlayThread(void)
{
if (WaitForSingleObject(m_hPlayThread,10000) == WAIT_TIMEOUT)
{
TerminateThread(m_hPlayThread,0);
}
m_hPlayThread = NULL;
}
void CEMLplayerDlg::ProcessEventLoop(void)
{
HRESULT hr;
BOOL bSleep=TRUE;
TCHAR buf[256];
// Continue
while (!m_Complete)
{
LONGLONG pos=0;
long lEventCode, lParam1, lParam2;
// Reset sleep flag
bSleep = TRUE;
// Has there been a media event? Look for end of stream condition.
if(E_ABORT != pME->GetEvent(&lEventCode, &lParam1, &lParam2, 0))
{
// Free the media event resources.
hr = pME->FreeEventParams(lEventCode, lParam1, lParam2);
if (FAILED(hr))
{
wsprintf(buf, TEXT("Failed(%08lx) in FreeEventParams!\r\n"),
hr);
MessageBox(buf,_T("INFO"), MB_OK);
}
// Is this the end of the movie?
if (lEventCode == EC_COMPLETE)
{
// If user wants continuous looping, reset and continue
if (1)
{
// Reset to first frame of movie
hr = pMS->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
NULL, AM_SEEKING_NoPositioning);
if (FAILED(hr))
{
// Some filters (like MIDI) may not implement interfaces
// for IMediaSeeking to allow seek to the start. In that
// case, just stop and restart for the same effect.
hr = pMC->Stop();
if (FAILED(hr))
{
wsprintf(buf, TEXT("Failed(%08lx) in Stop!\r\n"),
hr);
MessageBox(buf, _T("INFO"), MB_OK);
}
hr = pMC->Run();
if (FAILED(hr))
{
wsprintf(buf, TEXT("Failed(%08lx) in Run!\r\n"),
hr);
MessageBox(buf, _T("INFO"), MB_OK);
}
}
// Don't sleep if we're resetting clip (for faster restart)
bSleep = FALSE;
}
}
if (1)
DisplayECEvent(lEventCode, lParam1, lParam2);
}
// Give system threads time to run (and don't sample user input madly)
//if (bSleep)
// Sleep(SAMPLE_FREQ);
}
}
void CEMLplayerDlg::DisplayECEvent(long lEventCode, long lParam1, long lParam2)
{
switch (lEventCode)
{
HANDLE_EC(EC_COMPLETE);
HANDLE_EC(EC_USERABORT);
HANDLE_EC(EC_ERRORABORT);
HANDLE_EC(EC_TIME);
HANDLE_EC(EC_REPAINT);
HANDLE_EC(EC_STREAM_ERROR_STOPPED);
HANDLE_EC(EC_STREAM_ERROR_STILLPLAYING);
HANDLE_EC(EC_ERROR_STILLPLAYING);
HANDLE_EC(EC_PALETTE_CHANGED);
HANDLE_EC(EC_VIDEO_SIZE_CHANGED);
HANDLE_EC(EC_QUALITY_CHANGE);
HANDLE_EC(EC_SHUTTING_DOWN);
HANDLE_EC(EC_CLOCK_CHANGED);
HANDLE_EC(EC_PAUSED);
HANDLE_EC(EC_OPENING_FILE);
HANDLE_EC(EC_BUFFERING_DATA);
HANDLE_EC(EC_FULLSCREEN_LOST);
HANDLE_EC(EC_ACTIVATE);
HANDLE_EC(EC_NEED_RESTART);
HANDLE_EC(EC_WINDOW_DESTROYED);
HANDLE_EC(EC_DISPLAY_CHANGED);
HANDLE_EC(EC_STARVATION);
HANDLE_EC(EC_OLE_EVENT);
HANDLE_EC(EC_NOTIFY_WINDOW);
HANDLE_EC(EC_STREAM_CONTROL_STOPPED);
HANDLE_EC(EC_STREAM_CONTROL_STARTED);
HANDLE_EC(EC_END_OF_SEGMENT);
HANDLE_EC(EC_SEGMENT_STARTED);
HANDLE_EC(EC_LENGTH_CHANGED);
HANDLE_EC(EC_TIMECODE_AVAILABLE);
HANDLE_EC(EC_EXTDEVICE_MODE_CHANGE);
HANDLE_EC(EC_VCD_SELECT);
HANDLE_EC(EC_VCD_PLAY);
HANDLE_EC(EC_VCD_END);
default:
// RETAILMSG(1, (TEXT(" Received unknown event code (0x%x)\r\n"), lEventCode));
break;
}
}
LRESULT CEMLplayerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::DefWindowProc(message, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -