📄 miscdlg.cpp
字号:
static char *miscdlg_id =
"@(#)Copyright (C) H.Shirouzu 2005-2007 miscdlg.cpp Ver1.52";
/* ========================================================================
Project Name : Fast/Force copy file and directory
Create : 2005-01-23(Sun)
Update : 2007-02-06(Tue)
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(EMPTYDIR_CHECK, cfg->skipEmptyDir);
CheckDlgButton(EXECCONFIRM_CHECK, cfg->execConfirm);
CheckDlgButton(FORCESTART_CHECK, cfg->forceStart);
CheckDlgButton(SAMEDIR_RENAME_CHECK, cfg->isSameDirRename);
CheckDlgButton(AUTOSLOW_CHECK, cfg->isAutoSlow);
CheckDlgButton(AUTOSLOWIO_CHECK, cfg->isAutoSlowIo);
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->skipEmptyDir = IsDlgButtonChecked(EMPTYDIR_CHECK);
cfg->execConfirm = IsDlgButtonChecked(EXECCONFIRM_CHECK);
cfg->forceStart = IsDlgButtonChecked(FORCESTART_CHECK);
cfg->isAutoSlow = IsDlgButtonChecked(AUTOSLOW_CHECK);
cfg->isAutoSlowIo = IsDlgButtonChecked(AUTOSLOWIO_CHECK);
cfg->WriteIni();
EndDialog(wID);
return TRUE;
case IDCANCEL:
EndDialog(wID);
return TRUE;
}
return FALSE;
}
/*
ShellExt
*/
#define CURRENT_SHEXTDLL "fastext1.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 (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_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)
SetWindowTextV(title);
SendDlgItemMessage(MESSAGE_EDIT, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);
SetDlgItemTextV(SRC_EDIT, src);
if (dst)
SetDlgItemTextV(DST_EDIT, dst);
if (rect.left == CW_USEDEFAULT) {
GetWindowRect(&rect);
rect.left += 30, rect.right += 30;
rect.top += 30, rect.bottom += 30;
MoveWindow(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, FALSE);
}
Show();
SetForceForegroundWindow();
return TRUE;
}
BOOL TExecConfirmDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
switch (wID)
{
case HELP_CONFIRM_BUTTON:
ShowHelp(hWnd, cfg->execDir, GetLoadStr(IDS_FASTCOPYHELP), "#shellcancel");
return TRUE;
case IDOK: case IDCANCEL:
EndDialog(wID);
return TRUE;
}
return FALSE;
}
HWND ShowHelp(HWND hOwner, LPCSTR help_dir, LPCSTR help_file, LPCSTR section)
{
#if defined(ENABLE_HTML_HELP)
static HWND (WINAPI *pHtmlHelp)(HWND, LPCSTR, UINT, DWORD_PTR) = NULL;
if (pHtmlHelp == NULL) {
DWORD cookie=0;
HMODULE hHtmlHelp = TLoadLibrary("hhctrl.ocx");
if (hHtmlHelp)
pHtmlHelp = (HWND (WINAPI *)(HWND, LPCSTR, UINT, DWORD_PTR))::GetProcAddress(hHtmlHelp, "HtmlHelpA");
if (pHtmlHelp)
pHtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&cookie);
}
if (pHtmlHelp) {
char path[MAX_PATH];
MakePath(path, help_dir, help_file);
if (section)
strcat(path, section);
return pHtmlHelp(hOwner, path, HH_DISPLAY_TOC, 0);
}
#endif
return NULL;
}
/*=========================================================================
僋儔僗 丗 BrowseDirDlgV
奣 梫 丗 僨傿儗僋僩儕僽儔僂僘梡僐儌儞僟僀傾儘僌奼挘僋儔僗
愢 柧 丗 SHBrowseForFolder 偺僒僽僋儔僗壔
拲 堄 丗
=========================================================================*/
BOOL BrowseDirDlgV(TWin *parentWin, UINT editCtl, void *title, int flg)
{
if (SHBrowseForFolderV == NULL || SHGetPathFromIDListV == NULL) // old version NT kernel.
return FALSE;
WCHAR fileBuf[MAX_PATH_EX] = L"", buf[MAX_PATH_EX] = L"";
BOOL ret = FALSE;
void *c_root_v = IS_WINNT_V ? (void *)L"C:\\" : (void *)"C:\\";
parentWin->GetDlgItemTextV(editCtl, fileBuf, MAX_PATH_EX);
if (GetChar(fileBuf, 0)) {
void *tok, *p;
if ((flg & BRDIR_VQUOTE) && (tok = strtok_pathV(fileBuf, SEMICOLON_V, &p)))
strcpyV(fileBuf, tok);
}
if (GetChar(fileBuf, 0) == 0)
strcpyV(fileBuf, c_root_v);
DirFileMode mode = DIRSELECT;
TBrowseDirDlgV dirDlg(title, fileBuf, flg, parentWin);
TOpenFileDlg fileDlg(parentWin, TOpenFileDlg::MULTI_OPEN, OFDLG_DIRSELECT);
while (mode != SELECT_EXIT) {
switch (mode) {
case DIRSELECT:
if (dirDlg.Exec()) {
if (flg & BRDIR_BACKSLASH) {
MakePathV(buf, fileBuf, EMPTY_STR_V);
strcpyV(fileBuf, buf);
}
if ((flg & BRDIR_QUOTE) || (flg & BRDIR_VQUOTE) && lstrchrV(fileBuf, ';')) {
sprintfV(buf, FMT_QUOTE_STR_V, fileBuf);
strcpyV(fileBuf, buf);
}
::SetDlgItemTextV(parentWin->hWnd, editCtl, fileBuf);
ret = TRUE;
}
else if (dirDlg.GetMode() == FILESELECT) {
mode = FILESELECT;
continue;
}
mode = SELECT_EXIT;
break;
case FILESELECT:
SetChar(buf, sprintfV(buf, FMT_STR_V, GetLoadStrV(IDS_ALLFILES_FILTER)) + 1, 0);
fileDlg.Exec(editCtl, NULL, buf, fileBuf);
if (fileDlg.GetMode() == DIRSELECT)
mode = DIRSELECT;
else
mode = SELECT_EXIT;
break;
}
}
return ret;
}
TBrowseDirDlgV::TBrowseDirDlgV(void *title, void *_fileBuf, int _flg, TWin *parentWin)
{
fileBuf = _fileBuf;
flg = _flg;
iMalloc = NULL;
SHGetMalloc(&iMalloc);
brInfo.hwndOwner = parentWin->hWnd;
brInfo.pidlRoot = 0;
brInfo.pszDisplayName = (char *)fileBuf;
brInfo.lpszTitle = (char *)title;
brInfo.ulFlags = BIF_RETURNONLYFSDIRS;
brInfo.lpfn = TBrowseDirDlgV::BrowseDirDlg_Proc;
brInfo.lParam = (LPARAM)this;
brInfo.iImage = 0;
}
TBrowseDirDlgV::~TBrowseDirDlgV()
{
if (iMalloc)
iMalloc->Release();
}
BOOL TBrowseDirDlgV::Exec()
{
LPITEMIDLIST pidlBrowse;
BOOL ret = FALSE;
do {
mode = DIRSELECT;
if ((pidlBrowse = ::SHBrowseForFolderV(&brInfo)) != NULL) {
if (::SHGetPathFromIDListV(pidlBrowse, fileBuf))
ret = TRUE;
iMalloc->Free(pidlBrowse);
return ret;
}
} while (mode == RELOAD);
return ret;
}
/*
BrowseDirDlg梡僐乕儖僶僢僋
*/
int CALLBACK TBrowseDirDlgV::BrowseDirDlg_Proc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM data)
{
switch (uMsg)
{
case BFFM_INITIALIZED:
((TBrowseDirDlgV *)data)->CreateByWnd(hWnd);
break;
case BFFM_SELCHANGED:
if (((TBrowseDirDlgV *)data)->hWnd)
((TBrowseDirDlgV *)data)->SetFileBuf(lParam);
break;
}
return 0;
}
/*
BrowseDlg梡僒僽僋儔僗惗惉
*/
BOOL TBrowseDirDlgV::CreateByWnd(HWND _hWnd)
{
BOOL ret = TSubClass::CreateByWnd(_hWnd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -