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

📄 filedlg.cpp

📁 WINCE SIMPLE mp3 Player
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		break;
	}
	case WM_WININICHANGE:
		pDlg->CheckListHeight();
		return TRUE;
	case WM_PAINT:
		return pDlg->m_helper.DefDlgPaintProc(hwndDlg, wParam, lParam);
	case WM_CTLCOLORSTATIC:
		return pDlg->m_helper.DefDlgCtlColorStaticProc(hwndDlg, wParam, lParam);
	case WM_INITMENUPOPUP:
		pDlg->OnInitMenuPopup((HMENU)wParam);
		return TRUE;
	case WM_SIZE:
		pDlg->CheckWindowSize();
		return TRUE;
	}
	return FALSE;
}

int CFileDialog::GetDlgResourceID()
{
	if (m_helper.IsPocketPC()) {
		m_fDlgType = DLG_TYPE_PPC3;
		return IDD_OPENFILEDLG_PPC;
	}
	else if (m_helper.IsSmartPhone()) {
		m_fDlgType = DLG_TYPE_SP;
		return IDD_OPENFILEDLG_SP;
	}
	return 0;
}

void CFileDialog::CreateToolBar()
{
	BOOL bMultiSel = FALSE;
	if ((m_pofn->Flags & OFN_ALLOWMULTISELECT) && !m_fSave)
		bMultiSel = TRUE;

	m_hwndCB = m_helper.SHCreateMenuBar(m_hwndDlg, bMultiSel ? IDR_MAIN_MULTI : IDR_MAIN_SINGLE);

	if (m_hFnt) {
		DeleteObject(m_hFnt);
	}
	m_hFnt = CreatePointFont(90, _T(""), TRUE);
	SendMessage(GetDlgItem(m_hwndDlg, IDC_STATIC_CURRENT_TEXT), WM_SETFONT, (WPARAM)m_hFnt, 0);
}

void CFileDialog::CheckWindowSize()
{
	RECT rcParent;
	GetClientRect(m_hwndDlg, &rcParent);
	int nRight = rcParent.right - 5;

	RECT rc;
	GetWindowRect(GetDlgItem(m_hwndDlg, IDCANCEL), &rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
	MoveWindow(GetDlgItem(m_hwndDlg, IDCANCEL), nRight - (rc.right - rc.left), rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);

	GetWindowRect(GetDlgItem(m_hwndDlg, IDC_EDIT_NAME), &rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
	MoveWindow(GetDlgItem(m_hwndDlg, IDC_EDIT_NAME), rc.left, rc.top, nRight - rc.left, rc.bottom - rc.top, TRUE);

	GetWindowRect(GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER), &rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
	MoveWindow(GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER), rc.left, rc.top, nRight - rc.left, rc.bottom - rc.top, TRUE);

	if (m_fDlgType == DLG_TYPE_SP) {
		SendMessage(GetDlgItem(m_hwndDlg, IDC_SPIN_FILTER), UDM_SETBUDDY, (WPARAM)GetDlgItem(m_hwndDlg, IDC_LIST_FILTER), 0);
	}

	nRight += 5;
	GetWindowRect(GetDlgItem(m_hwndDlg, IDC_LIST_FILE), &rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
	MoveWindow(GetDlgItem(m_hwndDlg, IDC_LIST_FILE), rc.left, rc.top, nRight - rc.left, rc.bottom - rc.top, TRUE);

	CheckListHeight();
}

void CFileDialog::CheckListHeight()
{
	RECT rc, rcParent;
	GetClientRect(m_hwndDlg, &rcParent);
	GetWindowRect(GetDlgItem(m_hwndDlg, IDC_LIST_FILE), &rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
	ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);

	int nHeight = m_helper.IsSipPanelVisible() ? 
		rcParent.bottom - rc.top - 80 : rcParent.bottom - rc.top;

	MoveWindow(GetDlgItem(m_hwndDlg, IDC_LIST_FILE), rc.left, rc.top, 
										rc.right - rc.left, nHeight, TRUE);
}

void CFileDialog::ParseFilter()
{
	int nIndex;
	TCHAR szFilter[MAX_LOADSTRING];
	TCHAR szExt[MAX_LOADSTRING];
	LPTSTR pszSrc, p;
	HWND hwndCombo = GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER);

	if (!m_pofn->lpstrFilter)
		goto fail;

	pszSrc = (LPTSTR)m_pofn->lpstrFilter;
	while (TRUE) {
		// filter
		p = szFilter;
		while (*pszSrc != NULL) {
			*p++ = *pszSrc;
			pszSrc++;
		}
		*p = NULL;
		if (*pszSrc == NULL && *(pszSrc + 1) == NULL)
			break;
		pszSrc++;

		// ext
		p = szExt;
		while (*pszSrc != NULL) {
			*p++ = *pszSrc;
			pszSrc++;
		}
		*p = NULL;
		if (_tcslen(szFilter) && _tcslen(szExt)) {
			int nIndex = SendMessage(hwndCombo, CLB_ADDSTRING, 0, (LPARAM)szFilter);
			if (nIndex == CB_ERR)
				break;
			
			p = new TCHAR[_tcslen(szExt) + 1];
			_tcscpy(p, szExt);
			SendMessage(hwndCombo, CLB_SETITEMDATA, nIndex, (LPARAM)p);
		}
		if (*pszSrc == NULL && *(pszSrc + 1) == NULL)
			break;
		pszSrc++;
	}
	
	nIndex = m_pofn->nFilterIndex > 0 ? m_pofn->nFilterIndex - 1 : 0;
	SendMessage(hwndCombo, CLB_SETCURSEL, nIndex, 0);
	return;
fail:
	ClearFilter();
	LoadString(g_hInst, IDS_DEF_FILTER, szFilter, MAX_LOADSTRING);
	LoadString(g_hInst, IDS_DEF_EXT, szExt, MAX_LOADSTRING);
	p = new TCHAR[_tcslen(szExt) + 1];
	_tcscpy(p, szExt);
	SendMessage(hwndCombo, CLB_ADDSTRING, 0, (LPARAM)szFilter);
	SendMessage(hwndCombo, CLB_SETITEMDATA, 0, (LPARAM)p);
	SendMessage(hwndCombo, CLB_SETCURSEL, 0, 0);
}

void CFileDialog::ClearFilter()
{
	HWND hwndCombo = GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER);
	int n = SendMessage(hwndCombo, CLB_GETCOUNT, 0, 0);
	for (int i = 0; i < n; i++) {
		LPTSTR p = (LPTSTR)SendMessage(hwndCombo, CLB_GETITEMDATA, i, 0);
		delete p;
	}
	SendMessage(hwndCombo, CLB_RESETCONTENT, 0, 0);
}

void CFileDialog::GetShellSettings()
{
	LoadString(g_hInst, IDS_DEF_ROOT_NAME, m_szRootName, MAX_LOADSTRING);

#if 0
	if (m_fDlgType == DLG_TYPE_PPC3)
		return;

	HKEY hKey = 0;
	if (RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("{000214A0-0000-0000-C000-000000000046}"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
		DWORD dwType, dwSize = sizeof(m_szRootName);
		RegQueryValueEx(hKey, _T("DisplayName"), 0, &dwType, (LPBYTE)m_szRootName, &dwSize);
		RegCloseKey(hKey);
	}

	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Explorer"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
		DWORD dwType, dwSize = sizeof(m_fShowExt);
		RegQueryValueEx(hKey, _T("ShowExt"), 0, &dwType, (LPBYTE)&m_fShowExt, &dwSize);
		RegCloseKey(hKey);
	}
#endif
}

void CFileDialog::InitListView()
{
	TCHAR sz[MAX_LOADSTRING];

	if (!(m_pofn->Flags & OFN_ALLOWMULTISELECT) || m_fSave)
		SetWindowLong(m_hwndLV, GWL_STYLE, GetWindowLong(m_hwndLV, GWL_STYLE) | LVS_SINGLESEL);

	LVCOLUMN lvc;
	lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
	lvc.pszText = sz;

	lvc.fmt = LVCFMT_LEFT;
	lvc.cx = s_nListColumnWidth[0];
	lvc.iSubItem = 0;
	LoadString(g_hInst, IDS_COLUMN_NAME, sz, MAX_LOADSTRING);
	ListView_InsertColumn(m_hwndLV, 0, &lvc);

	lvc.fmt = LVCFMT_RIGHT;
	lvc.cx = s_nListColumnWidth[1];
	lvc.iSubItem = 1;
	LoadString(g_hInst, IDS_COLUMN_SIZE, sz, MAX_LOADSTRING);
	ListView_InsertColumn(m_hwndLV, 1, &lvc);

	lvc.fmt = LVCFMT_LEFT;
	lvc.cx = s_nListColumnWidth[2];
	lvc.iSubItem = 2;
	LoadString(g_hInst, IDS_COLUMN_TYPE, sz, MAX_LOADSTRING);
	ListView_InsertColumn(m_hwndLV, 2, &lvc);

	lvc.fmt = LVCFMT_LEFT;
	lvc.cx = s_nListColumnWidth[3];
	lvc.iSubItem = 3;
	LoadString(g_hInst, IDS_COLUMN_DATE, sz, MAX_LOADSTRING);
	ListView_InsertColumn(m_hwndLV, 3, &lvc);

	m_ImageList.Init();
	ListView_SetImageList(m_hwndLV, (HIMAGELIST)m_ImageList, LVSIL_SMALL);
}

void CFileDialog::DestroyListView()
{
	DeleteAllListItem();
	m_ImageList.Destroy();
}

void CFileDialog::DeleteAllListItem()
{
	for (int i = 0; i < ListView_GetItemCount(m_hwndLV); i++) {
		LIST_ITEM_INFO* pDel = GetListItemInfo(i);
		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_DeleteAllItems(m_hwndLV);
}

BOOL CFileDialog::LoadFolderItem(LPCTSTR pszPath, BOOL fFocus)
{
	if (!pszPath)
		return FALSE;

	DWORD dwAttr = GetFileAttributes(pszPath);
	if (dwAttr == 0xFFFFFFFF ||
		!(dwAttr & FILE_ATTRIBUTE_DIRECTORY))
		return FALSE;

	HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
	ShowWindow(m_hwndLV, SW_HIDE);

	m_fSelMode = FALSE;
	DeleteAllListItem();

	TCHAR sz[MAX_PATH];
	TCHAR szPath[MAX_PATH];
	WIN32_FIND_DATA wfd;

	_tcscpy(szPath, pszPath);
	LPTSTR psz = _tcsrchr(szPath, _T('\\'));
	if (psz && *(psz + 1) == NULL)
		*psz = NULL;

	// folder
	wsprintf(sz, _T("%s\\*.*"), szPath);
	HANDLE hFind = FindFirstFile(sz, &wfd);
	if (hFind != INVALID_HANDLE_VALUE) {
		do {
			if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
				AddListItem(szPath, &wfd);
			else if (m_listExt.IsEmpty())
				AddListItem(szPath, &wfd);
			else if (IsFolderShortcut(szPath, wfd.cFileName))
				AddListItem(szPath, &wfd);
		}
		while (FindNextFile(hFind, &wfd));
		FindClose(hFind);
	}

	// files
	if (m_pszFilter) {
		wsprintf(sz, _T("%s\\%s"), szPath, m_pszFilter);
		hFind = FindFirstFile(sz, &wfd);
		if (hFind != INVALID_HANDLE_VALUE) {
			do {
				if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
					!IsFolderShortcut(szPath, wfd.cFileName))
					AddListItem(szPath, &wfd);
			}
			while (FindNextFile(hFind, &wfd));
			FindClose(hFind);
		}
	}
	else {
		int n = m_listExt.GetCount();
		for (int i = 0; i < n; i++) {
			LPTSTR p = (LPTSTR)m_listExt.GetAt(i);
			wsprintf(sz, _T("%s\\%s"), szPath, p);
			hFind = FindFirstFile(sz, &wfd);
			if (hFind != INVALID_HANDLE_VALUE) {
				do {
					if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
						!IsFolderShortcut(szPath, wfd.cFileName))
						AddListItem(szPath, &wfd);
				}
				while (FindNextFile(hFind, &wfd));
				FindClose(hFind);
			}
		}
	}
	
	if (ListView_GetItemCount(m_hwndLV)) {
		SortList();
		ListView_SetItemState(m_hwndLV, 0, LVIS_FOCUSED, LVIS_FOCUSED);
	}
	
	_tcscpy(m_szCurrent, szPath);
	SetDlgItemText(m_hwndDlg, IDC_STATIC_CURRENT_TEXT, GetDisplayName(m_szCurrent));

	BOOL fUp = (_tcslen(szPath) && _tcscmp(szPath, _T("\\")) != 0);
	SendMessage(m_hwndCB, TB_SETSTATE, ID_UP, fUp ? TBSTATE_ENABLED : TBSTATE_INDETERMINATE);

	SetCursor(hCursor);
	ShowWindow(m_hwndLV, SW_SHOW);
	UpdateWindow(m_hwndLV);

	if (fFocus)
		SetFocus(m_hwndLV);
	return TRUE;
}

void CFileDialog::SortList()
{
	m_fSelMode = FALSE;
	switch (m_nListSort)
	{
		case LIST_SORT_NAME:
			ListView_SortItems(m_hwndLV, ListSortCompareFuncByName, m_fSortOrder);
			break;
		case LIST_SORT_EXT:
			ListView_SortItems(m_hwndLV, ListSortCompareFuncByExt, m_fSortOrder);
			break;
		case LIST_SORT_SIZE:
			ListView_SortItems(m_hwndLV, ListSortCompareFuncBySize, m_fSortOrder);
			break;
		case LIST_SORT_TIME:
			ListView_SortItems(m_hwndLV, ListSortCompareFuncByTime, m_fSortOrder);
			break;
		default:
			ListView_SortItems(m_hwndLV, ListSortCompareFuncByName, m_fSortOrder);
			break;
	}
}

void CFileDialog::AddListItem(LPCTSTR pszPath, WIN32_FIND_DATA* pwfd)
{
	LVITEM li;
	LIST_ITEM_INFO* p;

	if (pwfd->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
		return;

	if (pwfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
		p = new LIST_ITEM_INFO;
		p->type = ITEM_TYPE_DIR;
		p->pszName = new TCHAR[_tcslen(pwfd->cFileName) + 1];
		memset(p->pszName, 0, sizeof(TCHAR) * (_tcslen(pwfd->cFileName) + 1));
		_tcscpy(p->pszName, pwfd->cFileName);
		p->llSize = 0;
		p->ft = pwfd->ftCreationTime;
		
		li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		li.iItem = 0;
		li.iSubItem = 0;
		li.iImage = I_IMAGECALLBACK;
		li.lParam = (DWORD)p;
		li.pszText = LPSTR_TEXTCALLBACK;
		ListView_InsertItem(m_hwndLV, &li);
		ListView_SetItemText(m_hwndLV, 0, 2, LPSTR_TEXTCALLBACK);
	}
	else {
		p = new LIST_ITEM_INFO;
		p->type = ITEM_TYPE_FILE;
		p->pszName = new TCHAR[_tcslen(pwfd->cFileName) + 1];
		memset(p->pszName, 0, sizeof(TCHAR) * (_tcslen(pwfd->cFileName) + 1));
		_tcscpy(p->pszName, pwfd->cFileName);
		p->llSize = ((ULONGLONG)pwfd->nFileSizeHigh << 32) | pwfd->nFileSizeLow;
		p->ft = pwfd->ftLastWriteTime;
		FileTimeToLocalFileTime(&p->ft, &p->ft);
		li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		li.iItem = 0;
		li.iSubItem = 0;
		li.iImage = I_IMAGECALLBACK;
		li.lParam = (DWORD)p;
		li.pszText = LPSTR_TEXTCALLBACK;
		ListView_InsertItem(m_hwndLV, &li);
		ListView_SetItemText(m_hwndLV, 0, 1, LPSTR_TEXTCALLBACK);
		ListView_SetItemText(m_hwndLV, 0, 2, LPSTR_TEXTCALLBACK);
		ListView_SetItemText(m_hwndLV, 0, 3, LPSTR_TEXTCALLBACK);
	}
}

LIST_ITEM_INFO* CFileDialog::GetListItemInfo(int nIndex)
{
	LVITEM li;
	li.iItem = nIndex;
	li.iSubItem = 0;
	li.mask = LVIF_PARAM;
	ListView_GetItem(m_hwndLV, &li);
	return (LIST_ITEM_INFO*)li.lParam;
}

int CFileDialog::GetSelectedItemIndex(int nStart)
{
	int nIndex = -1;
	int nItemCount = ListView_GetItemCount(m_hwndLV);
	for (int i = nStart; i < nItemCount; i++)	{
		if (ListView_GetItemState(m_hwndLV, i, LVIS_SELECTED) == LVIS_SELECTED)
			return i;
	}

	return -1;
}

void CFileDialog::OnGetDispInfo(NMLVDISPINFO* pnmdi)
{
	LIST_ITEM_INFO* p = GetListItemInfo(pnmdi->item.iItem);
	if (pnmdi->item.mask & LVIF_IMAGE) {
		if (p->nIcon == -1)
			p->nIcon = m_ImageList.GetImageListIndex(p->pszName, m_szCurrent);
		pnmdi->item.iImage = p->nIcon;
	}
	if ((pnmdi->item.mask & LVIF_TEXT)) {
		if (p->type == ITEM_TYPE_DIR) {
			switch (pnmdi->item.iSubItem) {
				case 0: //Name
					pnmdi->item.pszText = p->pszName;
					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;
				}
				default: break;
			}
		}
		else
		{
			switch (pnmdi->item.iSubItem) {
				case 0: //Name

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -