TimelineDlg.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // TimelineDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "XvidQuantsParser.h"
  5. #include "TimelineDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CTimelineDlg dialog
  13. CTimelineDlg::CTimelineDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CTimelineDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CTimelineDlg)
  17. m_left = 0;
  18. m_right = 0;
  19. m_maxql = 0;
  20. m_maxqr = 0;
  21. m_minql = 0;
  22. m_minqr = 0;
  23. m_maxfsl = 0;
  24. m_maxfsr = 0;
  25. m_minfsl = 0;
  26. m_minfsr = 0;
  27. //}}AFX_DATA_INIT
  28. qarray = NULL;
  29. }
  30. void CTimelineDlg::DoDataExchange(CDataExchange* pDX)
  31. {
  32. CDialog::DoDataExchange(pDX);
  33. //{{AFX_DATA_MAP(CTimelineDlg)
  34. DDX_Control(pDX, IDC_COMBO_MAXQUANT, m_maxquant);
  35. DDX_Control(pDX, IDC_COMBO_SCALE, m_scale);
  36. DDX_Control(pDX, IDC_SCROLL_QUANTS, m_scroll);
  37. DDX_Control(pDX, IDC_GRAPH_TIMELINE, m_graph);
  38. DDX_Text(pDX, IDC_EDIT_LEFT, m_left);
  39. DDX_Text(pDX, IDC_EDIT_RIGHT, m_right);
  40. DDX_Text(pDX, IDC_EDIT_MAXQL, m_maxql);
  41. DDX_Text(pDX, IDC_EDIT_MAXQR, m_maxqr);
  42. DDX_Text(pDX, IDC_EDIT_MINQL, m_minql);
  43. DDX_Text(pDX, IDC_EDIT_MINQR, m_minqr);
  44. DDX_Text(pDX, IDC_EDIT_MAXFSL, m_maxfsl);
  45. DDX_Text(pDX, IDC_EDIT_MAXFSR, m_maxfsr);
  46. DDX_Text(pDX, IDC_EDIT_MINFSL, m_minfsl);
  47. DDX_Text(pDX, IDC_EDIT_MINFSR, m_minfsr);
  48. DDX_Control(pDX, IDC_GRAPH_FRAMESIZE, m_graphfs);
  49. //}}AFX_DATA_MAP
  50. }
  51. BEGIN_MESSAGE_MAP(CTimelineDlg, CDialog)
  52. //{{AFX_MSG_MAP(CTimelineDlg)
  53. ON_WM_HSCROLL()
  54. ON_CBN_SELCHANGE(IDC_COMBO_SCALE, OnSelchangeComboScale)
  55. ON_CBN_SELCHANGE(IDC_COMBO_MAXQUANT, OnSelchangeComboMaxquant)
  56. //}}AFX_MSG_MAP
  57. END_MESSAGE_MAP()
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CTimelineDlg message handlers
  60. //----------------------------------------------------------------------------------------------
  61. void CTimelineDlg::Init(CXvid::QUANTS *quants, int nframes, int maxq, int maxfs)
  62. {
  63. nelem = nframes;
  64. qarray = quants;
  65. qmax = maxq;
  66. fsmax = maxfs;
  67. }
  68. //----------------------------------------------------------------------------------------------
  69. BOOL CTimelineDlg::OnInitDialog() 
  70. {
  71. CDialog::OnInitDialog();
  72. scaleIsSet = false;
  73. maxIsSet = false;
  74. return TRUE;  // return TRUE unless you set the focus to a control
  75.               // EXCEPTION: OCX Property Pages should return FALSE
  76. }
  77. //----------------------------------------------------------------------------------------------
  78. void CTimelineDlg::OnSelchangeComboScale() 
  79. {
  80. scaleIsSet = true;
  81. CString selected;
  82. UpdateData(TRUE);
  83. m_scale.GetLBText(m_scale.GetCurSel(), selected);
  84. scale = atoi(selected);
  85. InitScroll(0, nelem-scale, m_left, (int)(nelem/1400), (int)(nelem/140));
  86. m_right = m_left + scale;
  87. if (scaleIsSet && maxIsSet)
  88. {
  89. InitGraph(scale, maxquant);
  90. DrawTimeline(m_left);
  91. }
  92. UpdateData(FALSE);
  93. }
  94. //----------------------------------------------------------------------------------------------
  95. void CTimelineDlg::OnSelchangeComboMaxquant() 
  96. {
  97. maxIsSet = true;
  98. CString selected;
  99. UpdateData(TRUE);
  100. m_maxquant.GetLBText(m_maxquant.GetCurSel(), selected);
  101. if (selected == "Auto") maxquant = qmax;
  102. else maxquant = atoi(selected);
  103. if (scaleIsSet && maxIsSet)
  104. {
  105. InitGraph(scale, maxquant);
  106. DrawTimeline(m_left);
  107. }
  108. UpdateData(FALSE);
  109. }
  110. //----------------------------------------------------------------------------------------------
  111. void CTimelineDlg::InitGraph(int s, int mq)
  112. {
  113. m_graph.SetScale(0, 0, s, mq-1);
  114. m_graphfs.SetScale(0, 0, s, fsmax);
  115. m_minfsl = 0;
  116. m_minfsr = 0;
  117. m_maxfsl = fsmax;
  118. m_maxfsr = fsmax;
  119. m_minql  = 2;
  120. m_minqr  = 2;
  121. m_maxql  = maxquant;
  122. m_maxqr  = maxquant;
  123. UpdateData(FALSE);
  124. }
  125. //----------------------------------------------------------------------------------------------
  126. void CTimelineDlg::InitScroll(int minu, int maxu, int posu, int smallc, int largec)
  127. {
  128. min=0;max=10000;
  129. umin = minu;
  130. umax = maxu;
  131. upos = posu;
  132. pos = (int)(min+(max-min)*(upos-umin)/(umax-umin));
  133. schange = (int)((max-min)*(smallc)/(umax-umin));
  134. lchange = (int)((max-min)*(largec)/(umax-umin));
  135. m_scroll.SetScrollRange(min, max);
  136. m_scroll.SetScrollPos(pos);
  137. }
  138. //----------------------------------------------------------------------------------------------
  139. void CTimelineDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  140. {
  141. int pos = pScrollBar->GetScrollPos();
  142. if (scaleIsSet && maxIsSet)
  143. {
  144. switch (nSBCode)
  145. {
  146. case SB_LINELEFT: pos -= schange;break;
  147. case SB_PAGELEFT: pos -= lchange;break;
  148. case SB_LINERIGHT: pos += schange;break;
  149. case SB_PAGERIGHT: pos += lchange;break;
  150. case SB_THUMBTRACK: pos=nPos;
  151. case SB_THUMBPOSITION: pos=nPos;
  152. }
  153. if (pos>max) pos = max;
  154. if (pos<min) pos = min;
  155. upos = umin + (umax-umin)*(double)((pos-min)/(max-min));
  156. pScrollBar->SetScrollPos(pos);
  157. m_left = (int)(pos*(umax/max));
  158. m_right= m_left + scale;
  159. DrawTimeline(m_left);
  160. UpdateData(FALSE);
  161. }
  162. CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
  163. }
  164. //----------------------------------------------------------------------------------------------
  165. void CTimelineDlg::DrawTimeline(int uscrollpos)
  166. {
  167. int sp = uscrollpos;
  168. m_graph.Clear();
  169. m_graphfs.Clear();
  170. //Gray lines for making scaling more "visual"
  171. m_graph.SetForeColor(RGB(175,175,175));
  172. for (int j=1; j<maxquant; j++)
  173. {
  174. m_graph.DrawLine(1,j,scale-1,j);
  175. }
  176. for (int i=sp; i<sp+scale; i++)
  177. {
  178. if (i < nelem)
  179. {
  180. if (qarray[i].isIFrame)
  181. {
  182. m_graph.SetForeColor(RGB(0,0,255)); //Blue (I-Frames)
  183. m_graphfs.SetForeColor(RGB(255,0,0));
  184. }
  185. else
  186. {
  187. m_graphfs.SetForeColor(RGB(0,0,255));
  188. SetColor(qarray[i].qvalue);
  189. }
  190. m_graph.DrawLine(i-sp, 0, i-sp, qarray[i].qvalue-1);
  191. m_graphfs.DrawLine(i-sp, 0, i-sp, qarray[i].framesize);
  192. }
  193. }
  194. }
  195. //----------------------------------------------------------------------------------------------
  196. void CTimelineDlg::SetColor(int qvalue)
  197. {
  198. if (qvalue == 2)
  199. {
  200. m_graph.SetForeColor(RGB(0,255,0)); //Light green (Q:2);
  201. }
  202. if (qvalue > 2 && qvalue < 6)
  203. {
  204. m_graph.SetForeColor(RGB(0,127,0)); //Darker green (Q:3-Q:5)
  205. }
  206. if (qvalue >= 6 && qvalue <10)
  207. {
  208. m_graph.SetForeColor(RGB(255,255,0)); //Yellow (Q:6-Q:9)
  209. }
  210. if (qvalue >= 10)
  211. {
  212. m_graph.SetForeColor(RGB(255,0,0)); //Red (Q:10+)
  213. }
  214. }