📄 mainwin.cpp
字号:
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 + -