📄 filedlg.cpp
字号:
{
if (!p->pszDispName) {
if (m_fShowExt) {
pnmdi->item.pszText = p->pszName;
break;
}
else {
p->pszDispName = new TCHAR[_tcslen(p->pszName) + 1];
_tcscpy(p->pszDispName, p->pszName);
LPTSTR psz = _tcsrchr(p->pszDispName, _T('.'));
if (psz)
*psz = NULL;
}
}
pnmdi->item.pszText = p->pszDispName;
break;
}
case 1: //Size
{
if (!p->pszDispSize) {
p->pszDispSize = new TCHAR[64];
SetFormatSize((DWORD)p->llSize, p->pszDispSize, _T("%s KB"), _T("%s MB"));
// todo : 2^32 bytes埲忋偺僼傽僀儖懳墳
}
pnmdi->item.pszText = p->pszDispSize;
break;
}
case 2: //Type
{
if (!p->pszDispType) {
TCHAR sz[MAX_PATH];
SHFILEINFO shfi;
p->pszDispType = new TCHAR[80]; // ???
wsprintf(sz, _T("%s\\%s"), m_szCurrent, p->pszName);
SHGetFileInfo(sz, NULL, &shfi, sizeof(shfi), SHGFI_TYPENAME);
_tcscpy(p->pszDispType, shfi.szTypeName);
}
pnmdi->item.pszText = p->pszDispType;
break;
}
case 3: //Date
{
if (!p->pszDispTime)
{
p->pszDispTime = new TCHAR[32];
SYSTEMTIME st;
FileTimeToSystemTime(&p->ft, &st);
SetFormatDateTime(&st, p->pszDispTime, 32);
}
pnmdi->item.pszText = p->pszDispTime;
break;
}
default: break;
}
}
}
}
void CFileDialog::CreateExtList()
{
DeleteExtList();
HWND hwndCombo = GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER);
int nIndex = SendMessage(hwndCombo, CLB_GETCURSEL, 0, 0);
if (nIndex == CB_ERR)
return;
TCHAR sz[MAX_LOADSTRING];
LPTSTR p;
LPTSTR pszSrc = (LPTSTR)SendMessage(hwndCombo, CLB_GETITEMDATA, nIndex, 0);
while (TRUE) {
p = sz;
while (*pszSrc != _T(';') && *pszSrc != NULL) {
*p++ = *pszSrc;
pszSrc++;
}
*p = NULL;
p = new TCHAR[_tcslen(sz) + 1];
_tcscpy(p, sz);
m_listExt.Add((DWORD)p);
if (*pszSrc == NULL)
break;
pszSrc++;
}
}
void CFileDialog::DeleteExtList()
{
LPTSTR p;
while (!m_listExt.IsEmpty()) {
p = (LPTSTR)m_listExt.RemoveAt(0);
delete [] p;
}
}
void CFileDialog::OnCBSelChange()
{
if (m_pszFilter) {
delete [] m_pszFilter;
m_pszFilter = NULL;
}
CreateExtList();
LoadFolderItem(m_szCurrent, FALSE);
}
LPTSTR CFileDialog::GetDisplayName(LPTSTR pszPath)
{
if (!_tcslen(pszPath) || _tcscmp(pszPath, _T("\\")) == 0)
return m_szRootName;
else
return pszPath;
}
void CFileDialog::ChangeListStyle(DWORD dwNewStyle)
{
DWORD dwStyle = GetWindowLong(m_hwndLV, GWL_STYLE);
switch (dwStyle & LVS_TYPEMASK) {
case LVS_ICON: dwStyle ^= LVS_ICON; break;
case LVS_SMALLICON: dwStyle ^= LVS_SMALLICON; break;
case LVS_LIST: dwStyle ^= LVS_LIST; break;
case LVS_REPORT: dwStyle ^= LVS_REPORT; break;
}
dwStyle |= dwNewStyle;
SetWindowLong(m_hwndLV, GWL_STYLE, dwStyle);
if (dwNewStyle == LVS_REPORT) {
ListView_SetExtendedListViewStyle(m_hwndLV, ListView_GetExtendedListViewStyle(m_hwndLV) |
LVS_EX_ONECLICKACTIVATE | LVS_EX_FULLROWSELECT | LVS_EX_TRACKSELECT);
}
else {
ListView_SetExtendedListViewStyle(m_hwndLV, 0);
}
}
void CFileDialog::OnUp()
{
TCHAR szPath[MAX_PATH] = _T("");
if (!_tcslen(m_szCurrent) || _tcscmp(m_szCurrent, _T("\\")) == 0)
return;
_tcscpy(szPath, m_szCurrent);
LPTSTR psz = _tcsrchr(szPath, _T('\\'));
if (psz) *psz = NULL;
LoadFolderItem(szPath);
}
void CFileDialog::OnListClick()
{
if (m_fSelMode)
SelectToggle();
else if (!GetAsyncKeyState(VK_CONTROL) && !GetAsyncKeyState(VK_SHIFT) && GetListSelectedCount() < 2)
OnListDblClk();
}
void CFileDialog::OnListDblClk()
{
if (m_fSelMode) {
SelectToggle();
return;
}
int nIndex = GetSelectedItemIndex(0);
if (nIndex != -1) {
TCHAR szPath[MAX_PATH];
LIST_ITEM_INFO* p = GetListItemInfo(nIndex);
if (p->type == ITEM_TYPE_DIR) {
wsprintf(szPath, _T("%s\\%s"), m_szCurrent, p->pszName);
LoadFolderItem(szPath);
}
else if (IsFolderShortcut(m_szCurrent, p->pszName)) {
TCHAR szTarget[MAX_PATH];
wsprintf(szPath, _T("%s\\%s"), m_szCurrent, p->pszName);
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();
}
}
else {
if (ListView_GetItemCount(m_hwndLV) == 1) {
if (!ListView_GetItemState(m_hwndLV, 0, LVIS_SELECTED)) {
ListView_SetItemState(m_hwndLV, 0, LVIS_SELECTED, LVIS_SELECTED);
}
}
}
}
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;
case VK_SPACE:
if (m_fSelMode) {
SelectToggle();
}
break;
case VK_LEFT:
case VK_RIGHT:
case VK_UP:
case VK_DOWN:
if (ListView_GetItemCount(m_hwndLV) == 1) {
if (!ListView_GetItemState(m_hwndLV, 0, LVIS_SELECTED)) {
ListView_SetItemState(m_hwndLV, 0, LVIS_SELECTED, LVIS_SELECTED);
}
}
break;
}
}
void CFileDialog::OnListItemChanged(NMLISTVIEW* 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 = GetListSelectedCount();
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;
}
void CFileDialog::OnSelMode()
{
m_fSelMode = !m_fSelMode;
}
void CFileDialog::SelectToggle()
{
if (!m_fSelMode)
return;
int nCount = ListView_GetItemCount(m_hwndLV);
for (int i = 0; i < nCount; i++) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_FOCUSED) == LVIS_FOCUSED) {
m_fSelMode = FALSE;
if (ListView_GetItemState(m_hwndLV, i, LVIS_SELECTED) == LVIS_SELECTED) {
ListView_SetItemState(m_hwndLV, i, 0, LVIS_SELECTED);
}
else {
ListView_SetItemState(m_hwndLV, i, LVIS_SELECTED, LVIS_SELECTED);
}
m_fSelMode = TRUE;
break;
}
};
}
BOOL CFileDialog::OnListItemChanging(NM_LISTVIEW* pnmlv)
{
if (!m_fSelMode)
return FALSE;
if ((pnmlv->uNewState & LVIS_SELECTED) != (pnmlv->uOldState & LVIS_SELECTED)) {
if (pnmlv->uNewState & LVIS_FOCUSED) {
m_fSelMode = FALSE;
ListView_SetItemState(m_hwndLV, pnmlv->iItem, pnmlv->uNewState & ~LVIS_SELECTED, 0xFFFF);
m_fSelMode = TRUE;
}
return TRUE;
}
return FALSE;
}
void CFileDialog::OnInitMenuPopup(HMENU hMenu)
{
DWORD dwStyle;
dwStyle = GetWindowLong(m_hwndLV, GWL_STYLE);
CheckMenuItem(hMenu, ID_KEY_CTRL, MF_BYCOMMAND| (m_fSelMode ? MF_CHECKED : MF_UNCHECKED));
CheckMenuRadioItem(hMenu, ID_LIST_STYLE_LIST, ID_LIST_STYLE_REPORT,
(dwStyle & LVS_TYPEMASK) == LVS_LIST ? ID_LIST_STYLE_LIST : ID_LIST_STYLE_REPORT, MF_BYCOMMAND);
}
void CFileDialog::OnSpinDeltaPos(NMUPDOWN* pnmud)
{
if (pnmud->hdr.idFrom == IDC_SPIN_FILTER) {
HWND hwndList = GetDlgItem(m_hwndDlg, IDC_LIST_FILTER);
int nSel = SendMessage(hwndList, CLB_GETCURSEL, 0, 0);
int nCount = SendMessage(hwndList, CLB_GETCOUNT, 0, 0);
if (pnmud->iDelta > 0) {
nSel = min(nSel + 1, nCount - 1);
}
else if (pnmud->iDelta < 0) {
nSel = max(nSel - 1, 0);
}
SendMessage(hwndList, CLB_SETCURSEL, nSel, 0);
OnCBSelChange();
}
}
int CFileDialog::GetListSelectedCount()
{
int nCount = ListView_GetItemCount(m_hwndLV);
int nSelected = 0;
for (int i = 0; i < nCount; i++) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_SELECTED) == LVIS_SELECTED)
nSelected++;
}
return nSelected;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -