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

方法一: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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
////////////////////////////////////////////////////////////////////// // 使用说明: // 1. 安装VS2008 // 2. 安装OpenCV2.0 // 3. 安装cmake2.8.6 // 4. 通过cmake生成可以被VC++ 2008调用的OpenCV动态库 // 5. 配置Windows环境变量Path,将OpenCV2.0安装后的bin文件夹目录添加入用户变量 // 使得Path=.../bin // (...是OpenCV2.0安装后的program files下的目录全路径) // 6. 打开VC++ 2008,菜单中的工具→选项→项目和解决方案→VC++目录 // 在显示以下内容的目录中, // 先选中可执行文件,加入目录...\bin // 再选中包含文件,加入目录...\include\opencv // 再选中库文件,加入目录...\lib // (...是OpenCV2.0安装后的program files下的目录全路径) // 7. 新建MFC对话框项目VideoPlayer // 然后再在它的属性里去掉更换Unicode的字符集为多字节集 // 配置链接器的输入依赖项cxcore200.lib cv200.lib highgui200.lib // 8. 或者是不进行7的操作,直接将本程序对新建的VideoPlayer对话框项目进行覆盖 // 然后再对其中的VideoPlayer对话框项目配置属性进行修改 ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // 功能说明: // 1. slider控件、Picture控件、打开按钮、播放按钮、暂停按钮、停止按钮 // 2. 实现视频的加载、播放、暂停、停止,以及通过滑动进行视频播放进度的控制 ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // 存在的问题: // 1. 有些视频并不是有多少就多少结尾 // 比如用屏幕录像机录像的avi,比如录了,它有时会丢, // 丢的那个位置,无法用IplImage的图像空间来加载视图,那程序调试就会报错 // 2. 基本的功能都实现了,就缺验证它的执行效率,还有是否会存在内存泄漏 ////////////////////////////////////////////////////////////////////// 解压密码和相关信息参看http://www.cnblogs.com/huangweilin/archive/2012/05/18/2507764.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值