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

📄 filedlg.cpp

📁 GPlayer for Pocket PC,移动设备上的播放器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			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 + -