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

📄 mainwin.cpp

📁 FastCopy 利用缓冲技术加快文件拷贝
💻 CPP
📖 第 1 页 / 共 4 页
字号:
static char *mainwin_id = 
	"@(#)Copyright (C) H.Shirouzu 2004-2007   maindlg.cpp	ver1.52";
/* ========================================================================
	Project  Name			: Fast/Force copy file and directory
	Create					: 2004-09-15(Wed)
	Update					: 2007-02-06(Tue)
	Copyright				: H.Shirouzu
	Reference				: 
	======================================================================== */

#include "mainwin.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>

/*=========================================================================
  僋儔僗 丗 TFastCopyApp
  奣  梫 丗 傾僾儕働乕僔儑儞僋儔僗
  愢  柧 丗 
  拲  堄 丗 
=========================================================================*/
TFastCopyApp::TFastCopyApp(HINSTANCE _hI, LPSTR _cmdLine, int _nCmdShow) : TApp(_hI, _cmdLine, _nCmdShow)
{
	char	title[100];
	sprintf(title, "FastCopy %s", GetVersionStr());
	InstallExceptionFilter(title, GetLoadStr(IDS_EXCEPTIONLOG));

	LoadLibrary("RICHED20.DLL");
}

TFastCopyApp::~TFastCopyApp()
{
}

void TFastCopyApp::InitWindow(void)
{
	TRegisterClass(FASTCOPY_CLASS);

	TDlg *mainDlg = new TMainDlg();
	mainWnd = mainDlg;
	mainDlg->Create();
}

int WINAPI WinMain(HINSTANCE _hI, HINSTANCE, LPSTR arg, int show)
{
	return	TFastCopyApp(_hI, arg, show).Run();
}


/*=========================================================================
  僋儔僗 丗 TMainDlg
  奣  梫 丗 儊僀儞僟僀傾儘僌
  愢  柧 丗 
  拲  堄 丗 
=========================================================================*/
TMainDlg::TMainDlg() : TDlg(MAIN_DIALOG), aboutDlg(this), setupDlg(&cfg, this), shellExtDlg(&cfg, this), jobDlg(&cfg, this)
{
	cfg.ReadIni();

	if (cfg.lcid > 0)
		TSetDefaultLCID(cfg.lcid);

	isShellExt = FALSE;
	isErrLog = cfg.isErrLog;
	forceStart = cfg.forceStart;
	isTaskTray = noConfirmDel = FALSE;
	isNetPlaceSrc = FALSE;
	skipEmptyDir = cfg.skipEmptyDir;
	diskMode = cfg.diskMode;
	curForeWnd = NULL;

//	isRegExp = FALSE;
//	isFilter = FALSE;

	autoCloseLevel = NO_CLOSE;
	curIconIndex = 0;
	pathLogBuf = NULL;
	isDelay = FALSE;
	endTick = 0;
	hErrLogFile = INVALID_HANDLE_VALUE;
	hErrLogMutex = NULL;
	memset(&ti, 0, sizeof(ti));
}

TMainDlg::~TMainDlg()
{
}

struct CopyInfo COPYINFO_LIST [] = {
	{ IDS_ALLSKIP,		NULL,	IDS_CMD_NOEXIST_ONLY, NULL,	FastCopy::DIFFCP_MODE,	FastCopy::BY_NAME },
	{ IDS_ATTRCMP,		NULL,	IDS_CMD_DIFF,		NULL,	FastCopy::DIFFCP_MODE,	FastCopy::BY_ATTR },
	{ IDS_UPDATECOPY,	NULL,	IDS_CMD_UPDATE,		NULL,	FastCopy::DIFFCP_MODE,	FastCopy::BY_LASTEST },
	{ IDS_FORCECOPY,	NULL,	IDS_CMD_FORCE_COPY,	NULL,	FastCopy::DIFFCP_MODE,	FastCopy::BY_ALWAYS },
	{ IDS_SYNCCOPY,		NULL,	IDS_CMD_SYNC,		NULL,	FastCopy::SYNCCP_MODE,	FastCopy::BY_ATTR },
//	{ IDS_MOVEATTR,		NULL,	IDS_CMD_MOVE,		NULL,	FastCopy::MOVE_MODE,	FastCopy::BY_ATTR },
	{ IDS_MOVEFORCE,	NULL,	IDS_CMD_MOVE,		NULL,	FastCopy::MOVE_MODE,	FastCopy::BY_ALWAYS },
	{ IDS_DELETE,		NULL,	IDS_CMD_DELETE,		NULL,	FastCopy::DELETE_MODE,	FastCopy::BY_ALWAYS },
	{ 0,				NULL,	0,					NULL,	(FastCopy::Mode)0,		(FastCopy::OverWrite)0 }
};

void TMainDlg::SetPathHistory(void)
{
	int		item[] = { SRC_COMBO, DST_COMBO, 0 };
	void	**history[] = { cfg.srcPathHistory, cfg.dstPathHistory, NULL };

	SetHistory(item, history);
}

void TMainDlg::SetFilterHistory(void)
{
	int		item[] = { INCLUDE_COMBO, EXCLUDE_COMBO, 0 };
	void	**history[] = { cfg.includeHistory, cfg.excludeHistory, NULL };

	SetHistory(item, history);
}

void TMainDlg::SetHistory(int *item, void ***history)
{
	for (int i=0; item[i]; i++) {
		SendDlgItemMessage(item[i], CB_RESETCONTENT, 0, 0);
		for (int j=0; j < cfg.maxHistory; j++) {
			if (GetChar(history[i][j], 0))
				SendDlgItemMessageV(item[i], CB_INSERTSTRING, j, (LPARAM)history[i][j]);
		}
		if (cfg.maxHistory > 0 && ::IsWindowEnabled(GetDlgItem(item[i])))
			SetDlgItemTextV(item[i], history[i][0]);
	}
}

BOOL TMainDlg::SetMiniWindow(void)
{
	GetWindowRect(&rect);
	int height = rect.bottom - rect.top - (isErrEditHide ? 0 : normalHeight - miniHeight);
	isErrEditHide = TRUE;
	MoveWindow(rect.left, rect.top, rect.right - rect.left, height, ::IsWindowVisible(hWnd));
	return	TRUE;
}

BOOL TMainDlg::SetNormalWindow(void)
{
	if (::IsWindowVisible(hWnd)) {
		GetWindowRect(&rect);
		int height = rect.bottom - rect.top + (isErrEditHide ? normalHeight - miniHeight : 0);
		isErrEditHide = FALSE;
		MoveWindow(rect.left, rect.top, rect.right - rect.left, height, TRUE);
	}
	return	TRUE;
}

BOOL TMainDlg::EvCreate(LPARAM lParam)
{
	int		i;

	hAccel = LoadAccelerators(TApp::GetInstance(), (LPCSTR)IDR_ACCEL);

	for (i=0; i < MAX_FASTCOPY_ICON; i++)
		hMainIcon[i] = ::LoadIcon(TApp::GetInstance(), (LPCSTR)(FASTCOPY_ICON + i));
	::SetClassLong(hWnd, GCL_HICON, (LONG)hMainIcon[FCNORMAL_ICON_INDEX]);

	SetSize();

	isErrEditHide = FALSE;
	// 椺奜僼傿儖僞偺愝掕
	SetWindowTitle("FastCopy %s", GetVersionStr());

	TaskBarCreateMsg = ::RegisterWindowMessage("TaskbarCreated");

	// 棜楌僙僢僩
	SetPathHistory();
	SetFilterHistory();

	// 儊僢僙乕僕僙僢僩
	SetDlgItemText(STATUS_EDIT, GetLoadStr(IDS_BEHAVIOR));
	SetDlgItemInt(BUFSIZE_EDIT, cfg.bufSize);

	// 僐僺乕儌乕僪儕僗僩嶌惉
	for (i=0; COPYINFO_LIST[i].resId; i++) {
		COPYINFO_LIST[i].list_str = GetLoadStr(COPYINFO_LIST[i].resId);
		SendDlgItemMessage(MODE_COMBO, CB_ADDSTRING, 0, (LPARAM)COPYINFO_LIST[i].list_str);
		COPYINFO_LIST[i].cmdline_name = GetLoadStrV(COPYINFO_LIST[i].cmdline_resId);
	}
	UpdateMenu();

	// 僐僺乕儌乕僪儕僗僩偺僨僼僅儖僩慖戰
	SendDlgItemMessage(MODE_COMBO, CB_SETCURSEL, cfg.copyMode, 0);

	::CheckDlgButton(hWnd, IGNORE_CHECK, cfg.ignoreErr);
	::CheckDlgButton(hWnd, ESTIMATE_CHECK, cfg.estimateMode);
	::CheckDlgButton(hWnd, AUTOSLOW_CHECK, isAutoSlow = cfg.isAutoSlow);
	::CheckDlgButton(hWnd, TOPLEVEL_CHECK, cfg.isTopLevel);
	SetForegroundWindow();
	if (cfg.isTopLevel)
		SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOMOVE);

	SendDlgItemMessage(STATUS_EDIT, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);
//	SendDlgItemMessage(ERR_EDIT, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);
	SendDlgItemMessage(ERR_EDIT, EM_SETTARGETDEVICE, 0, 0);		// 愜傝曉偟
	SendDlgItemMessage(ERR_EDIT, EM_LIMITTEXT, 0, 0);
	SendDlgItemMessage(PATH_EDIT, EM_LIMITTEXT, 0, 0);

	GetWindowRect(&rect);

	int	offset_x = (GetSystemMetrics(SM_CXFULLSCREEN) - (rect.right - rect.left)) / 2;
	int	offset_y = (GetSystemMetrics(SM_CYFULLSCREEN) - (rect.bottom - rect.top)) / 2;

	SetWindowPos(NULL, offset_x, offset_y, 0, 0, SWP_NOSIZE|SWP_NOZORDER);

	RECT	path_rect, err_rect;
	GetWindowRect(&rect);
	::GetWindowRect(GetDlgItem(PATH_EDIT), &path_rect);
	::GetWindowRect(GetDlgItem(ERR_EDIT), &err_rect);
	SendDlgItemMessage(PATH_EDIT, EM_SETBKGNDCOLOR, 0, ::GetSysColor(COLOR_3DFACE));
	SendDlgItemMessage(ERR_EDIT, EM_SETBKGNDCOLOR, 0, ::GetSysColor(COLOR_3DFACE));
	normalHeight	= rect.bottom - rect.top;
	miniHeight		= normalHeight - (err_rect.bottom - path_rect.bottom);
	SetMiniWindow();

	int		argc;
	void	**argv;

	argv = CommandLineToArgvV(::GetCommandLineV(), &argc);

	// command line mode
	if (argc > 1) {
		if (!CommandLineExecV(argc, argv) && (!isShellExt || autoCloseLevel >= NOERR_CLOSE)) {
			if (::GetAsyncKeyState(VK_SHIFT) & 0x8000)
				autoCloseLevel = NO_CLOSE;
			else
				PostMessage(WM_CLOSE, 0, 0);
		}
	}
	else
		Show();
	return	TRUE;
}

BOOL TMainDlg::EvNcDestroy(void)
{
	TaskTray(NIM_DELETE);
	PostQuitMessage(0);
	return	TRUE;
}

BOOL TMainDlg::CancelCopy()
{
	if (!isDelay)
		fastCopy.Suspend();

	::KillTimer(hWnd, FASTCOPY_TIMER);
	int	ret = TMsgBox(this).Exec(GetLoadStr(IsListing() ? IDS_LISTCONFIRM : info.mode == FastCopy::DELETE_MODE ? IDS_DELSTOPCONFIRM : IDS_STOPCONFIRM), FASTCOPY, MB_OKCANCEL);

	if (isDelay) {
		isDelay = FALSE;
		EndCopy();
	}
	else {
		fastCopy.Resume();

		if (ret == IDOK)
			fastCopy.Aborting();
		else
			::SetTimer(hWnd, FASTCOPY_TIMER, 1000, NULL);
	}

	return	ret == IDOK ? TRUE : FALSE;
}

BOOL TMainDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl)
{
	switch (wID) {
	case IDOK: case LIST_BUTTON:
		if (!fastCopy.IsStarting() && !isDelay) {
			if ((::GetTickCount() - endTick) > 1000)
				ExecCopy(wID == LIST_BUTTON ? LISTING_EXEC : NORMAL_EXEC);
		}
		else if (CancelCopy()) {
			autoCloseLevel = NO_CLOSE;
		}
		return	TRUE;

	case IDCANCEL: case CLOSE_MENUITEM:
		if (!fastCopy.IsStarting()) {
			EndDialog(wID);
		}
		else if (fastCopy.IsAborting()) {
			if (TMsgBox(this).Exec(GetLoadStr(IDS_CONFIRMFORCEEND), FASTCOPY, MB_OKCANCEL) == IDOK)
				EndDialog(wID);
		}
		else {
			CancelCopy();
			autoCloseLevel = NOERR_CLOSE;
		}
		return	TRUE;

	case ATONCE_BUTTON:
		isDelay = FALSE;
		::KillTimer(hWnd, FASTCOPY_TIMER);
		ExecCopyCore();
		return	TRUE;

	case SRC_FILE_BUTTON:
		BrowseDirDlgV(this, SRC_COMBO, GetLoadStrV(IDS_SRC_SELECT), BRDIR_VQUOTE|BRDIR_FILESELECT);
		return	TRUE;

	case DST_FILE_BUTTON:
		BrowseDirDlgV(this, DST_COMBO, GetLoadStrV(IDS_DST_SELECT), BRDIR_BACKSLASH);
		return	TRUE;

	case TOPLEVEL_CHECK:
		cfg.isTopLevel = IsDlgButtonChecked(TOPLEVEL_CHECK);
		SetWindowPos(cfg.isTopLevel ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOMOVE);
		cfg.WriteIni();
		break;

	case MODE_COMBO:
		if (wNotifyCode == CBN_SELCHANGE) {
			BOOL	is_delete = GetCopyMode() == FastCopy::DELETE_MODE;
			if (is_delete && isNetPlaceSrc) {
				SetDlgItemTextV(SRC_COMBO, EMPTY_STR_V);
				isNetPlaceSrc = FALSE;
			}
			SetItemEnable(is_delete);
		}
		return	TRUE;

	case FILTER_CHECK:
		ReflectFilterCheck();
		return	TRUE;

	case OPENDIR_MENUITEM:
		::ShellExecute(NULL, NULL, cfg.execDir, 0, 0, SW_SHOW);
		return	TRUE;

	case AUTOSLOW_CHECK:
		isAutoSlow = IsDlgButtonChecked(AUTOSLOW_CHECK);
		return	TRUE;

	case SETUP_MENUITEM:
		if (setupDlg.Exec() == IDOK) {
			SetDlgItemInt(BUFSIZE_EDIT, cfg.bufSize);
			CheckDlgButton(IGNORE_CHECK, cfg.ignoreErr);
			CheckDlgButton(ESTIMATE_CHECK, cfg.estimateMode);
			CheckDlgButton(AUTOSLOW_CHECK, cfg.isAutoSlow);
			isErrLog = cfg.isErrLog;
			skipEmptyDir = cfg.skipEmptyDir;
			forceStart = cfg.forceStart;
		}
		return	TRUE;

	case SHELLEXT_MENUITEM:
		shellExtDlg.Exec();
		return	TRUE;

	case ABOUT_MENUITEM:
		aboutDlg.Exec();
		return	TRUE;

	case FASTCOPYURL_MENUITEM:
		::ShellExecute(NULL, NULL, GetLoadStr(IDS_FASTCOPYURL), NULL, NULL, SW_SHOW);
		return	TRUE;

	case AUTODISK_MENUITEM: case SAMEDISK_MENUITEM: case DIFFDISK_MENUITEM:
		diskMode = wID - AUTODISK_MENUITEM;
		UpdateMenu();
		break;

	case IDR_DISKMODE:
		diskMode = (diskMode + 1) % 3;
		UpdateMenu();
		break;

	case JOB_MENUITEM:
		jobDlg.Exec();
		UpdateMenu();
		return	TRUE;

	case HELP_BUTTON: case HELP_MENUITEM:
		ShowHelp(hWnd, cfg.execDir, GetLoadStr(IDS_FASTCOPYHELP), wID == HELP_BUTTON ? "#usage" : NULL);
		return	TRUE;

	default:

⌨️ 快捷键说明

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