北京时间08点43分 2018年12月27号
前面的文章已经完成了界面设计,还有接受文件拖拽,这文章则是完成双击播放列表时播放文件。
首先,在类向导里面添加播放列表双击播放的响应函数。
添加代码:
void CVlcPlayerCsdnDlg::OnDblclkListPlay()
{
int nIndex = m_listPlay.GetCurSel();
if (LB_ERR == nIndex)
{
return;
}
CString strPath;
CRect rcVideo;
GetDlgItem(IDC_PLAY)->GetClientRect(&rcVideo);
InvalidateRect(rcVideo);
m_listPlay.GetText(nIndex, strPath);
if (m_cAVPlayer.Play((LPCSTR)UnicodeToUTF8(strPath)))//解决无法加载中文路径的问题
{
GetDlgItem(IDC_BUTTON_PLAY)->SetWindowText(_T("暂停"));
}
}
UnicodeToUTF8的代码为:
CStringA UnicodeToUTF8(const CStringW& strWide)
{
CStringA strUTF8;
int nLen = ::WideCharToMultiByte(CP_UTF8, 0, strWide, -1, NULL, 0, NULL, NULL);
if (nLen > 1)
{
::WideCharToMultiByte(CP_UTF8, 0, strWide, -1, strUTF8.GetBuffer(nLen - 1), nLen, NULL, NULL);
strUTF8.ReleaseBuffer();
}
return strUTF8;
}
行,现在,拖拽文件后双击播放列表的运行效果为:
好啦,双击播放做完,接下来就是状态条的设置了,播放的时候状态条跟着播放进度前进。
添加自定义处理函数,现在头文件添加定义,再在MESSAGE_MAP消息映射进行绑定,最后进行函数定义。
LRESULT CVlcPlayerCsdnDlg::OnPosChanged(WPARAM wParam, LPARAM lParam)
{
m_slider.SetPos(m_cAVPlayer.GetPos());
CString s;
int min = m_cAVPlayer.GetTime() / 1000 / 60;
int sec = m_cAVPlayer.GetTime() / 1000 % 60;
int min2 = m_cAVPlayer.GetLength() / 1000 / 60;
int sec2 = m_cAVPlayer.GetLength() / 1000 % 60;
s.Format(L"%02d:%02d/%02d:%02d", min, sec, min2, sec2);
GetDlgItem(IDC_STATIC)->SetWindowText(s);
return TRUE;
}
#define WM_USER_POS_CHANGED WM_USER + 1
这样时间轴就可以显示播放进度了。
而且static控件也能够动态显示播放时间。
下面就是如何实现拖拽时间轴进行播放进度的控制,原理还是在类向导添加处理函数,然后实现其处理函数,每一次拖拽进度条后都调用播放类的SetPos(int Pos)函数,从而达到调整的效果。
(==要熄灯了,先睡了)
(==上完课了,回来了)
在对话框的类向导里面添加消息响应函数,在OnHScroll()编写代码;
void CVlcPlayerCsdnDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
m_cAVPlayer.SeekTo((float)m_slider.GetPos());
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
运行一下,现在可以拖动进度条了。
然后,下面的文章将实现怎么实现里面的一些其他按钮,怎么全屏显示。
这次的源码下载地址
注意:1、本人是萌新,大佬们可以直接跳过阅读我的文章,写这个目的就是为了赚点分数以后可以用,当然也是想和其他萌新一起学习。
2、我会尽力快点更新,如果有什么问题大家可以在底下评论,我看到便会回复的,我的个人邮箱[email protected]
3、每一期我都会尽量放上源代码,希望能帮到大家的学习。