⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filedlg.cpp

📁 WINCE SIMPLE mp3 Player
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				{
					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 + -