⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timelinedlg.cpp

📁 VC++视频开发实例集锦(包括“远程视频监控”"语音识别系统"等13个经典例子)
💻 CPP
字号:
// TimelineDlg.cpp : implementation file
//

#include "stdafx.h"
#include "XvidQuantsParser.h"
#include "TimelineDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTimelineDlg dialog


CTimelineDlg::CTimelineDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTimelineDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTimelineDlg)
	m_left = 0;
	m_right = 0;
	m_maxql = 0;
	m_maxqr = 0;
	m_minql = 0;
	m_minqr = 0;
	m_maxfsl = 0;
	m_maxfsr = 0;
	m_minfsl = 0;
	m_minfsr = 0;
	//}}AFX_DATA_INIT

	qarray = NULL;
}

void CTimelineDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTimelineDlg)
	DDX_Control(pDX, IDC_COMBO_MAXQUANT, m_maxquant);
	DDX_Control(pDX, IDC_COMBO_SCALE, m_scale);
	DDX_Control(pDX, IDC_SCROLL_QUANTS, m_scroll);
	DDX_Control(pDX, IDC_GRAPH_TIMELINE, m_graph);
	DDX_Text(pDX, IDC_EDIT_LEFT, m_left);
	DDX_Text(pDX, IDC_EDIT_RIGHT, m_right);
	DDX_Text(pDX, IDC_EDIT_MAXQL, m_maxql);
	DDX_Text(pDX, IDC_EDIT_MAXQR, m_maxqr);
	DDX_Text(pDX, IDC_EDIT_MINQL, m_minql);
	DDX_Text(pDX, IDC_EDIT_MINQR, m_minqr);
	DDX_Text(pDX, IDC_EDIT_MAXFSL, m_maxfsl);
	DDX_Text(pDX, IDC_EDIT_MAXFSR, m_maxfsr);
	DDX_Text(pDX, IDC_EDIT_MINFSL, m_minfsl);
	DDX_Text(pDX, IDC_EDIT_MINFSR, m_minfsr);
	DDX_Control(pDX, IDC_GRAPH_FRAMESIZE, m_graphfs);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTimelineDlg, CDialog)
	//{{AFX_MSG_MAP(CTimelineDlg)
	ON_WM_HSCROLL()
	ON_CBN_SELCHANGE(IDC_COMBO_SCALE, OnSelchangeComboScale)
	ON_CBN_SELCHANGE(IDC_COMBO_MAXQUANT, OnSelchangeComboMaxquant)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTimelineDlg message handlers

//----------------------------------------------------------------------------------------------
void CTimelineDlg::Init(CXvid::QUANTS *quants, int nframes, int maxq, int maxfs)
{
	nelem	= nframes;
	qarray	= quants;
	qmax	= maxq;
	fsmax	= maxfs;
}

//----------------------------------------------------------------------------------------------
BOOL CTimelineDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	scaleIsSet	= false;
	maxIsSet	= false;

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

//----------------------------------------------------------------------------------------------
void CTimelineDlg::OnSelchangeComboScale() 
{
	scaleIsSet = true;
	CString selected;

	UpdateData(TRUE);
	m_scale.GetLBText(m_scale.GetCurSel(), selected);
	scale = atoi(selected);
	InitScroll(0, nelem-scale, m_left, (int)(nelem/1400), (int)(nelem/140));
	m_right = m_left + scale;
	if (scaleIsSet && maxIsSet)
	{
		InitGraph(scale, maxquant);
		DrawTimeline(m_left);
	}
	UpdateData(FALSE);
}

//----------------------------------------------------------------------------------------------
void CTimelineDlg::OnSelchangeComboMaxquant() 
{
	maxIsSet = true;
	CString selected;

	UpdateData(TRUE);
	m_maxquant.GetLBText(m_maxquant.GetCurSel(), selected);
	if (selected == "Auto") maxquant = qmax;
	else maxquant = atoi(selected);
	if (scaleIsSet && maxIsSet)
	{
		InitGraph(scale, maxquant);
		DrawTimeline(m_left);
	}
	UpdateData(FALSE);
}

//----------------------------------------------------------------------------------------------
void CTimelineDlg::InitGraph(int s, int mq)
{
	m_graph.SetScale(0, 0, s, mq-1);
	m_graphfs.SetScale(0, 0, s, fsmax);
	m_minfsl = 0;
	m_minfsr = 0;
	m_maxfsl = fsmax;
	m_maxfsr = fsmax;
	m_minql  = 2;
	m_minqr  = 2;
	m_maxql  = maxquant;
	m_maxqr  = maxquant;

	UpdateData(FALSE);
}

//----------------------------------------------------------------------------------------------
void CTimelineDlg::InitScroll(int minu, int maxu, int posu, int smallc, int largec)
{
	min=0;max=10000;

	umin = minu;
	umax = maxu;
	upos = posu;

	pos		= (int)(min+(max-min)*(upos-umin)/(umax-umin));
	schange = (int)((max-min)*(smallc)/(umax-umin));
	lchange	= (int)((max-min)*(largec)/(umax-umin));

	m_scroll.SetScrollRange(min, max);
	m_scroll.SetScrollPos(pos);
}

//----------------------------------------------------------------------------------------------
void CTimelineDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int pos = pScrollBar->GetScrollPos();

	if (scaleIsSet && maxIsSet)
	{
		switch (nSBCode)
		{
			case SB_LINELEFT:		pos -= schange;break;
			case SB_PAGELEFT:		pos -= lchange;break;

			case SB_LINERIGHT:		pos += schange;break;
			case SB_PAGERIGHT:		pos += lchange;break;

			case SB_THUMBTRACK:		pos=nPos;
			case SB_THUMBPOSITION:	pos=nPos;
		}
		if (pos>max) pos = max;
		if (pos<min) pos = min;

		upos = umin + (umax-umin)*(double)((pos-min)/(max-min));

		pScrollBar->SetScrollPos(pos);
		m_left = (int)(pos*(umax/max));
		m_right= m_left + scale;

		DrawTimeline(m_left);
		UpdateData(FALSE);
	}
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

//----------------------------------------------------------------------------------------------
void CTimelineDlg::DrawTimeline(int uscrollpos)
{
	int sp = uscrollpos;

	m_graph.Clear();
	m_graphfs.Clear();

	//Gray lines for making scaling more "visual"
	m_graph.SetForeColor(RGB(175,175,175));
	for (int j=1; j<maxquant; j++)
	{
		m_graph.DrawLine(1,j,scale-1,j);
	}

	for (int i=sp; i<sp+scale; i++)
	{
		if (i < nelem)
		{
			if (qarray[i].isIFrame)
			{
				m_graph.SetForeColor(RGB(0,0,255));	//Blue (I-Frames)
				m_graphfs.SetForeColor(RGB(255,0,0));
			}
			else
			{
				m_graphfs.SetForeColor(RGB(0,0,255));
				SetColor(qarray[i].qvalue);
			}
			m_graph.DrawLine(i-sp, 0, i-sp, qarray[i].qvalue-1);
			m_graphfs.DrawLine(i-sp, 0, i-sp, qarray[i].framesize);
		}
	}
}

//----------------------------------------------------------------------------------------------
void CTimelineDlg::SetColor(int qvalue)
{

	if (qvalue == 2)
	{
		m_graph.SetForeColor(RGB(0,255,0));		//Light green	(Q:2);
	}

	if (qvalue > 2 && qvalue < 6)
	{
		m_graph.SetForeColor(RGB(0,127,0));		//Darker green	(Q:3-Q:5)
	}

	if (qvalue >= 6 && qvalue <10)
	{
		m_graph.SetForeColor(RGB(255,255,0));	//Yellow		(Q:6-Q:9)
	}
	
	if (qvalue >= 10)
	{
		m_graph.SetForeColor(RGB(255,0,0));		//Red			(Q:10+)
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -