记:MFC+Opencv 利用Slider和ScrollBar控制显示视频的某一位置帧

逄俊力
2023-12-01

方法一:Slider

1.对话框点工具箱,将Slider拖到界面,并为其设置变量m_slider。

2.在OnInitDialog中增添初始化为:

GetDlgItem( IDC_SLIDER1 )->EnableWindow( FALSE );//用来控制界面显示不显示滑动条,可以在不使用时关闭。
m_slider.SetRange(0,100);
m_slider.SetTicFreq(10);

3.在类向导中找到消息找到WM_HSCROLL消息,并为其添加处理程序。

void CProject_twoDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
	{
		// TODO: 在此添加消息处理程序代码和/或调用默认值
		int pos = m_slider.GetPos();
		CString str;
		str.Format(_T("滑动条位置为:%d"),pos);
		m_StatusBar.SetPaneText(0,str,true);
		// 设置滚动块位置
		//m_slider.SetPos(pos);

		if(cap0.isOpened()&& cap45.isOpened()&& cap90.isOpened())
		{
			double testFrame=pos*frameCount/100.0;//frameCount为视频总帧数
			cap0.set(CV_CAP_PROP_POS_FRAMES,testFrame);
			cap45.set(CV_CAP_PROP_POS_FRAMES,testFrame);
			cap90.set(CV_CAP_PROP_POS_FRAMES,testFrame);
		}
		CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
	}

于是便可以在滑动条实现跳帧播放。

方法二:ScrollBar原理跟Slider类似,只是在工具箱中要拖出来ScrollBar,初始代码跟位置获取方法如下:

 m_horiScrollbar.SetScrollRange(1, 100);
    // 设置水平滚动条的初始位置为20
    m_horiScrollbar.SetScrollPos(20);
    // 在编辑框中显示20
    SetDlgItemInt(IDC_EDIT, 20);


void CTrackBARDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	// 获取水平滚动条当前位置
    int pos = m_horiScrollbar.GetScrollPos();
 
    switch (nSBCode)
    {
    // 如果向左滚动一列,则pos减1
    case SB_LINELEFT:
        pos -= 1;
        break;
    // 如果向右滚动一列,则pos加1
    case SB_LINERIGHT:
        pos += 1;
        break;
    // 如果向左滚动一页,则pos减10
    case SB_PAGELEFT:
        pos -= 10;
        break;
    // 如果向右滚动一页,则pos加10
    case SB_PAGERIGHT:
        pos += 10;
        break;
    // 如果滚动到最左端,则pos为1
    case SB_LEFT:
        pos = 1;
        break;
    // 如果滚动到最右端,则pos为100
    case SB_RIGHT:
        pos = 100;
        break;
    // 如果拖动滚动块到指定位置,则pos赋值为nPos的值
    case SB_THUMBPOSITION:
        pos = nPos;
        break;
    // 下面的m_horiScrollbar.SetScrollPos(pos);执行时
    // 会第二次进入此函数,最终确定滚动块位置,并且会
    // 直接到default分支,所以在此处设置编辑框中显示数值
    default:
        SetDlgItemInt(IDC_EDIT, pos);
        return;
    }
 
    // 设置滚动块位置
    m_horiScrollbar.SetScrollPos(pos);

	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

 

 类似资料: