記: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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章