📄 miscdlg.cpp
字号:
// 僨傿儗僋僩儕愝掕
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 char *_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);
SetDlgItemText(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)
{
WCHAR buf[MAX_PATH_EX];
PathArray pathArray;
if (parent == NULL)
return FALSE;
parent->GetDlgItemTextV(editCtl, buf, MAX_PATH_EX);
if (pathArray.RegisterMultiPath(buf) >= 1) {
strcpyV(buf, pathArray.Path(0));
pathArray.Init();
}
if (Exec(buf, title, filter, defaultDir) == FALSE)
return FALSE;
if (defaultDir) {
int dir_len = strlenV(defaultDir), offset = dir_len + 1;
if (GetChar(buf, offset)) {
if (lGetCharV(buf, lstrlenV(buf) -1) != '\\') // 僪儔僀僽儖乕僩偺傒椺奜
SetChar(buf, dir_len++, '\\');
for (; GetChar(buf, offset); offset++) {
offset += sprintfV(MakeAddr(buf, dir_len), FMT_STR_V, MakeAddr(buf, offset));
pathArray.RegisterPath(buf);
}
if (pathArray.GetMultiPath(buf, MAX_PATH_EX)) {
parent->SetDlgItemTextV(editCtl, buf);
return TRUE;
}
}
}
parent->SetDlgItemTextV(editCtl, buf);
return TRUE;
}
#ifndef OFN_ENABLESIZING
#define OFN_ENABLESIZING 0x00800000
#endif
BOOL TOpenFileDlg::Exec(void *target, void *title, void *filter, void *defaultDir)
{
OPENFILENAMEW ofn;
WCHAR szDirName[MAX_PATH] = L"", szFile[MAX_PATH_EX] = L"";
void *fname = NULL;
mode = FILESELECT;
if (GetChar(target, 0)) {
DWORD attr = ::GetFileAttributesV(target);
if (attr != 0xffffffff && (attr & FILE_ATTRIBUTE_DIRECTORY))
strcpyV(szDirName, target);
else if (::GetFullPathNameV(target, MAX_PATH, szDirName, &fname) && fname) {
SetChar(fname, -1, 0);
}
}
if (GetChar(szDirName, 0) == 0 && defaultDir)
strcpyV(szDirName, defaultDir);
memset(&ofn, 0, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = parent ? parent->hWnd : NULL;
ofn.lpstrFilter = (WCHAR *)filter;
ofn.nFilterIndex = filter ? 1 : 0;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH_EX;
ofn.lpstrTitle = (WCHAR *)title;
ofn.lpstrInitialDir = szDirName;
ofn.lCustData = (LPARAM)this;
ofn.lpfnHook = hook ? hook : OpenFileDlgProc;
ofn.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_ENABLEHOOK|OFN_ENABLESIZING;
if (openMode == OPEN || openMode == MULTI_OPEN)
ofn.Flags |= OFN_FILEMUSTEXIST | (openMode == MULTI_OPEN ? OFN_ALLOWMULTISELECT : 0);
else
ofn.Flags |= (openMode == NODEREF_SAVE ? OFN_NODEREFERENCELINKS : 0);
WCHAR orgDir[MAX_PATH];
::GetCurrentDirectoryV(MAX_PATH, orgDir);
BOOL ret = (openMode == OPEN || openMode == MULTI_OPEN) ? ::GetOpenFileNameV(&ofn) : ::GetSaveFileNameV(&ofn);
::SetCurrentDirectoryV(orgDir);
if (ret)
{
if (openMode == MULTI_OPEN)
memcpy(target, szFile, MAX_PATH_EX * CHAR_LEN_V);
else
strcpyV(target, ofn.lpstrFile);
if (defaultDir)
strcpyV(defaultDir, ofn.lpstrFile);
}
return ret;
}
UINT WINAPI TOpenFileDlg::OpenFileDlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
((TOpenFileDlg *)(((OPENFILENAMEW *)lParam)->lCustData))->CreateByWnd(hdlg);
return TRUE;
}
return FALSE;
}
/*
TOpenFileDlg梡僒僽僋儔僗惗惉
*/
BOOL TOpenFileDlg::CreateByWnd(HWND _hWnd)
{
BOOL ret = TSubClass::CreateByWnd(::GetParent(_hWnd));
if ((flg & OFDLG_DIRSELECT) == 0)
return ret;
// 儃僞儞嶌惉
RECT ok_rect, client_rect;
::GetWindowRect(GetDlgItem(IDOK), &ok_rect);
GetWindowRect(&rect);
::GetClientRect(hWnd, &client_rect);
int cx = (ok_rect.right - ok_rect.left) * 2;
int cy = ok_rect.bottom - ok_rect.top;
int x = ::GetSystemMetrics(SM_CXDLGFRAME);
int y = ok_rect.top - rect.top + cy * 4 / 3 - ::GetSystemMetrics(SM_CYDLGFRAME);
::CreateWindow(BUTTON_CLASS, GetLoadStr(IDS_DIRSELECT), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, x, y, cx, cy, hWnd, (HMENU)DIRSELECT_BUTTON, TApp::GetInstance(), NULL);
HFONT hDlgFont = (HFONT)SendDlgItemMessage(IDOK, WM_GETFONT, 0, 0L);
if (hDlgFont)
SendDlgItemMessage(DIRSELECT_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L);
return ret;
}
/*
BrowseDlg梡 WM_COMMAND 張棟
*/
BOOL TOpenFileDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl)
{
switch (wID)
{
case DIRSELECT_BUTTON:
mode = DIRSELECT;
PostMessage(WM_CLOSE, 0, 0);
return TRUE;
}
return FALSE;
}
/*
Job Dialog弶婜壔張棟
*/
TJobDlg::TJobDlg(Cfg *_cfg, TWin *_parent) : TDlg(JOB_DIALOG, _parent)
{
cfg = _cfg;
}
/*
Window 惗惉帪偺 CallBack
*/
BOOL TJobDlg::EvCreate(LPARAM lParam)
{
WCHAR buf[MAX_PATH];
if (rect.left == CW_USEDEFAULT)
{
GetWindowRect(&rect);
int xsize = rect.right - rect.left;
int ysize = rect.bottom - rect.top;
MoveWindow(rect.left + 30, rect.top + 50, xsize, ysize, FALSE);
}
for (int i=0; i < cfg->jobMax; i++)
SendDlgItemMessageV(JOB_COMBO, CB_ADDSTRING, 0, (LPARAM)cfg->jobArray[i]->title);
if (parent->GetDlgItemTextV(JOBTITLE_STATIC, buf, MAX_PATH) > 0) {
int idx = cfg->SearchJobV(buf);
if (idx >= 0)
SendDlgItemMessage(JOB_COMBO, CB_SETCURSEL, idx, 0);
else
SetDlgItemTextV(JOB_COMBO, buf);
}
::EnableWindow(GetDlgItem(JOBDEL_BUTTON), cfg->jobMax ? TRUE : FALSE);
return TRUE;
}
BOOL TJobDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
switch (wID)
{
case IDOK:
if (AddJob())
EndDialog(wID);
return TRUE;
case JOBDEL_BUTTON:
DelJob();
return TRUE;
case IDCANCEL:
EndDialog(wID);
return TRUE;
}
return FALSE;
}
BOOL TJobDlg::AddJob()
{
extern CopyInfo COPYINFO_LIST[];
WCHAR title[MAX_PATH];
if (GetDlgItemTextV(JOB_COMBO, title, MAX_PATH) <= 0)
return FALSE;
int src_len = parent->SendDlgItemMessage(SRC_COMBO, WM_GETTEXTLENGTH, 0, 0) + 1;
if (src_len >= MAX_HISTORY_BUF) {
TMsgBox(this).Exec("Source is too long (max.8192 chars)");
return FALSE;
}
Job job;
int idx = parent->SendDlgItemMessage(MODE_COMBO, CB_GETCURSEL, 0, 0);
CopyInfo &info = COPYINFO_LIST[idx];
void *src = new WCHAR [src_len];
WCHAR dst[MAX_PATH_EX]=L"";
WCHAR inc[MAX_PATH]=L"", exc[MAX_PATH]=L"";
job.bufSize = parent->GetDlgItemInt(BUFSIZE_EDIT);
job.estimateMode = parent->IsDlgButtonChecked(ESTIMATE_CHECK);
job.ignoreErr = parent->IsDlgButtonChecked(IGNORE_CHECK);
job.isFilter = parent->IsDlgButtonChecked(FILTER_CHECK);
parent->GetDlgItemTextV(SRC_COMBO, src, src_len);
if (info.mode != FastCopy::DELETE_MODE) {
parent->GetDlgItemTextV(DST_COMBO, dst, MAX_PATH_EX);
HMENU hMenu = ::GetSubMenu(::GetMenu(parent->hWnd), 2);
if (::GetMenuState(hMenu, SAMEDISK_MENUITEM, MF_BYCOMMAND) & MF_CHECKED)
job.diskMode = 1;
else if (::GetMenuState(hMenu, DIFFDISK_MENUITEM, MF_BYCOMMAND) & MF_CHECKED)
job.diskMode = 2;
}
if (job.isFilter) {
parent->GetDlgItemTextV(INCLUDE_COMBO, inc, MAX_PATH);
parent->GetDlgItemTextV(EXCLUDE_COMBO, exc, MAX_PATH);
}
job.SetString(title, src, dst, info.cmdline_name, inc, exc);
if (cfg->AddJob(&job)) {
cfg->WriteIni();
parent->SetDlgItemTextV(JOBTITLE_STATIC, title);
}
else TMsgBox(this).Exec("Add Job Error");
delete [] src;
return TRUE;
}
BOOL TJobDlg::DelJob()
{
WCHAR buf[MAX_PATH], msg[MAX_PATH];
if (GetDlgItemTextV(JOB_COMBO, buf, MAX_PATH) > 0) {
int idx = cfg->SearchJobV(buf);
sprintfV(msg, GetLoadStrV(IDS_JOBNAME), buf);
if (idx >= 0 && TMsgBox(this).ExecV(msg, GetLoadStrV(IDS_DELCONFIRM), MB_OKCANCEL) == IDOK) {
cfg->DelJobV(buf);
cfg->WriteIni();
SendDlgItemMessage(JOB_COMBO, CB_DELETESTRING, idx, 0);
SendDlgItemMessage(JOB_COMBO, CB_SETCURSEL, idx == 0 ? 0 : idx < cfg->jobMax ? idx : idx -1, 0);
}
}
::EnableWindow(GetDlgItem(JOBDEL_BUTTON), cfg->jobMax ? TRUE : FALSE);
return TRUE;
}
/*
Message Box
*/
TMsgBox::TMsgBox(TWin *_parent) : TDlg(MESSAGE_DIALOG, _parent)
{
msg = title = NULL;
style = 0;
isExecV = FALSE;
}
TMsgBox::~TMsgBox()
{
}
/*
Window 惗惉帪偺 CallBack
*/
BOOL TMsgBox::EvCreate(LPARAM lParam)
{
if (rect.left == CW_USEDEFAULT)
{
GetWindowRect(&rect);
int xsize = rect.right - rect.left;
int ysize = rect.bottom - rect.top;
MoveWindow(rect.left + 30, rect.top + 50, xsize, ysize, FALSE);
}
if (isExecV) {
SetWindowTextV(title);
SetDlgItemTextV(MESSAGE_EDIT, msg);
}
else {
SetWindowText((const char *)title);
SetDlgItemText(MESSAGE_EDIT, (const char *)msg);
}
if ((style & MB_OKCANCEL) == 0) {
::ShowWindow(GetDlgItem(IDCANCEL), SW_HIDE);
RECT ok_rect;
HWND ok_wnd = GetDlgItem(IDOK);
::GetWindowRect(ok_wnd, &ok_rect);
::SetWindowPos(ok_wnd, 0, ok_rect.left + 50, ok_rect.top, 0, 0, SWP_NOSIZE|SWP_NOZORDER);
}
return TRUE;
}
BOOL TMsgBox::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
switch (wID)
{
case IDOK: case IDCANCEL:
EndDialog(wID);
return TRUE;
}
return FALSE;
}
UINT TMsgBox::ExecV(void *_msg, void *_title, UINT _style)
{
msg = _msg;
title = _title;
style = _style;
isExecV = TRUE;
return TDlg::Exec();
}
UINT TMsgBox::Exec(char *_msg, char *_title, UINT _style)
{
msg = _msg;
title = _title;
style = _style;
isExecV = FALSE;
return TDlg::Exec();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -