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

📄 srttosmidlg.cpp

📁 PPC下SRT字幕转SMI字幕软件,是PPC下直接使用,不是电脑用
💻 CPP
字号:
// SrtToSmiDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SrtToSmi.h"
#include "SrtToSmiDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSrtToSmiDlg dialog

CSrtToSmiDlg::CSrtToSmiDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSrtToSmiDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSrtToSmiDlg)
	m_name = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSrtToSmiDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSrtToSmiDlg)
	DDX_Text(pDX, IDC_NAME, m_name);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSrtToSmiDlg, CDialog)
	//{{AFX_MSG_MAP(CSrtToSmiDlg)
	ON_BN_CLICKED(IDC_OUT, OnOut)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSrtToSmiDlg message handlers

BOOL CSrtToSmiDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	HKEY hKey;
	DWORD dwDisp;
	CString sz;
	sz=L"SrtFile";
	RegCreateKeyEx(HKEY_CLASSES_ROOT,_T("\\.Srt"),0,NULL,0,0,NULL,&hKey,&dwDisp);
	if(dwDisp==REG_CREATED_NEW_KEY)
		RegCreateKeyEx(HKEY_CLASSES_ROOT,_T("\\.Srt"),0,NULL,0,0,NULL,&hKey,&dwDisp);
	RegSetValueEx(hKey,NULL,NULL,REG_SZ,(BYTE*)sz.GetBuffer(0),sz.GetLength()*2+2);
	sz.ReleaseBuffer();
	RegCloseKey(hKey);
	RegCreateKeyEx(HKEY_CLASSES_ROOT,_T("\\SrtFile"),0,NULL,0,0,NULL,&hKey,&dwDisp);
	if(dwDisp==REG_CREATED_NEW_KEY)
		RegCreateKeyEx(HKEY_CLASSES_ROOT,_T("\\SrtFile"),0,NULL,0,0,NULL,&hKey,&dwDisp);
	sz=L"Srt文件";
	RegSetValueEx(hKey,NULL,NULL,REG_SZ,(BYTE*)sz.GetBuffer(0),sz.GetLength()*2+2);
	sz.ReleaseBuffer();
	RegCloseKey(hKey);
	RegCreateKeyEx(HKEY_CLASSES_ROOT,_T("\\SrtFile\\Shell\\Open\\Command"),0,NULL,0,0,NULL,&hKey,&dwDisp);
	if(dwDisp==REG_CREATED_NEW_KEY)
		RegCreateKeyEx(HKEY_CLASSES_ROOT,_T("\\SrtFile\\Shell\\Open\\Command"),0,NULL,0,0,NULL,&hKey,&dwDisp);
	::GetModuleFileName(AfxGetApp()->m_hInstance,sz.GetBuffer(MAX_PATH),MAX_PATH);
	sz.ReleaseBuffer();
	sz+=L" %1";
	RegSetValueEx(hKey,NULL,NULL,REG_SZ,(BYTE*)sz.GetBuffer(0),sz.GetLength()*2+2);
	sz.ReleaseBuffer();
	RegCloseKey(hKey);
	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen
	CString str=::GetCommandLine();
	if(!str.IsEmpty())
	{
		SetWindowText(L"转换中...");
		SrtToSmi(&str);
		OnOK();
	}
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CSrtToSmiDlg::SrtToSmi(CString *name)
{
	CFile srt,smi;
	if(srt.Open(*name,CFile::modeRead))
	{
		name->MakeReverse();
		name->Delete(0,name->Find(L'.'));
		name->MakeReverse();
		name->Insert(name->GetLength(),L"smi");
		if(smi.Open(*name,CFile::modeCreate|CFile::modeReadWrite))
		{
			CString str;
			char smit[]="<SAMI>\r\n<HEAD>\r\n<STYLE TYPE=\"text/css\">\r\n<!--\r\nP {margin-left: 16pt; margin-right: 16pt; margin-bottom: 16pt; margin-top: 16pt;\r\ntext-align: center; font-size: 18pt; font-family: arial; font-weight: bold; color: #f0f0f0;}\r\n.UNKNOWNCC {Name:Unknown; lang:en-US; SAMIType:CC;}\r\n-->\r\n</STYLE>\r\n</HEAD>\r\n\r\n<BODY>\r\n";
			char smi1[]="<br>";
			char smi2[]="</BODY>";
			char sz[256];
			smi.Write(smit,sizeof smit-1);
			WORD ut;
			srt.Read(&ut,sizeof ut);
			DWORD len=srt.GetLength();
			if(ut!=0xfeff)
			{
				srt.SeekToBegin();
				char *m_p=new char[len];
				srt.Read(m_p,len);
				::MultiByteToWideChar(CP_ACP,0,m_p,len,str.GetBufferSetLength(len),len);
				str.ReleaseBuffer();
				delete m_p;
			}
			else
			{
				srt.Read(str.GetBufferSetLength(len),len);
				str.ReleaseBuffer();
			}
			CString strl,strr,strt,mm,stre;
			int i=1;
			int HH,MM,SS,HH1,MM1,SS1;
			CString MS,MS1;
			while(str.Find(L'\n')!=-1)
			{
				str.TrimLeft();
				if(str.IsEmpty())continue;
				int st=str.Find(L'\n')-1;
				mm=str.Left(st);
				str=str.Right(str.GetLength()-st-2);
				if(mm.IsEmpty())continue;
				mm.TrimLeft();
				if(mm.GetAt(2)==':'&&mm.GetAt(5)==':'&&mm.GetAt(8)==',')
				{
					HH=_wtoi(mm.Left(2))*60*60;
					mm.Delete(0,3);
					MM=_wtoi(mm.Left(2))*60;
					mm.Delete(0,3);
					SS=_wtoi(mm.Left(2));
					mm.Delete(0,3);
					MS=mm.Left(3);
					mm.Delete(0,8);
					HH1=_wtoi(mm.Left(2))*60*60;
					mm.Delete(0,3);
					MM1=_wtoi(mm.Left(2))*60;
					mm.Delete(0,3);
					SS1=_wtoi(mm.Left(2));
					mm.Delete(0,3);
					MS1=mm.Left(3);
					mm.Format(L"<SYNC Start=%d%s><P Class=UNKNOWNCC>\r\n",HH+MM+SS,MS);
					WideCharToMultiByte(CP_ACP,0,mm,-1,sz,mm.GetLength()*2+2,0,0);
					smi.Write(sz,strlen(sz));
					BOOL isE=FALSE;
					while(str.Find(L'\n')!=-1&&str.GetAt(0)!=L'\r')
					{
						str.TrimLeft();
						if(str.IsEmpty())break;
						int st=str.Find(L'\n')-1;
						mm=str.Left(st);
						str=str.Right(str.GetLength()-st-2);
						if(mm.IsEmpty())continue;
						if(isE)
							smi.Write(smi1,sizeof smi1-1);
						mm.TrimLeft();
						mm.TrimRight();
						WideCharToMultiByte(CP_ACP,0,mm,-1,sz,mm.GetLength()*2+2,0,0);
						smi.Write(sz,strlen(sz));
						isE=TRUE;
					}
					mm.Format(L"\r\n<SYNC Start=%d%s><P Class=UNKNOWNCC>&nbsp;\r\n",HH1+MM1+SS1,MS1);
					WideCharToMultiByte(CP_ACP,0,mm,-1,sz,mm.GetLength()*2+2,0,0);
					smi.Write(sz,strlen(sz));
				}
			}
			smi.Write(smi2,sizeof smi2);
			smi.Close();
		}
		
		srt.Close();
	}
	
}

void CSrtToSmiDlg::OnOut() 
{
	SrtToSmi(&m_name);
	MessageBox(L"转换成功",L"提示",MB_OK);
}

⌨️ 快捷键说明

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