📄 miscdlg.cpp
字号:
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);
}
if (isShellExt && IsWinVista() && !TIsUserAnAdmin()) {
HWND hRunas = GetDlgItem(RUNAS_BUTTON);
::SetWindowLong(hRunas, GWL_STYLE, ::GetWindowLong(hRunas, GWL_STYLE) | WS_VISIBLE);
::SendMessage(hRunas, BCM_SETSHIELD, 0, 1);
}
Show();
if (info->mode == FastCopy::DELETE_MODE) {
CheckDlgButton(OWDEL_CHECK, info->flags & (FastCopy::OVERWRITE_DELETE|FastCopy::OVERWRITE_DELETE_NSA) ? TRUE : FALSE);
}
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: case RUNAS_BUTTON:
EndDialog(wID);
return TRUE;
case OWDEL_CHECK:
{
parent->CheckDlgButton(OWDEL_CHECK, IsDlgButtonChecked(OWDEL_CHECK));
FastCopy::Flags flags = cfg->enableNSA ? FastCopy::OVERWRITE_DELETE_NSA : FastCopy::OVERWRITE_DELETE;
if (IsDlgButtonChecked(OWDEL_CHECK))
info->flags |= flags;
else
info->flags &= ~(DWORD)flags;
}
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, 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);
// 僨傿儗僋僩儕愝掕
DWORD attr = GetFileAttributesV(fileBuf);
if (attr != 0xffffffff && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0)
GetParentDirV(fileBuf, fileBuf);
if (ILCreateFromPathV) { // 2000/XP
ITEMIDLIST *pidl = ILCreateFromPathV(fileBuf);
SendMessageV(BFFM_SETSELECTION, FALSE, (LPARAM)pidl);
ILFreeV(pidl);
}
else {
char buf[MAX_PATH_EX], *target;
if (IS_WINNT_V) // NT4.0
::WideCharToMultiByte(CP_ACP, 0, (WCHAR *)fileBuf, -1, target=buf, sizeof(buf), 0, 0);
else // Win98
target = (char *)fileBuf;
SendMessageV(BFFM_SETSELECTION, TRUE, (LPARAM)target);
}
// 儃僞儞嶌惉
RECT tmp_rect;
::GetWindowRect(GetDlgItem(IDOK), &tmp_rect);
POINT pt = { tmp_rect.left, tmp_rect.top };
::ScreenToClient(hWnd, &pt);
int cx = (pt.x - 30) / 2, cy = tmp_rect.bottom - tmp_rect.top;
::CreateWindow(BUTTON_CLASS, GetLoadStr(IDS_MKDIR), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 10, pt.y, cx, cy, hWnd, (HMENU)MKDIR_BUTTON, TApp::GetInstance(), NULL);
::CreateWindow(BUTTON_CLASS, GetLoadStr(IDS_RMDIR), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 18 + cx, pt.y, cx, cy, hWnd, (HMENU)RMDIR_BUTTON, TApp::GetInstance(), NULL);
if (flg & BRDIR_FILESELECT) {
GetClientRect(hWnd, &rect);
int file_cx = cx * 3 / 2;
::CreateWindow(BUTTON_CLASS, GetLoadStr(IDS_FILESELECT), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, rect.right - file_cx - 18, 10, file_cx, cy, hWnd, (HMENU)FILESELECT_BUTTON, TApp::GetInstance(), NULL);
}
HFONT hDlgFont = (HFONT)SendDlgItemMessage(IDOK, WM_GETFONT, 0, 0L);
if (hDlgFont)
{
SendDlgItemMessage(MKDIR_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L);
SendDlgItemMessage(RMDIR_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L);
if (flg & BRDIR_FILESELECT)
SendDlgItemMessage(FILESELECT_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L);
}
return ret;
}
/*
BrowseDlg梡 WM_COMMAND 張棟
*/
BOOL TBrowseDirDlgV::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl)
{
switch (wID)
{
case MKDIR_BUTTON:
{
WCHAR dirBuf[MAX_PATH_EX], path[MAX_PATH_EX];
TInputDlgV dlg(dirBuf, this);
if (dlg.Exec() == FALSE)
return TRUE;
MakePathV(path, fileBuf, dirBuf);
if (::CreateDirectoryV(path, NULL))
{
strcpyV(fileBuf, path);
mode = RELOAD;
PostMessage(WM_CLOSE, 0, 0);
}
}
return TRUE;
case RMDIR_BUTTON:
if (::RemoveDirectoryV(fileBuf))
{
GetParentDirV(fileBuf, fileBuf);
mode = RELOAD;
PostMessage(WM_CLOSE, 0, 0);
}
return TRUE;
case FILESELECT_BUTTON:
mode = FILESELECT;
PostMessage(WM_CLOSE, 0, 0);
return TRUE;
}
return FALSE;
}
BOOL TBrowseDirDlgV::SetFileBuf(LPARAM list)
{
return ::SHGetPathFromIDListV((LPITEMIDLIST)list, fileBuf);
}
/*
恊僨傿儗僋僩儕庢摼乮昁偢僼儖僷僗偱偁傞偙偲丅UNC懳墳乯
*/
BOOL TBrowseDirDlgV::GetParentDirV(void *srcfile, void *dir)
{
WCHAR path[MAX_PATH_EX], *fname=NULL;
if (::GetFullPathNameV(srcfile, MAX_PATH_EX, path, (void **)&fname) == 0 || fname == NULL)
return strcpyV(dir, srcfile), FALSE;
if (((char *)fname - (char *)path) / CHAR_LEN_V > 3 || GetChar(path, 1) != ':')
SetChar(fname, -1, 0);
else
SetChar(fname, 0, 0); // C:\ 偺応崌
strcpyV(dir, path);
return TRUE;
}
/*=========================================================================
僋儔僗 丗 TInputDlgV
奣 梫 丗 侾峴擖椡僟僀傾儘僌
愢 柧 丗
拲 堄 丗
=========================================================================*/
BOOL TInputDlgV::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl)
{
switch (wID)
{
case IDOK:
GetDlgItemTextV(INPUT_EDIT, dirBuf, MAX_PATH_EX);
EndDialog(wID);
return TRUE;
case IDCANCEL:
EndDialog(wID);
return TRUE;
}
return FALSE;
}
int TConfirmDlg::Exec(const void *_message, BOOL _allow_continue, TWin *_parent)
{
message = _message;
parent = _parent;
allow_continue = _allow_continue;
return TDlg::Exec();
}
BOOL TConfirmDlg::EvCreate(LPARAM lParam)
{
if (!allow_continue) {
SetWindowText(GetLoadStr(IDS_ERRSTOP));
::EnableWindow(GetDlgItem(IDOK), FALSE);
::EnableWindow(GetDlgItem(IDIGNORE), FALSE);
::SetFocus(GetDlgItem(IDCANCEL));
}
SendDlgItemMessage(MESSAGE_EDIT, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);
SetDlgItemTextV(MESSAGE_EDIT, message);
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 TOpenFileDlg::Exec(UINT editCtl, void *title, void *filter, void *defaultDir, void *init_data)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -