📄 filedlg.cpp
字号:
SHGetShortcutTarget(szPath, szTarget, MAX_PATH);
LPTSTR p = _tcsrchr(szTarget, _T('\"'));
if (p) *p = NULL;
p = (szTarget[0] == _T('\"')) ? szTarget + 1 : szTarget;
LoadFolderItem(p);
}
else if (p->type == ITEM_TYPE_FILE) {
OnOK();
}
}
}
void CFileDialog::OnListKeyDown(NMLVKEYDOWN* pnmk)
{
switch (pnmk->wVKey) {
case VK_BACK:
OnUp(); break;
case VK_ESCAPE:
EndDialog(IDCANCEL); break;
case VK_TAB:
SetFocus(GetDlgItem(m_hwndDlg,
(GetAsyncKeyState(VK_SHIFT)) ? IDC_COMBO_FILTER :IDC_EDIT_NAME)); break;
case 'A':
SelectAllItems();
break;
}
}
void CFileDialog::OnListItemChanged(NM_LISTVIEW* pnmlv)
{
TCHAR sz[MAX_PATH + 3];
LIST_ITEM_INFO* p;
if ((pnmlv->uNewState | pnmlv->uOldState) == LVIS_FOCUSED)
return;
HWND hwndEdit = GetDlgItem(m_hwndDlg, IDC_EDIT_NAME);
int n = ListView_GetSelectedCount(m_hwndLV);
if (n == 0) {
if (!(GetWindowLong(m_hwndLV, GWL_STYLE) & LVS_SINGLESEL))
SetWindowText(hwndEdit, _T(""));
return;
}
n = 0;
int nIndex;
nIndex = GetSelectedItemIndex(0);
do {
p = GetListItemInfo(nIndex);
if (p->type == ITEM_TYPE_FILE && !IsFolderShortcut(m_szCurrent, p->pszName))
n++;
}
while ((nIndex = GetSelectedItemIndex(nIndex + 1)) != -1);
if (n == 0) {
if (!(GetWindowLong(m_hwndLV, GWL_STYLE) & LVS_SINGLESEL))
SetWindowText(hwndEdit, _T(""));
return;
}
if (n > 1) {
p = GetListItemInfo(pnmlv->iItem);
if (p->type == ITEM_TYPE_FILE && !IsFolderShortcut(m_szCurrent, p->pszName)) {
int nLen = GetWindowTextLength(hwndEdit);
wsprintf(sz, _T("\"%s\" "), p->pszName);
if (pnmlv->uNewState & LVIS_SELECTED) {
// add
if (n == 2) {
TCHAR sz2[MAX_PATH + 3];
nIndex = GetSelectedItemIndex(0);
do {
p = GetListItemInfo(nIndex);
if (p->type == ITEM_TYPE_FILE && !IsFolderShortcut(m_szCurrent, p->pszName) &&
nIndex != pnmlv->iItem)
break;
}
while ((nIndex = GetSelectedItemIndex(nIndex + 1)) != -1);
wsprintf(sz2, _T("\"%s\" "), p->pszName);
LPTSTR psz = new TCHAR[_tcslen(sz) + _tcslen(sz2) + 1];
if (psz) {
*psz = NULL;
_tcscpy(psz, sz2);
_tcscat(psz, sz);
SetWindowText(hwndEdit, psz);
SendMessage(hwndEdit, EM_SETSEL, -1, -1);
delete [] psz;
}
}
else {
LPTSTR psz = new TCHAR[nLen + _tcslen(sz) + 1];
if (psz) {
GetWindowText(hwndEdit, psz, nLen + 1);
_tcscat(psz, sz);
SetWindowText(hwndEdit, psz);
SendMessage(hwndEdit, EM_SETSEL, -1 , -1);
delete [] psz;
}
}
}
else {
// delete
LPTSTR psz = new TCHAR[nLen + 1];
if (psz) {
GetWindowText(hwndEdit, psz, nLen + 1);
LPTSTR p = _tcsstr(psz, sz);
if (p) {
memmove(p, p + _tcslen(sz), sizeof(TCHAR) * (_tcslen(p + _tcslen(sz)) + 1));
SetWindowText(hwndEdit, psz);
SendMessage(hwndEdit, EM_SETSEL, 0, 0);
}
delete [] psz;
}
}
}
}
else if (n) {
nIndex = GetSelectedItemIndex(0);
do {
p = GetListItemInfo(nIndex);
if (p->type == ITEM_TYPE_FILE && !IsFolderShortcut(m_szCurrent, p->pszName))
break;
}
while ((nIndex = GetSelectedItemIndex(nIndex + 1)) != -1);
if (nIndex != -1) {
p = GetListItemInfo(nIndex);
if (p->type == ITEM_TYPE_FILE && !IsFolderShortcut(m_szCurrent, p->pszName)) {
_tcscpy(sz, p->pszName);
if (!m_fShowExt) {
LPTSTR psz = _tcsrchr(sz, _T('.'));
if (psz) {
if (m_pszDefExt) {
delete [] m_pszDefExt;
m_pszDefExt = NULL;
}
m_pszDefExt = new TCHAR[_tcslen(psz) + 1];
_tcscpy(m_pszDefExt, psz);
*psz = NULL;
}
}
SetWindowText(hwndEdit, sz);
}
}
}
}
void CFileDialog::OnListColumnClick(NMLISTVIEW* pnmlv)
{
LIST_SORT sort = LIST_SORT_NAME;
switch (pnmlv->iSubItem) {
// case 0: sort = LIST_SORT_NAME; break;
case 1: sort = LIST_SORT_SIZE; break;
case 2: sort = LIST_SORT_EXT; break;
case 3: sort = LIST_SORT_TIME; break;
}
if (sort == m_nListSort)
m_fSortOrder = !m_fSortOrder;
m_nListSort = sort;
SortList();
}
void CFileDialog::SelectAllItems()
{
if (!(GetWindowLong(m_hwndLV, GWL_STYLE) & LVS_SINGLESEL))
ListView_SetItemState(m_hwndLV, -1, LVIS_SELECTED, LVIS_SELECTED);
}
BOOL CFileDialog::IsFolderShortcut(LPCTSTR pszPath, LPCTSTR pszName)
{
TCHAR sz[MAX_PATH];
wsprintf(sz, _T("%s\\%s"), pszPath, pszName);
_tcsupr(sz);
LPTSTR psz = _tcsrchr(sz, _T('.'));
if (psz && _tcscmp(psz, _T(".LNK")) == 0) {
TCHAR szTarget[MAX_PATH];
wsprintf(sz, _T("%s\\%s"), pszPath, pszName);
if (SHGetShortcutTarget(sz, szTarget, MAX_PATH)) {
LPTSTR p = _tcsrchr(szTarget, _T('\"'));
if (p) *p = NULL;
p = (szTarget[0] == _T('\"')) ? szTarget + 1 : szTarget;
DWORD dwAttr = GetFileAttributes(p);
if (dwAttr != 0xFFFFFFFF &&
(dwAttr & FILE_ATTRIBUTE_DIRECTORY))
return TRUE;
}
}
return FALSE;
}
int CFileDialog::NewFolderDialog()
{
if (m_fCtrl) {
keybd_event(VK_CONTROL, 0x1e, KEYEVENTF_KEYUP, 1);
}
int rtn = DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_NEWFOLDERDIALOG), m_hwndDlg, NewFolderDlgProc, (LPARAM)this);
if (m_fCtrl) {
keybd_event(VK_CONTROL, 0x1e, 0, 1);
}
return rtn;
}
BOOL CFileDialog::NewFolderDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CFileDialog* pDlg = (CFileDialog*)GetWindowLong(hwndDlg, DWL_USER);
switch (uMsg) {
case WM_INITDIALOG:
pDlg = (CFileDialog*)lParam;
SetWindowLong(hwndDlg, DWL_USER, (DWORD)lParam);
if(pDlg->m_helper.IsPocketPC())
CreateWindow(_T("SIPPREF"),_T(""),0,-1,-1,0,0,hwndDlg,(HMENU)-1,NULL,NULL);
{
WCHAR caption[32];
pDlg->m_helper.LoadString(IDS_CAPTION_NEWFOLDER, caption, 32);
SetWindowText(hwndDlg,caption);
pDlg->m_helper.LoadString(IDS_CAPTION_CANCEL,caption,32);//Cancel
SetDlgItemText(hwndDlg, IDCANCEL, caption);
}
SendDlgItemMessage(hwndDlg, IDC_EDIT_NAME,EM_LIMITTEXT,(WPARAM)(MAX_PATH-_tcslen(pDlg->m_szCurrent)-1),0);
SetFocus(GetDlgItem(hwndDlg, IDC_EDIT_NAME));
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
{
TCHAR folder[MAX_PATH];
DWORD err=0;
GetDlgItemText(hwndDlg, IDC_EDIT_NAME, folder, MAX_PATH);
if(!folder[0])
::EndDialog(hwndDlg,IDCANCEL);
else if(!pDlg->CreateFolder(hwndDlg,folder))
::EndDialog(hwndDlg,IDOK);
}
return TRUE;
case IDCANCEL:
::EndDialog(hwndDlg,IDCANCEL);
return TRUE;
}
break;
return TRUE;
}
return FALSE;
}
int CFileDialog::CreateFolder(HWND hOwner, LPCTSTR folder)
{
DWORD err=0,ids;
TCHAR fullpath[MAX_PATH+1];
if(_tcscspn(folder,_T("\\/:*\?\"<>|"))!=_tcslen(folder))
err=ERROR_INVALID_NAME;
else
{
_stprintf(fullpath,_T("%s\\%s"),m_szCurrent,folder);
if(!CreateDirectory(fullpath,NULL))
err=GetLastError();
}
if(err)
{
TCHAR caption[32];
m_helper.LoadString(IDS_CAPTION_NEWFOLDER, caption, 32);
TCHAR szMsg[MAX_LOADSTRING];
switch (err) {
case ERROR_INVALID_NAME:
ids = IDS_MSG_INVALIDNAME;
break;
case ERROR_ALREADY_EXISTS:
ids = IDS_MSG_ALREADYEXISTS;
break;
case ERROR_FILENAME_EXCED_RANGE:
ids = IDS_MSG_FOLDERTOOLONG;
break;
default:
ids = IDS_MSG_NEWFOLDERERROR;
break;
}
m_helper.LoadString(ids, szMsg, MAX_LOADSTRING);
TCHAR *p;
p= new TCHAR[_tcslen(folder) + _tcslen(szMsg) + 1];
wsprintf(p, szMsg, folder);
MessageBox(hOwner, p, caption, MB_ICONEXCLAMATION | MB_OK);
delete [] p;
}
else
{
LVITEM li;
LIST_ITEM_INFO *p;
p = new LIST_ITEM_INFO;
p->type = ITEM_TYPE_DIR;
p->pszName = new TCHAR[_tcslen(folder) + 1];
memset(p->pszName, 0, sizeof(TCHAR) * (_tcslen(folder) + 1));
_tcscpy(p->pszName, folder);
li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM |LVIF_STATE ;
li.iItem = 0;
li.iSubItem = 0;
li.state = li.stateMask = LVIS_FOCUSED ;
li.iImage = I_IMAGECALLBACK;
li.lParam = (DWORD)p;
li.pszText = LPSTR_TEXTCALLBACK;
SendMessage(m_hwndLV, WM_SETREDRAW, (WPARAM)FALSE, 0);
ListView_InsertItem(m_hwndLV, &li);
ListView_SetItemText(m_hwndLV, 0, 2, LPSTR_TEXTCALLBACK);
SortList();
LVFINDINFO lfi;
lfi.flags = LVFI_STRING ;
lfi.psz = folder;
int iSel = ListView_FindItem(m_hwndLV, -1, &lfi);
ListView_EnsureVisible(m_hwndLV, iSel, FALSE);
SendMessage(m_hwndLV, WM_SETREDRAW, (WPARAM)TRUE, 0);
}
return err;
}
BOOL IsIncludedFolder(LPCWSTR file,LPCWSTR folder)
{
LPCWSTR f=wcsrchr(file,L'\\');
int n=f-file;
if(!n)
{
if(!folder[0])
return TRUE;
}
else if(!wcsncmp(file,folder,n))
return TRUE;
return FALSE;
}
void CFileDialog::OnFileChangeInfo(FILECHANGEINFO *lpfci)
{
if(HIWORD(lpfci))
{
if(lpfci->wEventId==SHCNE_RENAMEITEM||lpfci->wEventId==SHCNE_RENAMEFOLDER)
{
FILECHANGEINFO fci={sizeof(FILECHANGEINFO),0,lpfci->uFlags};
LPCWSTR file;
file=LPCWSTR(lpfci->dwItem1);
if(IsIncludedFolder(file,m_szCurrent))
{
fci.wEventId=(lpfci->wEventId==SHCNE_RENAMEITEM)?SHCNE_DELETE:SHCNE_RMDIR;
fci.dwItem1=(DWORD)file;
OnFileChangeInfo(&fci);
}
file=LPCWSTR(lpfci->dwItem2);
if(IsIncludedFolder(file,m_szCurrent))
{
fci.wEventId=(lpfci->wEventId==SHCNE_RENAMEITEM)?SHCNE_CREATE:SHCNE_MKDIR;
fci.dwItem1=(DWORD)file;
OnFileChangeInfo(&fci);
}
return;
}
WIN32_FIND_DATA fd;
LPCWSTR pszFile=wcsrchr(LPCWSTR(lpfci->dwItem1),L'\\');
if(m_szCurrent[0]||(!m_szCurrent[0]&&pszFile==LPCWSTR(lpfci->dwItem1)))
switch(lpfci->wEventId)
{
case SHCNE_CREATE:
if(!m_listExt.IsEmpty()&&!IsFolderShortcut(m_szCurrent,pszFile+1))
{
BOOL b=TRUE;
int n = m_listExt.GetCount();
for (int i = 0; i < n; i++) {
LPTSTR p = (LPTSTR)m_listExt.GetAt(i);
WCHAR fmt[MAX_PATH];
swprintf(fmt,L"%s\\%s",m_szCurrent,p);
HANDLE hFind;
hFind=FindFirstFile(fmt,&fd);
if(hFind!=INVALID_HANDLE_VALUE)
{
do{
if(!wcscmp(fd.cFileName,pszFile+1) )
{
b=FALSE;
break;
}
}while(FindNextFile(hFind,&fd));
FindClose(hFind);
}
}
if(b)
break;
}
case SHCNE_MKDIR:
case SHCNE_DRIVEADD:
FindClose(FindFirstFile(LPCWSTR(lpfci->dwItem1),&fd));
AddListItem(m_szCurrent,&fd,ListView_GetItemCount(m_hwndLV));
break;
case SHCNE_DELETE:
case SHCNE_RMDIR:
case SHCNE_DRIVEREMOVED:
{
int i;
for (i = 0; i < ListView_GetItemCount(m_hwndLV); i++) {
LIST_ITEM_INFO* pDel = GetListItemInfo(i);
if(!wcscmp(pszFile+1,pDel->pszName))
{
if (pDel->pszDispName) delete[] pDel->pszDispName;
if (pDel->pszDispSize) delete[] pDel->pszDispSize;
if (pDel->pszDispType) delete[] pDel->pszDispType;
if (pDel->pszDispTime) delete[] pDel->pszDispTime;
delete[] pDel->pszName;
delete pDel;
ListView_DeleteItem(m_hwndLV,i);
break;
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -