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

📄 mainwin.cpp

📁 fastcopy是一个非常快速的数据拷贝软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
static char *mainwin_id = 
	"@(#)Copyright (C) H.Shirouzu 2004-2008   mainwin.cpp	ver1.71";
/* ========================================================================
	Project  Name			: Fast/Force copy file and directory
	Create					: 2004-09-15(Wed)
	Update					: 2008-02-05(Tue)
	Copyright				: H.Shirouzu
	Reference				: 
	======================================================================== */

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

/*=========================================================================
  僋儔僗 丗 TFastCopyApp
  奣  梫 丗 傾僾儕働乕僔儑儞僋儔僗
  愢  柧 丗 
  拲  堄 丗 
=========================================================================*/
TFastCopyApp::TFastCopyApp(HINSTANCE _hI, LPSTR _cmdLine, int _nCmdShow) : TApp(_hI, _cmdLine, _nCmdShow)
{
	LoadLibrary("RICHED20.DLL");
//	LoadLibrary("SHELL32.DLL");
//	LoadLibrary("COMCTL32.DLL");
//	LoadLibrary("COMDLG32.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;
	isUtf8Log = cfg.isUtf8Log && IS_WINNT_V;
	isReparse = cfg.isReparse;
	forceStart = cfg.forceStart;
	isTaskTray = noConfirmDel = FALSE;
	isNetPlaceSrc = FALSE;
	skipEmptyDir = cfg.skipEmptyDir;
	diskMode = cfg.diskMode;
	curForeWnd = NULL;
	isErrEditHide = FALSE;
	isRunAsStart = FALSE;
	isRunAsParent = FALSE;
	strcpyV(logFile, cfg.logPath);

//	isRegExp = FALSE;
//	isFilter = FALSE;
	curPriority = ::GetPriorityClass(::GetCurrentProcess());

	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(BOOL set_edit)
{
	if (GetCopyMode() == FastCopy::DELETE_MODE) {
		SetComboBox(SRC_COMBO, cfg.delPathHistory, set_edit);
	}
	else {
		SetComboBox(SRC_COMBO, cfg.srcPathHistory, set_edit);
		SetComboBox(DST_COMBO, cfg.dstPathHistory, set_edit);
	}
}

void TMainDlg::SetFilterHistory(BOOL set_edit)
{
	SetComboBox(INCLUDE_COMBO, cfg.includeHistory, set_edit);
	SetComboBox(EXCLUDE_COMBO, cfg.excludeHistory, set_edit);
}

void TMainDlg::SetComboBox(int item, void **history, BOOL set_edit)
{
	DWORD	len = 0;
	WCHAR	*wbuf = NULL;

	if (!set_edit) {
		len = ::GetWindowTextLengthV(GetDlgItem(item));
		wbuf = new WCHAR [len + 1];
		if (GetDlgItemTextV(item, wbuf, len + 1) != len)
			return;
	}

	SendDlgItemMessage(item, CB_RESETCONTENT, 0, 0);

	for (int i=0; i < cfg.maxHistory; i++) {
		if (GetChar(history[i], 0))
			SendDlgItemMessageV(item, CB_INSERTSTRING, i, (LPARAM)history[i]);
	}
	if (!set_edit) {
		if (!SetDlgItemTextV(item, wbuf)) {
			SendDlgItemMessage(item, CB_RESETCONTENT, 0, 0);
		}
	}
	else if (cfg.maxHistory > 0 /* && ::IsWindowEnabled(GetDlgItem(item) */)
		SetDlgItemTextV(item, history[0]);

	delete [] wbuf;
}

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());
	return	TRUE;
}

BOOL TMainDlg::SetNormalWindow(void)
{
	if (IsWindowVisible()) {
		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::MoveCenter(BOOL isShow)
{
	POINT	pt;
	::GetCursorPos(&pt);

	RECT	screen_rect = { 0, 0, ::GetSystemMetrics(SM_CXFULLSCREEN), ::GetSystemMetrics(SM_CYFULLSCREEN) };

	if (MonitorFromPointV && GetMonitorInfoV) {
		HMONITOR	hMon;

		if ((hMon = ::MonitorFromPointV(pt, MONITOR_DEFAULTTONEAREST)) != NULL) {
			MONITORINFO	info;
			info.cbSize = sizeof(info);

			if (::GetMonitorInfoV(hMon, &info) && (info.rcMonitor.right - info.rcMonitor.left) > 0 && (info.rcMonitor.bottom - info.rcMonitor.top) > 0)
				screen_rect = info.rcMonitor;
		}
	}

	pt.x = screen_rect.left + ((screen_rect.right - screen_rect.left) - (rect.right - rect.left)) / 2;
	pt.y = screen_rect.top + ((screen_rect.bottom - screen_rect.top) - (rect.bottom - rect.top)) / 2;

	return	SetWindowPos(NULL, pt.x, pt.y, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
}

BOOL TMainDlg::SetupWindow()
{
	static BOOL once = FALSE;

	if (once)
		return TRUE;

	once = TRUE;
	EnableWindow(TRUE);

	if (cfg.isTopLevel)
		SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOMOVE);

	MoveCenter(TRUE);
	SetItemEnable(GetCopyMode() == FastCopy::DELETE_MODE);

	SetMiniWindow();
	return	TRUE;
}

BOOL TMainDlg::EvCreate(LPARAM lParam)
{
//	if (IS_WINNT_V && TIsWow64()) {
//		DWORD	val = 0;
//		TWow64DisableWow64FsRedirection(&val);
//	}

	if (IsWinVista() && TIsUserAnAdmin() && TIsEnableUAC()) {
		SetVersionStr(TRUE);
	}

	char	title[100];
	sprintf(title, "FastCopy %s", GetVersionStr());
	InstallExceptionFilter(title, GetLoadStr(IDS_EXCEPTIONLOG));
	SetWindowTitle(title);

	if (IsWinVista() && !TIsUserAnAdmin()) {
		if (cfg.isRunasButton) {
			HWND	hRunas = GetDlgItem(RUNAS_BUTTON);
			::SetWindowLong(hRunas, GWL_STYLE, ::GetWindowLong(hRunas, GWL_STYLE) | WS_VISIBLE);
			::SendMessage(hRunas, BCM_SETSHIELD, 0, 1);
		}
		else {
			::SetMenu(hWnd, ::LoadMenu(TApp::GetInstance(), (LPCSTR)MAIN_RUNAS_MENU));
		}
		if (TIsEnableUAC() && TIsVirtualizedDir(cfg.execDir)) {
			::InsertMenu(::GetSubMenu(::GetMenu(hWnd), 0), 0, MF_STRING|MF_BYPOSITION, USERDIR_MENUITEM, GetLoadStr(IDS_USERDIR_MENU));
		}
	}

	int		i;
	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]);

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

	TaskBarCreateMsg = ::RegisterWindowMessage("TaskbarCreated");

	// 儊僢僙乕僕僙僢僩
	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(IGNORE_CHECK, cfg.ignoreErr);
	CheckDlgButton(ESTIMATE_CHECK, cfg.estimateMode);
	CheckDlgButton(TOPLEVEL_CHECK, cfg.isTopLevel);
	CheckDlgButton(OWDEL_CHECK, cfg.enableOwdel);
	CheckDlgButton(ACL_CHECK, cfg.enableAcl && IS_WINNT_V);
	CheckDlgButton(STREAM_CHECK, cfg.enableStream && IS_WINNT_V);

	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);

	// 僗儔僀僟僐儞僩儘乕儖
	SendDlgItemMessage(SPEED_SLIDER, TBM_SETRANGE, FALSE, MAKELONG(SPEED_SUSPEND, SPEED_FULL));
	SetSpeedLevelLabel(this, speedLevel = cfg.speedLevel);

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

	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);

	int		argc;
	void	**argv;

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

	// command line mode
	if (argc > 1) {
		// isRunAsParent 偺応崌偼丄Child懁偐傜偺 CLOSE 傪懸偮偨傔丄帺庡廔椆偟側偄
		if (!CommandLineExecV(argc, argv) && (!isShellExt || autoCloseLevel >= NOERR_CLOSE) && !isRunAsParent) {
			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();

⌨️ 快捷键说明

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