VSRipDlg.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:8k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 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. // VSRipDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include <afxpriv.h>
  25. #include "VSRip.h"
  26. #include "VSRipDlg.h"
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #endif
  30. // CVSRipDlg dialog
  31. CVSRipDlg::CVSRipDlg(CWnd* pParent /*=NULL*/)
  32. : CDialog(CVSRipDlg::IDD, pParent)
  33. {
  34. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  35. m_dlgpos = NULL;
  36. m_pVSFRipper = new CVobSubFileRipper();
  37. }
  38. CVSRipDlg::~CVSRipDlg()
  39. {
  40. m_pVSFRipper->SetCallBack(NULL);
  41. }
  42. void CVSRipDlg::DoDataExchange(CDataExchange* pDX)
  43. {
  44. CDialog::DoDataExchange(pDX);
  45. DDX_Control(pDX, IDC_DLGRECT, m_dlgrect);
  46. DDX_Control(pDX, IDC_HEADERSEP, m_hdrline);
  47. DDX_Control(pDX, IDC_FOOTERSEP, m_ftrline);
  48. }
  49. void CVSRipDlg::ShowNext()
  50. {
  51. POSITION prev = m_dlgpos;
  52. m_dlgpos = GetNext();
  53. if(prev && prev != m_dlgpos)
  54. {
  55. m_dlgs.GetAt(prev)->OnNext();
  56. m_dlgs.GetAt(prev)->ShowWindow(SW_HIDE);
  57. }
  58. if(m_dlgpos)
  59. {
  60. CVSRipPage* pDlg = m_dlgs.GetAt(m_dlgpos);
  61. CRect dr;
  62. m_dlgrect.GetClientRect(dr);
  63. m_dlgrect.MapWindowPoints(this, dr);
  64. pDlg->MoveWindow(dr);
  65. pDlg->ShowWindow(SW_SHOWNORMAL);
  66. Invalidate();
  67. }
  68. }
  69. void CVSRipDlg::ShowPrev()
  70. {
  71. POSITION next = m_dlgpos;
  72. m_dlgpos = GetPrev();
  73. if(next && next != m_dlgpos)
  74. {
  75. m_dlgs.GetAt(next)->OnPrev();
  76. m_dlgs.GetAt(next)->ShowWindow(SW_HIDE);
  77. }
  78. if(m_dlgpos)
  79. {
  80. CVSRipPage* pDlg = m_dlgs.GetAt(m_dlgpos);
  81. CRect dr;
  82. m_dlgrect.GetClientRect(dr);
  83. m_dlgrect.MapWindowPoints(this, dr);
  84. pDlg->MoveWindow(dr);
  85. pDlg->ShowWindow(SW_SHOWNORMAL);
  86. Invalidate();
  87. }
  88. }
  89. POSITION CVSRipDlg::GetNext()
  90. {
  91. POSITION pos = m_dlgpos;
  92. if(pos && m_dlgs.GetAt(pos)->CanGoNext()) m_dlgs.GetNext(pos);
  93. else if(pos && !m_dlgs.GetAt(pos)->CanGoNext()) pos = NULL;
  94. else pos = m_dlgs.GetHeadPosition();
  95. return(pos);
  96. }
  97. POSITION CVSRipDlg::GetPrev()
  98. {
  99. POSITION pos = m_dlgpos;
  100. if(pos && m_dlgs.GetAt(pos)->CanGoPrev()) m_dlgs.GetPrev(pos);
  101. else if(pos && !m_dlgs.GetAt(pos)->CanGoPrev()) pos = NULL;
  102. else pos = m_dlgs.GetTailPosition();
  103. return(pos);
  104. }
  105. BEGIN_MESSAGE_MAP(CVSRipDlg, CDialog)
  106. ON_WM_PAINT()
  107. ON_WM_QUERYDRAGICON()
  108. ON_MESSAGE_VOID(WM_KICKIDLE, OnKickIdle)
  109. ON_BN_CLICKED(IDC_BUTTON1, OnPrev)
  110. ON_UPDATE_COMMAND_UI(IDC_BUTTON1, OnUpdatePrev)
  111. ON_BN_CLICKED(IDC_BUTTON2, OnNext)
  112. ON_UPDATE_COMMAND_UI(IDC_BUTTON2, OnUpdateNext)
  113. ON_BN_CLICKED(IDCANCEL, OnClose)
  114. ON_UPDATE_COMMAND_UI(IDCANCEL, OnUpdateClose)
  115. END_MESSAGE_MAP()
  116. // CVSRipDlg message handlers
  117. BOOL CVSRipDlg::OnInitDialog()
  118. {
  119. CDialog::OnInitDialog();
  120. // Set the icon for this dialog.  The framework does this automatically
  121. //  when the application's main window is not a dialog
  122. SetIcon(m_hIcon, TRUE); // Set big icon
  123. SetIcon(m_hIcon, FALSE); // Set small icon
  124. if(CMenu* pSysMenu = GetSystemMenu(FALSE))
  125. {
  126. pSysMenu->RemoveMenu(SC_SIZE, MF_BYCOMMAND);
  127. pSysMenu->RemoveMenu(SC_MAXIMIZE, MF_BYCOMMAND);
  128. }
  129. CRect cr;
  130. GetClientRect(cr);
  131. CRect r;
  132. m_hdrline.GetClientRect(r);
  133. m_hdrline.MapWindowPoints(this, r);
  134. r.left = 0;
  135. r.right = cr.right;
  136. r.bottom+=2;
  137. m_hdrline.MoveWindow(r);
  138. m_ftrline.GetClientRect(r);
  139. m_ftrline.MapWindowPoints(this, r);
  140. r.left = 0;
  141. r.right = cr.right;
  142. r.bottom+=2;
  143. m_ftrline.MoveWindow(r);
  144. m_pVSFRipper = new CVobSubFileRipper();
  145. CAutoPtr<CVSRipPage> pPage;
  146. pPage.Attach(new CVSRipFileDlg(m_pVSFRipper));
  147. pPage->Create(CVSRipFileDlg::IDD, this);
  148. m_dlgs.AddTail(pPage);
  149. pPage.Attach(new CVSRipPGCDlg(m_pVSFRipper));
  150. pPage->Create(CVSRipPGCDlg::IDD, this);
  151. m_dlgs.AddTail(pPage);
  152. pPage.Attach(new CVSRipIndexingDlg(m_pVSFRipper));
  153. pPage->Create(CVSRipIndexingDlg::IDD, this);
  154. m_dlgs.AddTail(pPage);
  155. if(__argc > 1)
  156. {
  157. m_pVSFRipper->SetCallBack((IVSFRipperCallback*)m_dlgs.GetTail());
  158. if(S_OK != m_pVSFRipper->LoadParamFile(CString(__targv[1])))
  159. {
  160. AfxMessageBox(_T("Error parsing parameter file!"), MB_OK);
  161. EndDialog(IDCANCEL);
  162. return FALSE;
  163. }
  164. ShowPrev();
  165. }
  166. else
  167. {
  168.         ShowNext();
  169. }
  170. return TRUE;  // return TRUE  unless you set the focus to a control
  171. }
  172. // If you add a minimize button to your dialog, you will need the code below
  173. //  to draw the icon.  For MFC applications using the document/view model,
  174. //  this is automatically done for you by the framework.
  175. void CVSRipDlg::OnPaint() 
  176. {
  177. if (IsIconic())
  178. {
  179. CPaintDC dc(this); // device context for painting
  180. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  181. // Center icon in client rectangle
  182. int cxIcon = GetSystemMetrics(SM_CXICON);
  183. int cyIcon = GetSystemMetrics(SM_CYICON);
  184. CRect rect;
  185. GetClientRect(&rect);
  186. int x = (rect.Width() - cxIcon + 1) / 2;
  187. int y = (rect.Height() - cyIcon + 1) / 2;
  188. // Draw the icon
  189. dc.DrawIcon(x, y, m_hIcon);
  190. }
  191. else
  192. {
  193. CPaintDC dc(this); // device context for painting
  194. CWnd* pHdrSep = GetDlgItem(IDC_HEADERSEP);
  195. CRect r;
  196. m_hdrline.GetClientRect(r);
  197. m_hdrline.MapWindowPoints(this, r);
  198. CRect cr;
  199. GetClientRect(cr);
  200. dc.FillSolidRect(CRect(0,0,cr.right,r.top), 0xffffff);
  201. if(m_dlgpos)
  202. {
  203. CVSRipPage* pWnd = m_dlgs.GetAt(m_dlgpos);
  204. CFont hdrfont, descfont;
  205. hdrfont.CreateFont(16,0,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,
  206. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,DEFAULT_PITCH,
  207. _T("Times New Roman"));
  208. descfont.CreateFont(14,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
  209. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,DEFAULT_PITCH,
  210. _T("Arial"));
  211. CFont* pOld = dc.SelectObject(&hdrfont);
  212. dc.DrawText(pWnd->GetHeaderText(), CRect(10,5,cr.right,r.top), DT_WORDBREAK);
  213. dc.SelectObject(&descfont);
  214. dc.DrawText(pWnd->GetDescText(), CRect(20,22,cr.right,r.top), DT_WORDBREAK);
  215. dc.SelectObject(pOld);
  216. }
  217. CDialog::OnPaint();
  218. }
  219. }
  220. void CVSRipDlg::OnKickIdle()
  221. {
  222. UpdateDialogControls(this, false);
  223. for(CWnd* pChild = GetWindow(GW_CHILD); pChild; pChild = pChild->GetNextWindow())
  224. {
  225. if(pChild->IsKindOf(RUNTIME_CLASS(CVSRipPage)))
  226. pChild->UpdateDialogControls(pChild, false);
  227. }
  228. }
  229. // The system calls this function to obtain the cursor to display while the user drags
  230. //  the minimized window.
  231. HCURSOR CVSRipDlg::OnQueryDragIcon()
  232. {
  233. return static_cast<HCURSOR>(m_hIcon);
  234. }
  235. void CVSRipDlg::OnPrev()
  236. {
  237. ShowPrev();
  238. }
  239. void CVSRipDlg::OnUpdatePrev(CCmdUI* pCmdUI)
  240. {
  241. if(m_dlgpos) pCmdUI->SetText(m_dlgs.GetAt(m_dlgpos)->GetPrevText());
  242. pCmdUI->Enable(!!GetPrev());
  243. }
  244. void CVSRipDlg::OnNext()
  245. {
  246. ShowNext();
  247. }
  248. void CVSRipDlg::OnUpdateNext(CCmdUI* pCmdUI)
  249. {
  250. if(m_dlgpos) pCmdUI->SetText(m_dlgs.GetAt(m_dlgpos)->GetNextText());
  251. pCmdUI->Enable(!!GetNext());
  252. }
  253. void CVSRipDlg::OnClose()
  254. {
  255. if(m_dlgpos) m_dlgs.GetAt(m_dlgpos)->OnClose();
  256. OnCancel();
  257. }
  258. void CVSRipDlg::OnUpdateClose(CCmdUI* pCmdUI)
  259. {
  260. if(m_dlgpos) pCmdUI->SetText(m_dlgs.GetAt(m_dlgpos)->GetCloseText());
  261. pCmdUI->Enable(!m_dlgpos || m_dlgs.GetAt(m_dlgpos)->CanClose());
  262. }