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

📄 filedlg.cpp

📁 GPlayer for Pocket PC,移动设备上的播放器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		delete [] m_pszFilter;
		m_pszFilter = NULL;
	}
	if (m_pszDefExt) {
		delete [] m_pszDefExt;
		m_pszDefExt = NULL;
	}
	if (m_pOrgListView) {
		SetWindowLong(m_hwndLV, GWL_WNDPROC, (DWORD)m_pOrgListView);
		m_pOrgListView = NULL;
	}
	
	m_helper.SHChangeNotifyDeregister(m_hwndDlg);
	ClearFilter();
	DeleteExtList();
	DestroyListView();
	CommandBar_Destroy(m_hwndCB);
	::EndDialog(m_hwndDlg, nResult);
}


BOOL CALLBACK CFileDialog::FileDlgProc(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);
		return  pDlg->OnInitDialog(hwndDlg);
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDOK:
			pDlg->OnOK();
			return TRUE;
		case IDCANCEL:
			pDlg->EndDialog(LOWORD(wParam));
			return TRUE;
		case ID_LIST_STYLE_LIST:
			pDlg->ChangeListStyle(LVS_LIST);
			return TRUE;
		case ID_LIST_STYLE_REPORT:
			pDlg->ChangeListStyle(LVS_REPORT);
			return TRUE;
		case ID_LIST_SELECTALL:
			pDlg->SelectAllItems();
			return TRUE;
		case ID_UP: 
			pDlg->OnUp();
			return TRUE;
		case ID_KEY_CTRL:
			pDlg->m_fCtrl = !pDlg->m_fCtrl;
			keybd_event(VK_CONTROL, 0x1e, pDlg->m_fCtrl ? 0 : KEYEVENTF_KEYUP, 1);
			{
				TBBUTTON tbb;
				SendMessage(pDlg->m_hwndCB, TB_GETBUTTON, 1, (LPARAM)&tbb);
				HMENU hMenu=HMENU(tbb.dwData);
				if(hMenu)
					CheckMenuItem(hMenu,ID_KEY_CTRL,MF_BYCOMMAND|(pDlg->m_fCtrl)?MF_CHECKED:MF_UNCHECKED);
			}
			return TRUE;
		case IDC_COMBO_FILTER:
			if (HIWORD(wParam) == CBN_SELCHANGE)
				pDlg->OnCBSelChange();
			return TRUE;
		case ID_NEW_FOLDER:
			pDlg->NewFolderDialog();
			return TRUE;
		}
		break;
		case WM_NOTIFY:
			{
				NMHDR* pnmh = (NMHDR*)lParam;
				switch (pnmh->code) {
				case LVN_GETDISPINFO:
					pDlg->OnGetDispInfo((NMLVDISPINFO*)lParam);
					return TRUE;
				case NM_CLICK:
					pDlg->OnListClick();
					return TRUE;
				case NM_DBLCLK:
				case NM_RETURN:
					pDlg->OnListDblClk();
					return TRUE;
				case LVN_KEYDOWN:
					pDlg->OnListKeyDown((NMLVKEYDOWN*)lParam);
					return TRUE;
				case LVN_COLUMNCLICK:
					pDlg->OnListColumnClick((NMLISTVIEW*)lParam);
					return TRUE;
				case LVN_ITEMCHANGED:
					pDlg->OnListItemChanged((NMLISTVIEW*)lParam);
					return TRUE;
				}
				break;
			}
		case WM_WININICHANGE:
			SetWindowLong(hwndDlg,GWL_STYLE,GetWindowLong(hwndDlg,GWL_STYLE)&~WS_VSCROLL);
			pDlg->CheckWindowSize();
			return TRUE;
		case WM_FILECHANGEINFO:
			if(HIWORD(lParam))
			{
				pDlg->OnFileChangeInfo(&(((FILECHANGENOTIFY *)lParam)->fci));
				pDlg->m_helper.SHChangeNotifyFree((FILECHANGENOTIFY *)lParam);
			}
			return TRUE;
		case WM_CTLCOLORSTATIC:
			return pDlg->m_helper.DefDlgCtlColorStaticProc(hwndDlg, wParam, lParam);
	}
	return FALSE;
}

int CFileDialog::GetDlgResourceID()
{
	if (m_helper.IsPocketPC()) {
		RECT rc;
		HWND hwndTB = FindWindow(_T("HHTaskBar"), NULL);
		GetWindowRect(hwndTB, &rc);
		if (rc.top == 0) {
			m_fDlgType = DLG_TYPE_PPC3;
			return IDD_OPENFILEDLG_PPC;
		}
	}
	else {
		if (GetSystemMetrics(SM_CXSCREEN) > 320) {
			m_fDlgType = DLG_TYPE_LARGE;
			return IDD_OPENFILEDLG_LARGE;
		}
		else if (GetSystemMetrics(SM_CXSCREEN) > 240) {
			m_fDlgType = DLG_TYPE_MEDIUM;
			return IDD_OPENFILEDLG_MEDIUM;
		}
	}
	m_fDlgType = DLG_TYPE_SMALL;
	return IDD_OPENFILEDLG_SMALL;
}

void CFileDialog::CreateToolBar()
{
	if (m_fDlgType == DLG_TYPE_PPC3) {
		// PocketPC
		TBBUTTON buttons[] = {
			//iBitmap, idCommand, fsState, fsStyle, dwData, iString
			{VIEW_PARENTFOLDER+2, ID_UP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
			{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
			{VIEW_NEWFOLDER+2, ID_NEW_FOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
			{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
			{VIEW_LIST+2, ID_LIST_STYLE_LIST, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
			{VIEW_DETAILS+2, ID_LIST_STYLE_REPORT, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
			{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
			{0, ID_LIST_SELECTALL, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
			{1, ID_KEY_CTRL, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}
		};
		if(m_helper.IsWM5())//WM5 Later
		{
			HMENU hMenu=LoadMenu(m_hInst,MAKEINTRESOURCE(IDR_TITLE));
			MENUITEMINFO mii;
			WCHAR str[32];
			mii.cbSize=sizeof(MENUITEMINFO);
			mii.fMask=MIIM_TYPE;
			mii.fType=MFT_STRING;
			mii.dwTypeData=str;
			
			m_helper.LoadString(IDS_MENU_UP, str, 32);
			SetMenuItemInfo(hMenu,ID_UP,FALSE,&mii);
			m_helper.LoadString(IDS_MENU_MENU, str, 32);
			SetMenuItemInfo(hMenu,1,TRUE,&mii);
			// remove by Y.N (It's buggy!)
			//m_helper.LoadString(IDS_CAPTION_NEWFOLDER, str, 32);
			//wcscat(str,L"...");
			//SetMenuItemInfo(hMenu,ID_NEW_FOLDER,FALSE,&mii);
			m_helper.LoadString(IDS_SMALLICONS, str, 32);
			SetMenuItemInfo(hMenu,ID_LIST_STYLE_LIST,FALSE,&mii);
			m_helper.LoadString(IDS_DETAIL, str, 32);
			SetMenuItemInfo(hMenu,ID_LIST_STYLE_REPORT,FALSE,&mii);
			int r = m_helper.LoadString(IDS_MENU_SELECTALL, str, 32);
			SetMenuItemInfo(hMenu,ID_LIST_SELECTALL,FALSE,&mii);

			// add by Y.N start
			m_helper.LoadString(IDS_MENU_KEYCTRL, str, 32);
			SetMenuItemInfo(hMenu,ID_KEY_CTRL,FALSE,&mii);
			m_helper.LoadString(IDS_CAPTION_CANCEL, str, 32);
			SetMenuItemInfo(hMenu,IDCANCEL,FALSE,&mii);
			// add by Y.N end
			
			//CheckMenuRadioItem(hMenu, ID_LIST_STYLE_LIST, ID_LIST_STYLE_REPORT, ID_LIST_STYLE_LIST, MF_BYCOMMAND); // modified by Y.N
			if(m_fSave || !(m_pofn->Flags & OFN_ALLOWMULTISELECT)) 
			{
				DeleteMenu(hMenu,ID_LIST_SELECTALL,MF_BYCOMMAND);
				DeleteMenu(hMenu,ID_KEY_CTRL,MF_BYCOMMAND);
			}

			// add by Y.N (It's buggy!)
			DeleteMenu(hMenu, ID_NEW_FOLDER, MF_BYCOMMAND);

			m_hwndCB = m_helper.SHCreateMenuBar(m_hwndDlg, m_hInst, (int)hMenu, 0, 0,0x0010/*SHCMBF_HMENU*/);
		}
		else
		{
			m_hwndCB = m_helper.SHCreateMenuBar(m_hwndDlg, m_hInst, IDR_DUMMY, IDR_TOOLBAR_PPC, 2);
			CommandBar_AddBitmap(m_hwndCB, HINST_COMMCTRL , IDB_VIEW_SMALL_COLOR, 12, 16, 16);
			if (!m_fSave && (m_pofn->Flags & OFN_ALLOWMULTISELECT)) {
				// multi select (with Ctrl)
				CommandBar_AddButtons(m_hwndCB, sizeof(buttons) / sizeof(TBBUTTON), buttons);
			}
			else {
				// single select
				CommandBar_AddButtons(m_hwndCB, 6, buttons);
			}
		}
		
		if (m_pofn->lpstrTitle && _tcslen(m_pofn->lpstrTitle)) {
			SetWindowText(m_hwndDlg, m_pofn->lpstrTitle);
			SetDlgItemText(m_hwndDlg, IDC_TITLE, m_pofn->lpstrTitle);
		}
		else {
			TCHAR sz[MAX_LOADSTRING];
			m_helper.LoadString(m_fSave ? IDS_SAVE_TITLE : IDS_OPEN_TITLE, sz, MAX_LOADSTRING);
			SetWindowText(m_hwndDlg, sz);
			SetDlgItemText(m_hwndDlg, IDC_TITLE, sz);
		}
	}
	else {
		// other device
		TCHAR sz[MAX_LOADSTRING] = _T("");
		if (m_fDlgType != DLG_TYPE_SMALL && m_pofn->lpstrTitle && _tcslen(m_pofn->lpstrTitle))
			_tcsncpy(sz, m_pofn->lpstrTitle, MAX_LOADSTRING - 1);
		else {
			m_helper.LoadString(m_fSave ? IDS_SAVE_TITLE : IDS_OPEN_TITLE, sz, MAX_LOADSTRING);
		}
		m_hwndRB = CommandBands_Create(m_hInst, m_hwndDlg, 0, WS_VISIBLE | CCS_TOP | RBBS_NOGRIPPER, NULL);
		
		REBARBANDINFO rbi;
		memset(&rbi, 0, sizeof(REBARBANDINFO));
		rbi.cbSize = sizeof (REBARBANDINFO);
		rbi.fMask = RBBIM_STYLE | RBBIM_TEXT;
		rbi.fStyle = RBBS_NOGRIPPER;
		rbi.lpText = sz;
		CommandBands_AddBands(m_hwndRB, m_hInst, 1, &rbi);
		m_hwndCB = CommandBands_GetCommandBar(m_hwndRB, 0);
		CommandBar_AddBitmap(m_hwndCB, HINST_COMMCTRL , IDB_VIEW_SMALL_COLOR, 12, 16, 16);
		
		TBBUTTON buttons[] = {
			//iBitmap, idCommand, fsState, fsStyle, dwData, iString
			{VIEW_PARENTFOLDER, ID_UP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
			{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
			{VIEW_NEWFOLDER, ID_NEW_FOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
			{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
			{VIEW_LIST, ID_LIST_STYLE_LIST, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
			{VIEW_DETAILS, ID_LIST_STYLE_REPORT, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}
		};
		CommandBar_AddButtons(m_hwndCB, sizeof(buttons) / sizeof(TBBUTTON), buttons); 
		CommandBands_AddAdornments(m_hwndRB, m_hInst, CMDBAR_OK, 0);
		
	}
	
	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);
	if (m_fDlgType != DLG_TYPE_PPC3)
		SendMessage(m_hwndRB, WM_SETFONT, (WPARAM)m_hFnt, 0);
}

void CFileDialog::CheckWindowSize()
{
	if (m_fDlgType == DLG_TYPE_PPC3) {
		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);
		//ComboBox_GetDroppedControlRect(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, 5/*rc.bottom - rc.top*/, TRUE);
		
		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()
{
	if (m_fDlgType == DLG_TYPE_PPC3) {
		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 = rcParent.bottom - rc.top - m_helper.SipPanelHeight() +1;
		
		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, CB_ADDSTRING, 0, (LPARAM)szFilter);
			if (nIndex == CB_ERR)
				break;
			
			p = new TCHAR[_tcslen(szExt) + 1];
			_tcscpy(p, szExt);
			SendMessage(hwndCombo, CB_SETITEMDATA, nIndex, (LPARAM)p);
		}
		if (*pszSrc == NULL && *(pszSrc + 1) == NULL)
			break;
		pszSrc++;
	}
	
	nIndex = m_pofn->nFilterIndex > 0 ? m_pofn->nFilterIndex - 1 : 0;
	SendMessage(hwndCombo, CB_SETCURSEL, nIndex, 0);
	return;
fail:
	ClearFilter();
	*szFilter=0;
	::LoadString(m_hInst,IDS_DEF_EXT, szExt, MAX_LOADSTRING);
	p = new TCHAR[_tcslen(szExt) + 1];
	_tcscpy(p, szExt);
	SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)szFilter);
	SendMessage(hwndCombo, CB_SETITEMDATA, 0, (LPARAM)p);
	SendMessage(hwndCombo, CB_SETCURSEL, 0, 0);
	EnableWindow(hwndCombo,FALSE);//
}

void CFileDialog::ClearFilter()
{
	HWND hwndCombo = GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER);
	int n = SendMessage(hwndCombo, CB_GETCOUNT, 0, 0);
	for (int i = 0; i < n; i++) {
		LPTSTR p = (LPTSTR)SendMessage(hwndCombo, CB_GETITEMDATA, i, 0);
		delete [] p;
	}
	SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);
}

void CFileDialog::GetShellSettings()
{
	HKEY hKey = 0;
	_tcscpy(m_szRootName, bslash);
	if (m_fDlgType == DLG_TYPE_PPC3)
	{
		m_helper.LoadString(IDS_DEF_ROOT_NAME, m_szRootName, MAX_LOADSTRING);
	} else 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 dwSize = sizeof(m_fShowExt);
		RegQueryValueEx(hKey, _T("ShowExt"), 0, NULL, (LPBYTE)&m_fShowExt, &dwSize);
		dwSize = sizeof(m_fViewAll);
		RegQueryValueEx(hKey, _T("ViewAll"), 0, NULL, (LPBYTE)&m_fViewAll, &dwSize);
		RegCloseKey(hKey);
	}
}

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;
	
	int scale=GetSystemMetrics(SM_CXSMICON)/16;
	for(int i=0;i<4;i++)

⌨️ 快捷键说明

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