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

📄 mainwin.cpp

📁 fastcopy是一个非常快速的数据拷贝软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	return	TRUE;
}

void TMainDlg::Show(int mode)
{
	if (mode != SW_HIDE) {
		SetupWindow();
	}
	TDlg::Show(mode);
}

BOOL TMainDlg::TaskTray(int nimMode, HICON hSetIcon, LPCSTR tip)
{
	NOTIFYICONDATA	tn;

	isTaskTray = nimMode == NIM_DELETE ? FALSE : TRUE;

	memset(&tn, 0, sizeof(tn));
	tn.cbSize = sizeof(tn);
	tn.hWnd = hWnd;
	tn.uID = FASTCOPY_NIM_ID;		// test
	tn.uFlags = NIF_MESSAGE|(hSetIcon ? NIF_ICON : 0)|(tip ? NIF_TIP : 0);
	tn.uCallbackMessage = WM_FASTCOPY_NOTIFY;
	tn.hIcon = hSetIcon;
	if (tip)
		sprintf(tn.szTip, "%.63s", tip);

	return	::Shell_NotifyIcon(nimMode, &tn);
}

#ifndef SF_UNICODE
#define SF_UNICODE                                  0x00000010
#endif

DWORD CALLBACK RichEditStreamCallBack(DWORD dwCookie, BYTE *buf, LONG cb, LONG *pcb)
{
	WCHAR **text = (WCHAR **)dwCookie;

	int	len = wcslen(*text);
	if (len * sizeof(WCHAR) > (DWORD)cb) {
		len = cb / sizeof(WCHAR);
	}
	if (len <= 0)
		return	1;

	memcpy(buf, *text, len * sizeof(WCHAR));
	*text = *text + len;
	*pcb = len * sizeof(WCHAR);

	return	0;
}

BOOL RichEditAppendText(HWND hWnd, void *text)
{
	SendMessageV(hWnd, EM_SETSEL, (WPARAM)-1, (LPARAM)-1);

	if (IS_WINNT_V) {
		EDITSTREAM es = { (DWORD)&text, 0, RichEditStreamCallBack };
		return	SendMessageV(hWnd, EM_STREAMIN, (WPARAM)(SF_TEXT|SFF_SELECTION|SF_UNICODE), (LPARAM)&es);
	}
	return	SendMessageV(hWnd, EM_REPLACESEL, 0, (LPARAM)text);
}

BOOL TMainDlg::SetInfo(BOOL is_task_tray, BOOL is_finish_status)
{
	char	buf[512];
	int		len = 0;
	double	doneRate;
	int		done_rate_i;
	int		remain_sec, total_sec, remain_h, remain_m, remain_s;

	fastCopy.GetTransInfo(&ti, is_task_tray ? FALSE : TRUE);
	if (ti.tickCount == 0)
		ti.tickCount++;

	if (IsListing() && ti.listBuf->UsedSize() > listBufOffset) {
		::EnterCriticalSection(ti.listCs);
		int offset_v = listBufOffset / CHAR_LEN_V;
		RichEditAppendText(GetDlgItem(PATH_EDIT), ti.listBuf->Buf() + listBufOffset);
		listBufOffset = ti.listBuf->UsedSize();
		::LeaveCriticalSection(ti.listCs);
	}

#define FILERATE_WARTERMARK	5

	if ((info.flags & FastCopy::PRE_SEARCH) && !ti.total.isPreSearch) {
		double	preFiles, preTrans, doneFiles, doneTrans, fileRate;
		int		misc_files = ti.total.skipFiles + ti.total.skipDirs + ti.total.errFiles + ti.total.errDirs;
		if (info.mode == FastCopy::DELETE_MODE) {
			preFiles = ti.total.preFiles + ti.total.preDirs + 0.01;
			doneFiles = ti.total.deleteFiles + ti.total.deleteDirs + misc_files + 0.01;
			doneRate = doneFiles / preFiles;
		}
		else {
			preFiles = (ti.total.preFiles + ti.total.preDirs) * 2 + 0.01;
			preTrans = (double)(ti.total.preTrans * 2 + 0.01);
			doneFiles = (ti.total.writeFiles + ti.total.writeDirs + ti.total.readFiles + ti.total.readDirs + (misc_files) * 2) + 0.01;
			doneTrans = (double)(ti.total.writeTrans + ti.total.readTrans + (ti.total.skipTrans + ti.total.errTrans) * 2 + 0.01);
			doneRate = ((doneFiles / preFiles) + (doneTrans / preTrans)) / 2;
			if ((fileRate = doneFiles / (ti.tickCount / 1000)) < FILERATE_WARTERMARK) {
				if (((preTrans - doneTrans) / (preFiles - doneFiles + 1)) > (doneTrans / doneFiles) / (FILERATE_WARTERMARK / fileRate))
					doneRate = (doneTrans / preTrans);
			}
		}
		remain_sec = (int)((ti.tickCount / doneRate - ti.tickCount) / 1000);
		total_sec = (int)(ti.tickCount / doneRate / 1000);
		remain_h = remain_sec / 3600, remain_m = (remain_sec % 3600) / 60, remain_s = remain_sec % 60;
		done_rate_i = (int)(doneRate * 100);
		SetWindowTitle("(%d%%) FastCopy %s", done_rate_i, GetVersionStr());
	}

	//	SetWindowTitle("(%d) FastCopy %s", fastCopy.GetWaitTick(), GetVersionStr());

	if (is_task_tray) {
		if (info.mode == FastCopy::DELETE_MODE) {
			len += sprintf(buf + len, IsListing() ?
				"FastCopy (%.1fMB %dfiles %dsec)" :
				"FastCopy (%.1fMB %dfiles %dsec %.2fMB/s)",
				(double)ti.total.deleteTrans / (1024 * 1024),
				ti.total.deleteFiles,
				ti.tickCount / 1000,
				(double)ti.total.deleteFiles * 1000 / ti.tickCount);
		}
		else if (ti.total.isPreSearch) {
			len += sprintf(buf + len, " Estimating (Total %.1f MB/%d files/%d sec)",
				(double)ti.total.preTrans / (1024 * 1024),
				ti.total.preFiles,
				(int)(ti.tickCount / 1000));
		}
		else {
			if ((info.flags & FastCopy::PRE_SEARCH) && !ti.total.isPreSearch && !is_finish_status && doneRate >= 0.0001) {
				len += sprintf(buf + len, "%d%% (Remain %02d:%02d:%02d) ",
					done_rate_i, remain_h, remain_m, remain_s);
			}
			len += sprintf(buf + len, IsListing() ?
				"FastCopy (%.1fMB %dfiles %dsec)" :
				"FastCopy (%.1fMB %dfiles %dsec %.2fMB/s)",
				(double)ti.total.writeTrans / (1024 * 1024),
				ti.total.writeFiles,
				ti.tickCount / 1000,
				(double)ti.total.writeTrans / ti.tickCount / 1024 * 1000 / 1024
				);
		}
		TaskTray(NIM_MODIFY, hMainIcon[curIconIndex = (curIconIndex+1) % MAX_NORMAL_FASTCOPY_ICON], buf);
		return	TRUE;
	}

	if (ti.total.isPreSearch) {
		len += sprintf(buf + len,
			" ---- Estimating ... ----\r\n"
			"PreTrans = %.1f MB\r\n"
			"PreFiles = %d (%d)\r\n"
			"PreTime  = %.2f sec\r\n"
			"PreRate  = %.2f files/s",
			(double)ti.total.preTrans / (1024 * 1024),
			ti.total.preFiles, ti.total.preDirs,
			(double)ti.tickCount / 1000,
			(double)ti.total.preFiles * 1000 / ti.tickCount);
	}
	else if (info.mode == FastCopy::DELETE_MODE) {
		len += sprintf(buf + len,
			IsListing() ?
			"TotalDel   = %.1f MB\r\n"
			"DelFiles   = %d (%d)\r\n"
			"TotalTime = %.2f sec\r\n" :
			(info.flags & (FastCopy::OVERWRITE_DELETE|FastCopy::OVERWRITE_DELETE_NSA)) ?
			"TotalDel   = %.1f MB\r\n"
			"DelFiles   = %d (%d)\r\n"
			"TotalTime = %.2f sec\r\n"
			"FileRate   = %.2f files/s\r\n"
			"OverWrite = %.1f MB/s" :
			"TotalDel   = %.1f MB\r\n"
			"DelFiles   = %d (%d)\r\n"
			"TotalTime = %.2f sec\r\n"
			"FileRate   = %.2f files/s",
			(double)ti.total.deleteTrans / (1024 * 1024),
			ti.total.deleteFiles, ti.total.deleteDirs,
			(double)ti.tickCount / 1000,
			(double)ti.total.deleteFiles * 1000 / ti.tickCount,
			(double)ti.total.writeTrans / ((double)ti.tickCount / 1000) / (1024 * 1024));
	}
	else {
		if (IsListing()) {
			len = sprintf(buf + len,
				"TotalSize = %.1f MB\r\n"
				"TotalFiles = %d (%d)\r\n"
				, (double)ti.total.writeTrans / (1024 * 1024)
				, ti.total.writeFiles, ti.total.writeDirs);
		}
		else {
			len = sprintf(buf + len,
				"TotalRead = %.1f MB\r\n"
				"TotalWrite = %.1f MB\r\n"
				"TotalFiles = %d (%d)\r\n"
				, (double)ti.total.readTrans / (1024 * 1024)
				, (double)ti.total.writeTrans / (1024 * 1024)
				, ti.total.writeFiles, ti.total.writeDirs);
		}

		if (ti.total.skipFiles || ti.total.skipDirs) {
			len += sprintf(buf + len,
				"TotalSkip = %.1f MB\r\n"
				"SkipFiles = %d (%d)\r\n"
				, (double)ti.total.skipTrans / (1024 * 1024)
				, ti.total.skipFiles, ti.total.skipDirs);
		}
		if (ti.total.deleteFiles || ti.total.deleteDirs) {
			len += sprintf(buf + len,
				"TotalDel  = %.1f MB\r\n"
				"DelFiles  = %d (%d)\r\n"
				, (double)ti.total.deleteTrans / (1024 * 1024)
				, ti.total.deleteFiles, ti.total.deleteDirs);
		}
		len += sprintf(buf + len, IsListing() ?
			"TotalTime = %.2f sec\r\n" :
			"TotalTime = %.2f sec\r\n"
			"TransRate = %.2f MB/s\r\n"
			"FileRate   = %.2f files/s"
			, (double)ti.tickCount / 1000
			, (double)ti.total.writeTrans / ti.tickCount / 1024 * 1000 / 1024
			, (double)ti.total.writeFiles * 1000 / ti.tickCount);
	}

	if ((info.flags & FastCopy::PRE_SEARCH) && !ti.total.isPreSearch && !is_finish_status && doneRate >= 0.0001) {
		len += sprintf(buf + len, "\r\n -- Remain %02d:%02d:%02d (%d%%) --", remain_h, remain_m, remain_s, done_rate_i);
	}
	else if (IsListing() && is_finish_status) {
		len += sprintf(buf + len, "\r\n -- Listing Done --");
	}
	SetDlgItemText(STATUS_EDIT, buf);

	if (IsListing()) {
		if (is_finish_status) {
			int offset_v = listBufOffset / CHAR_LEN_V;
			sprintf(buf, "\r\nFinished. (ErrorFiles : %d  ErrorDirs : %d)", ti.total.errFiles, ti.total.errDirs);
			SendDlgItemMessageV(PATH_EDIT, EM_SETSEL, offset_v, offset_v);
			SendDlgItemMessage(PATH_EDIT, EM_REPLACESEL, 0, (LPARAM)buf);
//			int line = SendDlgItemMessage(PATH_EDIT, EM_GETLINECOUNT, 0, 0);
//			SendDlgItemMessage(PATH_EDIT, EM_LINESCROLL, 0, line > 2 ? line -2 : 0);
		}
	}
	else if (is_finish_status) {
		sprintf(buf, ti.total.errFiles || ti.total.errDirs ? "Finished. (ErrorFiles : %d  ErrorDirs : %d)" : "Finished.", ti.total.errFiles, ti.total.errDirs);
		SetDlgItemText(PATH_EDIT, buf);
		SetWindowTitle("FastCopy %s", GetVersionStr());
	}
	else
		SetDlgItemTextV(PATH_EDIT, ti.total.isPreSearch ? EMPTY_STR_V : ti.curPath);

	SetDlgItemText(SAMEDRV_STATIC, info.mode == FastCopy::DELETE_MODE ? "" : ti.isSameDrv ? GetLoadStr(IDS_SAMEDISK) : GetLoadStr(IDS_DIFFDISK));

//	SetDlgItemText(SPEED_STATIC, buf);

	if (info.ignoreErr != ti.ignoreErr)
		CheckDlgButton(IGNORE_CHECK, info.ignoreErr = ti.ignoreErr);

	if (isErrEditHide && ti.errBuf->UsedSize() > 0) {
		SetNormalWindow();
	}
	if (ti.errBuf->UsedSize() > errBufOffset || errBufOffset == MAX_ERR_BUF) {
		if (errBufOffset != MAX_ERR_BUF) {
			::EnterCriticalSection(ti.errCs);
			RichEditAppendText(GetDlgItem(ERR_EDIT), ti.errBuf->Buf() + errBufOffset);
			errBufOffset = ti.errBuf->UsedSize();
			::LeaveCriticalSection(ti.errCs);
		}
		sprintf(buf, "(ErrFiles : %d / ErrDirs : %d)", ti.total.errFiles, ti.total.errDirs);
		SetDlgItemText(ERRSTATUS_STATIC, buf);
	}
	return	TRUE;
}

BOOL TMainDlg::SetWindowTitle(char *fmt,...)
{
	char	buf[1024];

	va_list	va;
	va_start(va, fmt);
	DWORD	len = wvsprintf(buf, fmt, va);
	va_end(va);

	return	SetWindowText(buf);
}

void TMainDlg::SetItemEnable(BOOL is_delete)
{
	::EnableWindow(GetDlgItem(DST_FILE_BUTTON), !is_delete);
	::EnableWindow(GetDlgItem(DST_COMBO), !is_delete);
	::ShowWindow(GetDlgItem(ESTIMATE_CHECK), is_delete ? SW_HIDE : SW_SHOW);

	::EnableWindow(GetDlgItem(ACL_CHECK), !is_delete && IS_WINNT_V);
	::EnableWindow(GetDlgItem(STREAM_CHECK), !is_delete && IS_WINNT_V);
	::EnableWindow(GetDlgItem(OWDEL_CHECK), is_delete);

	::ShowWindow(GetDlgItem(ACL_CHECK), is_delete ? SW_HIDE : SW_SHOW);
	::ShowWindow(GetDlgItem(STREAM_CHECK), is_delete ? SW_HIDE : SW_SHOW);
	::ShowWindow(GetDlgItem(OWDEL_CHECK), is_delete ? SW_SHOW : SW_HIDE);

	SetPathHistory(FALSE);

	ReflectFilterCheck();
}

static char fastcopy_version_str[32];

void SetVersionStr(BOOL is_runas)
{
	sprintf(fastcopy_version_str, "%.20s%.10s", strstr(mainwin_id, "ver"), is_runas && TIsUserAnAdmin() ? " (Admin)" : "");
}

const char *GetVersionStr(void)
{
	if (fastcopy_version_str[0] == 0)
		SetVersionStr();
	return	fastcopy_version_str;
}

void TMainDlg::UpdateMenu(void)
{
	HMENU	hMenu = ::GetMenu(hWnd);

//	if (!IsWinVista() || TIsUserAnAdmin()) {
//		::DeleteMenu(hMenu, ADMIN_MENUITEM, MF_BYCOMMAND);
//	}

// 僩僢僾儗儀儖儊僯儏乕傾僀僥儉偵傾僀僐儞傪晅梌偡傞偺偼柍棟偐傕丠
//	HICON hIcon = ::LoadImage(GetModuleHandle("user32.dll"), 106, IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
//	::SetMenuItemBitmaps(hMenu, 0, MF_BYPOSITION, LoadBitmap(NULL, (char *)32754), LoadBitmap(NULL, (char *)32754));

	HMENU	hSubMenu = ::GetSubMenu(hMenu, 1);
	while (::GetMenuItemCount(hSubMenu) > 2 && ::DeleteMenu(hSubMenu, 2, MF_BYPOSITION))
		;

	for (int i=0; i < cfg.jobMax; i++) {
		InsertMenuV(hSubMenu, i + 2, MF_STRING|MF_BYPOSITION, JOBOBJ_MENUITEM_START + i, cfg.jobArray[i]->title);
	}

	hSubMenu = ::GetSubMenu(hMenu, 2);
	::CheckMenuItem(hSubMenu, AUTODISK_MENUITEM, MF_BYCOMMAND|((diskMode == 0) ? MF_CHECKED : MF_UNCHECKED));
	::CheckMenuItem(hSubMenu, SAMEDISK_MENUITEM, MF_BYCOMMAND|((diskMode == 1) ? MF_CHECKED : MF_UNCHECKED));
	::CheckMenuItem(hSubMenu, DIFFDISK_MENUITEM, MF_BYCOMMAND|((diskMode == 2) ? MF_CHECKED : MF_UNCHECKED));

	if (!fastCopy.IsStarting() && !isDelay) {
		SetDlgItemText(SAMEDRV_STATIC, diskMode == 0 ? "" : diskMode == 1 ? GetLoadStr(IDS_FIX_SAMEDISK) : GetLoadStr(IDS_FIX_DIFFDISK));
	}
}

void TMainDlg::SetJob(int idx)
{
	Job	*job = cfg.jobArray[idx];
	idx = CmdNameToComboIndex(job->cmd);

	if (idx == -1)
		return;

	SetDlgItemTextV(JOBTITLE_STATIC, job->title);
	SendDlgItemMessage(MODE_COMBO, CB_SETCURSEL, idx, 0);
	SetDlgItemInt(BUFSIZE_EDIT, job->bufSize);
	CheckDlgButton(ESTIMATE_CHECK, job->estimateMode);
	CheckDlgButton(IGNORE_CHECK, job->ignoreErr);
	CheckDlgButton(OWDEL_CHECK, job->enableOwdel);
	CheckDlgButton(ACL_CHECK, job->enableAcl);
	CheckDlgButton(STREAM_CHECK, job->enableStream);
	CheckDlgButton(FILTER_CHECK, job->isFilter);
	SetDlgItemTextV(SRC_COMBO, job->src);
	SetDlgItemTextV(DST_COMBO, job->dst);
	SetDlgItemTextV(INCLUDE_COMBO, job->includeFilter);
	SetDlgItemTextV(EXCLUDE_COMBO, job->excludeFilter);
	SetItemEnable(COPYINFO_LIST[idx].mode == FastCopy::DELETE_MODE);
	SetDlgItemText(PATH_EDIT, "");
	SetDlgItemText(ERR_EDIT, "");
	diskMode = job->diskMode;
	UpdateMenu();
	SetMiniWindow();
}

#if 1
void DBGWrite(char *fmt,...)
{
	static HANDLE	hDbgFile = INVALID_HANDLE_VALUE;

	if (hDbgFile == INVALID_HANDLE_VALUE)
		hDbgFile = ::CreateFil

⌨️ 快捷键说明

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