GoToDlg.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // GoToDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "GoToDlg.h"
  26. #include <atlrx.h>
  27. // CGoToDlg dialog
  28. IMPLEMENT_DYNAMIC(CGoToDlg, CDialog)
  29. CGoToDlg::CGoToDlg(int time, float fps, CWnd* pParent /*=NULL*/)
  30. : CDialog(CGoToDlg::IDD, pParent)
  31. , m_timestr(_T(""))
  32. , m_framestr(_T(""))
  33. , m_time(time)
  34. , m_fps(fps)
  35. {
  36. if(m_fps == 0)
  37. {
  38. CString str = AfxGetApp()->GetProfileString(ResStr(IDS_R_SETTINGS), _T("fps"), _T("0"));
  39. if(_stscanf(str, _T("%f"), &m_fps) != 1) m_fps = 0;
  40. }
  41. }
  42. CGoToDlg::~CGoToDlg()
  43. {
  44. }
  45. void CGoToDlg::DoDataExchange(CDataExchange* pDX)
  46. {
  47. CDialog::DoDataExchange(pDX);
  48. DDX_Text(pDX, IDC_EDIT1, m_timestr);
  49. DDX_Text(pDX, IDC_EDIT2, m_framestr);
  50. DDX_Control(pDX, IDC_EDIT1, m_timeedit);
  51. DDX_Control(pDX, IDC_EDIT2, m_frameedit);
  52. }
  53. BOOL CGoToDlg::OnInitDialog()
  54. {
  55. CDialog::OnInitDialog();
  56. if(m_time >= 0)
  57. {
  58. m_timestr.Format(_T("%02d:%02d:%02d.%03d"), 
  59. (m_time/(1000*60*60))%60, (m_time/(1000*60))%60, (m_time/1000)%60, m_time%1000);
  60. if(m_fps > 0)
  61. {
  62. m_framestr.Format(_T("%d, %.3f"), (int)(m_fps*m_time/1000), m_fps);
  63. }
  64. UpdateData(FALSE);
  65. switch(AfxGetApp()->GetProfileInt(ResStr(IDS_R_SETTINGS), _T("gotoluf"), 0))
  66. {
  67. default:
  68. case 0: m_timeedit.SetFocus(); m_timeedit.SetSel(0, 0); break;
  69. case 1: m_frameedit.SetFocus(); m_frameedit.SetSel(0, m_framestr.Find(',')); break;
  70. }
  71. }
  72. return FALSE;
  73. // return TRUE;  // return TRUE unless you set the focus to a control
  74. // EXCEPTION: OCX Property Pages should return FALSE
  75. }
  76. BEGIN_MESSAGE_MAP(CGoToDlg, CDialog)
  77. ON_BN_CLICKED(IDC_OK1, OnBnClickedOk1)
  78. ON_BN_CLICKED(IDC_OK2, OnBnClickedOk2)
  79. END_MESSAGE_MAP()
  80. // CGoToDlg message handlers
  81. void CGoToDlg::OnBnClickedOk1()
  82. {
  83. UpdateData();
  84. int hh, mm, ss, ms;
  85. hh = mm = ss = ms = 0;
  86. CAtlRegExp<> re;
  87. REParseError status = re.Parse(_T("{\z}"), FALSE);
  88. if(REPARSE_ERROR_OK == status)
  89. {
  90. CAtlREMatchContext<> mc;
  91. const CAtlREMatchContext<>::RECHAR* s = m_timestr.GetBuffer();
  92. const CAtlREMatchContext<>::RECHAR* e = NULL;
  93. while(s && re.Match(s, &mc, &e))
  94. {
  95. const CAtlREMatchContext<>::RECHAR* szStart = 0;
  96. const CAtlREMatchContext<>::RECHAR* szEnd = 0;
  97. mc.GetMatch(0, &szStart, &szEnd);
  98. if(hh != 0 || hh > 59 || mm > 59 || ss > 59)
  99. {
  100. AfxMessageBox(_T("Error parsing entered time!"));
  101. return;
  102. }
  103. hh = mm;
  104. mm = ss;
  105. ss = ms;
  106. ms = _tcstol(szStart, (TCHAR**)&szStart, 10);
  107. s = e;
  108. }
  109. m_time = ((hh*60+mm)*60+ss)*1000+ms;
  110. AfxGetApp()->WriteProfileInt(ResStr(IDS_R_SETTINGS), _T("gotoluf"), 0);
  111. OnOK();
  112. }
  113. }
  114. void CGoToDlg::OnBnClickedOk2()
  115. {
  116. UpdateData();
  117. int frame = 0;
  118. float fps = 0;
  119. CAtlRegExp<> re;
  120. REParseError status = re.Parse(_T("{\z}[^0-9\.]+{[0-9\.]+}"), FALSE);
  121. if(REPARSE_ERROR_OK == status)
  122. {
  123. CAtlREMatchContext<> mc;
  124. const CAtlREMatchContext<>::RECHAR* s = m_framestr.GetBuffer();
  125. const CAtlREMatchContext<>::RECHAR* e = NULL;
  126. if(re.Match(s, &mc, &e))
  127. {
  128. const CAtlREMatchContext<>::RECHAR* szStart = 0;
  129. const CAtlREMatchContext<>::RECHAR* szEnd = 0;
  130. mc.GetMatch(0, &szStart, &szEnd);
  131. frame = _tcstol(szStart, (TCHAR**)&szStart, 10);
  132. mc.GetMatch(1, &szStart, &szEnd);
  133. if(_stscanf(szStart, _T("%f"), &fps) != 1) fps = 0;
  134. else AfxGetApp()->WriteProfileString(ResStr(IDS_R_SETTINGS), _T("fps"), szStart);
  135. }
  136. else
  137. {
  138. AfxMessageBox(_T("Error parsing entered text!"));
  139. return;
  140. }
  141. if(fps == 0)
  142. {
  143. AfxMessageBox(_T("Error parsing entered frame-rate!"));
  144. return;
  145. }
  146. m_time = (int)(1000.0*frame/fps) + 1;
  147. AfxGetApp()->WriteProfileInt(ResStr(IDS_R_SETTINGS), _T("gotoluf"), 1);
  148. OnOK();
  149. }
  150. }
  151. BOOL CGoToDlg::PreTranslateMessage(MSG* pMsg)
  152. {
  153. if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
  154. {
  155. if(*GetFocus() == m_timeedit) OnBnClickedOk1();
  156. else if(*GetFocus() == m_frameedit) OnBnClickedOk2();
  157. return TRUE;
  158. }
  159. return __super::PreTranslateMessage(pMsg);
  160. }