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

📄 miscdlg.cpp

📁 fastcopy是一个非常快速的数据拷贝软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
static char *miscdlg_id = 
	"@(#)Copyright (C) H.Shirouzu 2005-2008   miscdlg.cpp	Ver1.71";
/* ========================================================================
	Project  Name			: Fast/Force copy file and directory
	Create					: 2005-01-23(Sun)
	Update					: 2008-02-02(Sat)
	Copyright				: H.Shirouzu
	Reference				: 
	======================================================================== */

#include "mainwin.h"
#include <stdio.h>

// HtmlHelp WorkShop 傪僀儞僗僩乕儖偟偰丄htmlhelp.h 傪 include path 偵
// 擖傟傞偙偲丅
#define ENABLE_HTML_HELP
#if defined(ENABLE_HTML_HELP)
#include <htmlhelp.h>
#endif

/*
	About Dialog弶婜壔張棟
*/
TAboutDlg::TAboutDlg(TWin *_parent) : TDlg(ABOUT_DIALOG, _parent)
{
}

/*
	Window 惗惉帪偺 CallBack
*/
BOOL TAboutDlg::EvCreate(LPARAM lParam)
{
	char	org[MAX_PATH], buf[MAX_PATH];

	GetDlgItemText(ABOUT_STATIC, org, sizeof(org));
	sprintf(buf, org, GetVersionStr());
	SetDlgItemText(ABOUT_STATIC, buf);

	if (rect.left == CW_USEDEFAULT)
	{
		GetWindowRect(&rect);
		int xsize = rect.right - rect.left, ysize = rect.bottom - rect.top;
		int	cx = ::GetSystemMetrics(SM_CXFULLSCREEN), cy = ::GetSystemMetrics(SM_CYFULLSCREEN);
		int	x = (cx - xsize)/2;
		int y = (cy - ysize)/2;

		MoveWindow((x < 0) ? 0 : x % (cx - xsize), (y < 0) ? 0 : y % (cy - ysize), xsize, ysize, FALSE);
	}
	else
		MoveWindow(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, FALSE);

	return	TRUE;
}

BOOL TAboutDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
	switch (wID)
	{
	case IDOK:
	case IDCANCEL:
		EndDialog(wID);
		return	TRUE;

	case URL_BUTTON:
		::ShellExecute(NULL, NULL, GetLoadStr(IDS_FASTCOPYURL), NULL, NULL, SW_SHOW);
		return	TRUE;
	}
	return	FALSE;
}

/*
	Setup Dialog弶婜壔張棟
*/
TSetupDlg::TSetupDlg(Cfg *_cfg, TWin *_parent) : TDlg(SETUP_DIALOG, _parent)
{
	cfg = _cfg;
}

/*
	Window 惗惉帪偺 CallBack
*/
BOOL TSetupDlg::EvCreate(LPARAM lParam)
{
	SetDlgItemInt(BUFSIZE_EDIT, cfg->bufSize);
	SetDlgItemInt(MAXTRANS_EDIT, cfg->maxTransSize);
	SetDlgItemInt(NONBUFMINNTFS_EDIT, cfg->nbMinSizeNtfs);
	SetDlgItemInt(NONBUFMINFAT_EDIT, cfg->nbMinSizeFat);
	SetDlgItemInt(HISTORY_EDIT, cfg->maxHistoryNext);
	CheckDlgButton(IGNORE_CHECK, cfg->ignoreErr);
	CheckDlgButton(ESTIMATE_CHECK, cfg->estimateMode);
	CheckDlgButton(ERRLOG_CHECK, cfg->isErrLog);
	CheckDlgButton(UTF8LOG_CHECK, cfg->isUtf8Log && IS_WINNT_V);
	::EnableWindow(GetDlgItem(UTF8LOG_CHECK), IS_WINNT_V);
	CheckDlgButton(OWDEL_CHECK, cfg->enableOwdel);

	CheckDlgButton(ACL_CHECK, cfg->enableAcl && IS_WINNT_V);
	CheckDlgButton(STREAM_CHECK, cfg->enableStream && IS_WINNT_V);
	::EnableWindow(GetDlgItem(ACL_CHECK), IS_WINNT_V);
	::EnableWindow(GetDlgItem(STREAM_CHECK), IS_WINNT_V);

	CheckDlgButton(REPARSE_CHECK, cfg->isReparse);
	::EnableWindow(GetDlgItem(REPARSE_CHECK), IS_WINNT_V);

	CheckDlgButton(NSA_CHECK, cfg->enableNSA);
	CheckDlgButton(EMPTYDIR_CHECK, cfg->skipEmptyDir);
	CheckDlgButton(EXECCONFIRM_CHECK, cfg->execConfirm);
	CheckDlgButton(FORCESTART_CHECK, cfg->forceStart);
	CheckDlgButton(SAMEDIR_RENAME_CHECK, cfg->isSameDirRename);
	SendDlgItemMessage(SPEED_SLIDER, TBM_SETRANGE, FALSE, MAKELONG(SPEED_SUSPEND, SPEED_FULL));
	SetSpeedLevelLabel(this, cfg->speedLevel);

	if (rect.left == CW_USEDEFAULT)
	{
		GetWindowRect(&rect);
		int xsize = rect.right - rect.left, ysize = rect.bottom - rect.top;
		int	cx = ::GetSystemMetrics(SM_CXFULLSCREEN), cy = ::GetSystemMetrics(SM_CYFULLSCREEN);
		int	x = (cx - xsize)/2;
		int y = (cy - ysize)/2;

		MoveWindow((x < 0) ? 0 : x % (cx - xsize), (y < 0) ? 0 : y % (cy - ysize), xsize, ysize, FALSE);
	}
	else
		MoveWindow(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, FALSE);

	return	TRUE;
}

BOOL TSetupDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
	switch (wID)
	{
	case IDOK:
		cfg->bufSize = GetDlgItemInt(BUFSIZE_EDIT);
		cfg->maxTransSize = GetDlgItemInt(MAXTRANS_EDIT);
		cfg->nbMinSizeNtfs = GetDlgItemInt(NONBUFMINNTFS_EDIT);
		cfg->nbMinSizeFat = GetDlgItemInt(NONBUFMINFAT_EDIT);
		cfg->maxHistoryNext = GetDlgItemInt(HISTORY_EDIT);
		cfg->ignoreErr = IsDlgButtonChecked(IGNORE_CHECK);
		cfg->estimateMode = IsDlgButtonChecked(ESTIMATE_CHECK);
		cfg->isErrLog = IsDlgButtonChecked(ERRLOG_CHECK);
		cfg->isUtf8Log = IsDlgButtonChecked(UTF8LOG_CHECK) && IS_WINNT_V;
		cfg->enableOwdel = IsDlgButtonChecked(OWDEL_CHECK);
		cfg->enableAcl = IsDlgButtonChecked(ACL_CHECK);
		cfg->enableStream = IsDlgButtonChecked(STREAM_CHECK);
		cfg->enableNSA = IsDlgButtonChecked(NSA_CHECK);
		cfg->isReparse = IsDlgButtonChecked(REPARSE_CHECK);
		cfg->skipEmptyDir = IsDlgButtonChecked(EMPTYDIR_CHECK);
		cfg->execConfirm = IsDlgButtonChecked(EXECCONFIRM_CHECK);
		cfg->forceStart = IsDlgButtonChecked(FORCESTART_CHECK);
		cfg->speedLevel = SendDlgItemMessage(SPEED_SLIDER, TBM_GETPOS, 0, 0);
		cfg->WriteIni();
		EndDialog(wID);
		return	TRUE;

	case IDCANCEL:
		EndDialog(wID);
		return	TRUE;
	}
	return	FALSE;
}

BOOL TSetupDlg::EventScroll(UINT uMsg, int Code, int nPos, HWND hwndScrollBar)
{
	SetSpeedLevelLabel(this);
	return	TRUE;
}


/*
	ShellExt
*/
#define CURRENT_SHEXTDLL	"fastext1.dll"
#define CURRENT_SHEXT64DLL	"fastex64.dll"
#define REGISTER_PROC		"DllRegisterServer"
#define UNREGISTER_PROC		"DllUnregisterServer"
#define ISREGISTER_PROC		"IsRegistServer"
#define SETMENUFLAGS_PROC	"SetMenuFlags"
#define GETMENUFLAGS_PROC	"GetMenuFlags"
#define UPDATEDLL_PROC		"UpdateDll"

BOOL ShellExt::Load(char *parent_dir, char *dll_name)
{
	if (hShellExtDll)
		UnLoad();

	char	path[MAX_PATH];
	MakePath(path, parent_dir, dll_name);
	if ((hShellExtDll = TLoadLibrary(path)) == NULL)
		return	FALSE;

	RegisterDllProc		= (HRESULT (WINAPI *)(void))GetProcAddress(hShellExtDll, REGISTER_PROC);
	UnRegisterDllProc	= (HRESULT (WINAPI *)(void))GetProcAddress(hShellExtDll, UNREGISTER_PROC);
	IsRegisterDllProc	= (BOOL (WINAPI *)(void))GetProcAddress(hShellExtDll, ISREGISTER_PROC);
	SetMenuFlagsProc	= (BOOL (WINAPI *)(int))GetProcAddress(hShellExtDll, SETMENUFLAGS_PROC);
	GetMenuFlagsProc	= (int (WINAPI *)(void))GetProcAddress(hShellExtDll, GETMENUFLAGS_PROC);
	UpdateDllProc		= (BOOL (WINAPI *)(void))GetProcAddress(hShellExtDll, UPDATEDLL_PROC);

	if (!RegisterDllProc || !UnRegisterDllProc || !IsRegisterDllProc || !SetMenuFlagsProc || !GetMenuFlagsProc || !UpdateDllProc) {
		::FreeLibrary(hShellExtDll);
		hShellExtDll = NULL;
		return	FALSE;
	}
	return	TRUE;
}

BOOL ShellExt::UnLoad(void)
{
	if (hShellExtDll) {
		::FreeLibrary(hShellExtDll);
		hShellExtDll = NULL;
	}
	return	TRUE;
}

/*
	ShellExt Dialog弶婜壔張棟
*/
TShellExtDlg::TShellExtDlg(Cfg *_cfg, TWin *_parent) : TDlg(SHELLEXT_DIALOG, _parent)
{
	cfg = _cfg;
}

/*
	Window 惗惉帪偺 CallBack
*/
BOOL TShellExtDlg::EvCreate(LPARAM lParam)
{
	if (shellExt.Load(cfg->execDir, CURRENT_SHEXTDLL) == FALSE) {
		TMsgBox(this).Exec("Can't load " CURRENT_SHEXTDLL);
		PostMessage(WM_CLOSE, 0, 0);
		return	FALSE;
	}

	ReflectStatus();

	if (rect.left == CW_USEDEFAULT)
	{
		GetWindowRect(&rect);
		int xsize = rect.right - rect.left, ysize = rect.bottom - rect.top;
		int	cx = ::GetSystemMetrics(SM_CXFULLSCREEN), cy = ::GetSystemMetrics(SM_CYFULLSCREEN);
		int	x = (cx - xsize)/2;
		int y = (cy - ysize)/2;

		MoveWindow((x < 0) ? 0 : x % (cx - xsize), (y < 0) ? 0 : y % (cy - ysize), xsize, ysize, FALSE);
	}
	else
		MoveWindow(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, FALSE);

	return	TRUE;
}

BOOL TShellExtDlg::ReflectStatus(void)
{
	BOOL	isRegister = shellExt.IsRegisterDllProc();
	int		flags;

	SetDlgItemText(IDSHELLEXT_OK, isRegister ? GetLoadStr(IDS_SHELLEXT_MODIFY) : GetLoadStr(IDS_SHELLEXT_EXEC));
	::EnableWindow(GetDlgItem(IDSHELLEXT_CANCEL), isRegister);

	if ((flags = shellExt.GetMenuFlagsProc()) == -1)
		flags = SHEXT_RIGHT_COPY|SHEXT_RIGHT_DELETE|SHEXT_DD_COPY|SHEXT_DD_MOVE;

	CheckDlgButton(RIGHT_COPY_CHECK, flags & SHEXT_RIGHT_COPY);
	CheckDlgButton(RIGHT_DELETE_CHECK, flags & SHEXT_RIGHT_DELETE);
	CheckDlgButton(DD_COPY_CHECK, flags & SHEXT_DD_COPY);
	CheckDlgButton(DD_MOVE_CHECK, flags & SHEXT_DD_MOVE);
	CheckDlgButton(RIGHT_SUBMENU_CHECK, flags & SHEXT_SUBMENU_RIGHT);
	CheckDlgButton(DD_SUBMENU_CHECK, flags & SHEXT_SUBMENU_DD);

	CheckDlgButton(AUTOCLOSE_CHECK, cfg->shextAutoClose);
	CheckDlgButton(TASKTRAY_CHECK, cfg->shextTaskTray);
	CheckDlgButton(RIGHT_NOCONFIRM_CHECK, cfg->shextRNoConfirm);
	CheckDlgButton(DD_NOCONFIRM_CHECK, cfg->shextDdNoConfirm);

	return	TRUE;
}

BOOL TShellExtDlg::EvNcDestroy(void)
{
	if (shellExt.Status())
		shellExt.UnLoad();
	return	TRUE;
}

BOOL TShellExtDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
	switch (wID)
	{
	case IDSHELLEXT_OK: case IDSHELLEXT_CANCEL:
		if (IsWinXP() && !TIsUserAnAdmin()) {
			TMsgBox(this).Exec(GetLoadStr(IDS_REQUIRE_ADMIN));
			return	TRUE;
		}
		if (RegisterShellExt(wID == IDSHELLEXT_OK ? TRUE : FALSE) == FALSE) {
			TMsgBox(this).Exec("ShellExt Error");
		}
		ReflectStatus();
		if (wID == IDSHELLEXT_OK)
			EndDialog(wID);
		return	TRUE;

	case IDOK: case IDCANCEL:
		EndDialog(wID);
		return	TRUE;
	}
	return	FALSE;
}

BOOL TShellExtDlg::RegisterShellExt(BOOL is_register)
{
	if (shellExt.Status() == FALSE)
		return	FALSE;

	cfg->shextAutoClose = IsDlgButtonChecked(AUTOCLOSE_CHECK);
	cfg->shextTaskTray = IsDlgButtonChecked(TASKTRAY_CHECK);
	cfg->shextRNoConfirm = is_register && IsDlgButtonChecked(RIGHT_NOCONFIRM_CHECK);
	cfg->shextDdNoConfirm = is_register && IsDlgButtonChecked(DD_NOCONFIRM_CHECK);
	cfg->WriteIni();

	if (IS_WINNT_V && TIsWow64()) {
		char	arg[1024];
		sprintf(arg, "%s,%s", CURRENT_SHEXT64DLL, is_register ? "DllRegisterServer" : "DllUnregisterServer");
		ShellExecute(NULL, NULL, "rundll32.exe", arg, NULL, SW_SHOW);
/*
		SHELLEXECUTEINFO	sei = {0};
		sei.cbSize = sizeof(SHELLEXECUTEINFO);
		sei.lpVerb = "runas";
		sei.lpFile = "cmd.exe";
		sei.nShow = SW_MAXIMIZE;
		sprintf(arg, "/C \"rundll32.exe %s,%s\"", CURRENT_SHEXT64DLL, is_register ? "DllRegisterServer" : "DllUnregisterServer");
		sei.lpParameters = arg;
		::ShellExecuteEx(&sei);
*/
	}

	if (!is_register)
		return	shellExt.UnRegisterDllProc() == S_OK ? TRUE : FALSE;

	int		flags = 0;

	if (IsDlgButtonChecked(RIGHT_COPY_CHECK))
		flags |= SHEXT_RIGHT_COPY;

	if (IsDlgButtonChecked(RIGHT_DELETE_CHECK))
		flags |= SHEXT_RIGHT_DELETE;

	if (IsDlgButtonChecked(RIGHT_SUBMENU_CHECK))
		flags |= SHEXT_SUBMENU_RIGHT;

	if (IsDlgButtonChecked(DD_COPY_CHECK))
		flags |= SHEXT_DD_COPY;

	if (IsDlgButtonChecked(DD_MOVE_CHECK))
		flags |= SHEXT_DD_MOVE;

	if (IsDlgButtonChecked(DD_SUBMENU_CHECK))
		flags |= SHEXT_SUBMENU_DD;

	if (shellExt.RegisterDllProc() != S_OK)
		return	FALSE;

	return	shellExt.SetMenuFlagsProc(flags);
}

BOOL UpdateShellExt(Cfg *cfg)
{
	ShellExt	shellExt;

	return	shellExt.Load(cfg->execDir, CURRENT_SHEXTDLL) && shellExt.UpdateDllProc();
}

int TExecConfirmDlg::Exec(const void *_src, const void *_dst)
{
	src = _src;
	dst = _dst;

	return	TDlg::Exec();
}

BOOL TExecConfirmDlg::EvCreate(LPARAM lParam)
{
	if (title)

⌨️ 快捷键说明

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