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

📄 cutter.cpp

📁 VC源码:文件分割器 VC源码:文件分割器
💻 CPP
字号:
////////////////////////////////////////////////
// MainDir.cpp文件

#include <afxdlgs.h> // 为了使用CFileDialog类
#include "DirDialog.h"
#include "resource.h"
#include "Cutter.h"

CMyApp theApp;

BOOL CMyApp::InitInstance()
{
	CMainDialog dlg;
	m_pMainWnd = &dlg;
	dlg.DoModal();
	return FALSE;
}

CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_FILECUTTER_DIALOG, pParentWnd)
{
}

BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_BN_CLICKED(IDC_SOURCEBROWSER, OnSourceBrowser)	// 选择源文件的“选择”按钮
ON_BN_CLICKED(IDC_DESTBROWSER, OnDestBrowser)		// 选择目标文件的“选择”按钮
ON_BN_CLICKED(IDC_START, OnStart)			// 开始“分割”按钮
ON_BN_CLICKED(IDC_STOP, OnStop)				// “终止”分割按钮
ON_BN_CLICKED(IDC_SELECTSPLIT, OnSelect)		// 分割单选框按钮
ON_BN_CLICKED(IDC_SELECTMERGE, OnSelect)		// 合并单选框按钮
// 下面是3各CFileCutter类发来的消息
ON_MESSAGE(WM_CUTTERSTART, OnCutterStart)		
ON_MESSAGE(WM_CUTTERSTATUS, OnCutterStatus)
ON_MESSAGE(WM_CUTTERSTOP, OnCutterStop)
END_MESSAGE_MAP()

BOOL CMainDialog::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetIcon(theApp.LoadIcon(IDI_MAIN), FALSE);

	// 创建CFileCutter对象
	m_pCutter = new CFileCutter(m_hWnd);

	// 默认选中分割单项框
	((CButton*)GetDlgItem(IDC_SELECTSPLIT))->SetCheck(1);
	// 初始化单位选择组合框。可以在这里继续添加其它项
	((CComboBox*)GetDlgItem(IDC_UNIT))->AddString("1");
	((CComboBox*)GetDlgItem(IDC_UNIT))->AddString("30");
	((CComboBox*)GetDlgItem(IDC_UNIT))->AddString("60");
	((CComboBox*)GetDlgItem(IDC_UNIT))->SetCurSel(0);

	// 子类化进度条控件。也就是让m_Progress对象取得进度条控件的控制权
	m_Progress.SubclassWindow(*GetDlgItem(IDC_PROGRESS));

	UIControl();
	return TRUE;
}

void CMainDialog::UIControl()
{
	BOOL bIsWorking = m_pCutter->IsRunning();
	
	// 设置选项分组框中3个控件的状态
	GetDlgItem(IDC_SELECTSPLIT)->EnableWindow(!bIsWorking);
	GetDlgItem(IDC_SELECTMERGE)->EnableWindow(!bIsWorking);
	GetDlgItem(IDC_UNIT)->EnableWindow(!bIsWorking);
	// 设置分割、终止两个按钮的状态
	GetDlgItem(IDC_START)->EnableWindow(!bIsWorking);
	GetDlgItem(IDC_STOP)->EnableWindow(bIsWorking);

	if(bIsWorking)
	{
		return;
	}
	
	// 根据用户的选择设置不同的文本
	BOOL bSplit = ((CButton*)GetDlgItem(IDC_SELECTSPLIT))->GetCheck();
	if(bSplit)	// 请求分割	
	{
		GetDlgItem(IDC_START)->SetWindowText("分割");
		GetDlgItem(IDC_SOURCETITLE)->SetWindowText("请选择要分割的文件:");
		GetDlgItem(IDC_DESTTITLE)->SetWindowText("请选择分割后保存到的文件夹:");
	
		GetDlgItem(IDC_UNIT)->EnableWindow(TRUE);
	}
	else		// 请求合并
	{
		GetDlgItem(IDC_START)->SetWindowText("合并");
		GetDlgItem(IDC_SOURCETITLE)->SetWindowText("请选择待合并文件的文件夹:");
		GetDlgItem(IDC_DESTTITLE)->SetWindowText("请选择合并后保存到的文件夹:");
		
		GetDlgItem(IDC_UNIT)->EnableWindow(FALSE);
	}

	// 初始化状态信息
	GetDlgItem(IDC_STATUSTEXT)->SetWindowText("    状态显示:");
	m_Progress.SetPos(0);

}

void CMainDialog::OnCancel()
{
	// 是否真的退出?
	BOOL bExit = TRUE;
	if(m_pCutter->IsRunning())
	{
		if(MessageBox("工作还未完成,确实要退出吗?", NULL, MB_YESNO) == IDNO)
		{
			bExit = FALSE;
		}
	}

	if(bExit)
	{
		delete m_pCutter;
		CDialog::OnCancel();
	}
}

void CMainDialog::OnSelect()
{
	UIControl();
}

void CMainDialog::OnSourceBrowser()
{
	BOOL bSplit = ((CButton*)GetDlgItem(IDC_SELECTSPLIT))->GetCheck();
	if(bSplit)	// 请求分割
	{
		CFileDialog sourceFile(TRUE);
		// 显示选择文件对话框
		if(sourceFile.DoModal() == IDOK)
		{
			GetDlgItem(IDC_EDITSOURCE)->SetWindowText(sourceFile.GetPathName());
			
			// 设置默认目录
			// 例如,如果用户选择文件“D:\cd\精选歌曲.iso”,那么“D:\cd\精选歌曲”将会被设置为默认目录
			CString strDef = sourceFile.GetPathName();
			strDef = strDef.Left(strDef.ReverseFind('.'));
			GetDlgItem(IDC_EDITDEST)->SetWindowText(strDef);
		}
	}
	else		// 请求合并
	{
		CDirDialog sourceFolder;
		// 显示选择目录对话框
		if(sourceFolder.DoBrowse(*this) == IDOK)
		{
			GetDlgItem(IDC_EDITSOURCE)->SetWindowText(sourceFolder.GetPath());

			// 设置默认目录
			// 例如,如果用户选择目录“D:\cd”,那么“D:\cd\cd”将会被设置为默认目录
			CString strDef = sourceFolder.GetPath();
			strDef.TrimRight('\\');
			strDef = strDef + '\\' + strDef.Mid(strDef.ReverseFind('\\') + 1);
			// 防止用户选择根目录
			strDef.TrimRight(':');
			GetDlgItem(IDC_EDITDEST)->SetWindowText(strDef);
		}
	}
}

void CMainDialog::OnDestBrowser()
{
	CDirDialog destFolder;
	// 显示选择目录对话框
	if(destFolder.DoBrowse(*this) == IDOK)
	{
		GetDlgItem(IDC_EDITDEST)->SetWindowText(destFolder.GetPath());
	}
}

void CMainDialog::OnStart()
{
	CString strSource, strDest;

	// 检查输入
	GetDlgItem(IDC_EDITSOURCE)->GetWindowText(strSource);
	GetDlgItem(IDC_EDITDEST)->GetWindowText(strDest);
	if(strSource.IsEmpty() || strDest.IsEmpty())
	{
		MessageBox("文件或路径名称不能为空");
		return;
	}

	BOOL bSplit = ((CButton*)GetDlgItem(IDC_SELECTSPLIT))->GetCheck();
	if(bSplit)	// 请求分割
	{
		CString str;
		GetDlgItem(IDC_UNIT)->GetWindowText(str);
		m_pCutter->StartSplit(strDest, strSource, atoi(str)*1024*1024);
	}
	else		// 请求合并
	{
		m_pCutter->StartMerge(strDest, strSource);
	}
}

void CMainDialog::OnStop()
{
	m_pCutter->SuspendCutter();
	if(MessageBox("确实要终止吗?", NULL, MB_YESNO) == IDYES)
	{
		m_pCutter->StopCutter();
	}
	else
	{
		m_pCutter->ResumeCutter();
	}
}
 
////////////////////////////////////////////////////
// 下面的代码处理CFileCutter类发来的消息


long CMainDialog::OnCutterStart(WPARAM wParam, LPARAM)		// WM_CUTTERSTART 开始工作
{
	// 设置进度条范围
	int nTotalFiles = wParam;	// 总文件数量
	m_Progress.SetRange(0, nTotalFiles);
	
	UIControl();
	return 0;
}

long CMainDialog::OnCutterStatus(WPARAM wParam, LPARAM lParam)	// WM_CUTTERSTATUS 工作进度
{
	// 设置进度条进度
	int nCompleted = (int)lParam;
	m_Progress.SetPos(nCompleted);
	// 显示状态
	CString s;
	s.Format(" 完成%d个文件", nCompleted);
	GetDlgItem(IDC_STATUSTEXT)->SetWindowText(s);
	return 0;
}

long CMainDialog::OnCutterStop(WPARAM wParam, LPARAM lParam)	// WM_CUTTERSTOP 停止工作
{
	int nErrorCode = wParam;
	switch(nErrorCode)
	{
	case CFileCutter::exitSuccess:
		MessageBox("操作成功完成", "成功");
		break;
	case CFileCutter::exitSourceErr:
		MessageBox("源文件出错", "失败");
		break;
	case CFileCutter::exitDestErr:
		MessageBox("目标文件出错", "失败");
		break;
	case CFileCutter::exitUserForce:
		MessageBox("用户终止", "失败");
		break;
	}
	UIControl();
	return 0;
}


⌨️ 快捷键说明

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