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

📄 mainwndcmd.cpp

📁 PPC流行的播放软件gsplayer源码
💻 CPP
字号:
#include "GSPlayer2.h"
#include "MainWnd.h"
#ifdef _WIN32_WCE
#include "FolderDlg.h"
#endif

#ifdef _WIN32_WCE_PPC
#include "EffectDlgPPC.h"
#else
#include "EffectDlg.h"
#endif

#define FILE_BUFF_LEN 2048

BOOL CMainWnd::OpenMediaFile(BOOL fAdd, HWND hwndParent)
{
	if (m_fShowOpenDlg)
		return FALSE;

	BOOL fRet;
	m_fShowOpenDlg = TRUE;
	CTempStr strTitle(fAdd ? IDS_TITLE_ADD_FILE : IDS_TITLE_OPEN_FILE);
	CTempStr strFilter;
	TCHAR szFile[FILE_BUFF_LEN] = {0};
#ifdef _WIN32_WCE
	OPENFILENAME ofn;
	memset(&(ofn), 0, sizeof(ofn));
	ofn.lStructSize	= sizeof(ofn);
	ofn.hwndOwner   = hwndParent ? hwndParent : m_hWnd;
	ofn.lpstrFile   = szFile;
	ofn.nMaxFile    = FILE_BUFF_LEN;	
	ofn.lpstrTitle  = strTitle;

	BOOL (*gsGetOpenFileName)(OPENFILENAME*) = NULL;
	HINSTANCE hInst = LoadLibrary(_T("gsgetfile.dll"));
	if (hInst) {
		(FARPROC&)gsGetOpenFileName = GetProcAddress(hInst, _T("gsGetOpenFileName"));
	}

	if (gsGetOpenFileName) {
		strFilter.Load(IDS_FILTER_OPEN_FILE);
		ofn.lpstrFilter = strFilter;
		ofn.Flags       = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY;
		ofn.lpstrInitialDir = m_pOptions->m_szLastDir;
		fRet = gsGetOpenFileName(&ofn);
	}
	else {
		strFilter.Load(IDS_FILTER_OPEN_FILE2);
		ofn.lpstrFilter = strFilter;
		ofn.Flags       = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
		ofn.lpstrInitialDir = m_pOptions->m_szLastDir;
		fRet = GetOpenFileName(&ofn);
	}

	if (hInst) FreeLibrary(hInst);
#else
	strFilter.Load(IDS_FILTER_OPEN_FILE);

	OPENFILENAME ofn;
	memset(&(ofn), 0, sizeof(ofn));
	ofn.lStructSize	= sizeof(ofn);
	ofn.hwndOwner   = hwndParent ? hwndParent : m_hWnd;
	ofn.lpstrFile   = szFile;
	ofn.nMaxFile    = FILE_BUFF_LEN;	
	ofn.lpstrTitle  = strTitle;
	ofn.lpstrFilter = strFilter;
	ofn.Flags       = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY;
	ofn.lpstrInitialDir = m_pOptions->m_szLastDir;

	fRet = GetOpenFileName(&ofn);
#endif
	m_fShowOpenDlg = FALSE;
	if (!fRet)
		return FALSE;

	// 婛懚偺儕僗僩傪嶍彍
	if (!fAdd) DeleteAllFile();

	// 捛壛
	DWORD dw = GetFileAttributes(szFile);
	if (dw != 0xFFFFFFFF) {
		if (!(dw & FILE_ATTRIBUTE_DIRECTORY)) {
			// single
			if (IsPlayList(szFile))
				LoadPlayList(szFile);
			else 
				AddFile(szFile);
			LPTSTR psz = _tcsrchr(szFile, _T('\\'));
			if (psz) *psz = _T('\0');
				_tcscpy(m_pOptions->m_szLastDir, szFile);
		}
		else {
			// multi
			TCHAR szPath[MAX_PATH];

			LPTSTR p = szFile;
			_tcscpy(m_pOptions->m_szLastDir, szFile);
			while (TRUE) {
				p += _tcslen(p);
				if (*p != NULL || *(p + 1) == NULL)
					break;

				wsprintf(szPath, _T("%s\\%s"), m_pOptions->m_szLastDir, ++p);
				if (IsPlayList(szPath))
					LoadPlayList(szPath);
				else
					AddFile(szPath);
			}
		}
	}
	return TRUE;
}

void CMainWnd::SaveMediaFile(HWND hwndParent)
{
	if (m_fShowOpenDlg)
		return;

	BOOL fRet;
	CTempStr strTitle(IDS_TITLE_SAVE_LIST);
	CTempStr strFilter(IDS_FILTER_SAVE_LIST);
	TCHAR szFile[MAX_PATH] = {0};

	m_fShowOpenDlg = TRUE;
#ifdef _WIN32_WCE
	OPENFILENAME ofn;
	memset(&(ofn), 0, sizeof(ofn));
	ofn.lStructSize	= sizeof(ofn);
	ofn.hwndOwner   = hwndParent ? hwndParent : m_hWnd;
	ofn.lpstrFile   = szFile;
	ofn.nMaxFile    = MAX_PATH;	
	ofn.lpstrTitle  = strTitle;
	ofn.lpstrFilter = strFilter;
	ofn.lpstrDefExt = M3U_FILE_EXT;
	ofn.Flags       = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
	ofn.lpstrInitialDir = m_pOptions->m_szLastDir;

	BOOL (*gsGetSaveFileName)(OPENFILENAME*) = NULL;
	HINSTANCE hInst = LoadLibrary(_T("gsgetfile.dll"));
	if (hInst) {
		(FARPROC&)gsGetSaveFileName = GetProcAddress(hInst, _T("gsGetSaveFileName"));
	}

	if (gsGetSaveFileName)
		fRet = gsGetSaveFileName(&ofn);
	else
		fRet = GetSaveFileName(&ofn);

	if (hInst) FreeLibrary(hInst);
#else
	OPENFILENAME ofn;
	memset(&(ofn), 0, sizeof(ofn));
	ofn.lStructSize	= sizeof(ofn);
	ofn.hwndOwner   = m_hWnd;
	ofn.lpstrFile   = szFile;
	ofn.nMaxFile    = MAX_PATH;	
	ofn.lpstrTitle  = strTitle;
	ofn.lpstrFilter = strFilter;
	ofn.lpstrDefExt = M3U_FILE_EXT;
	ofn.Flags       = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
	ofn.lpstrInitialDir = m_pOptions->m_szLastDir;

	fRet = GetSaveFileName(&ofn);
#endif
	m_fShowOpenDlg = FALSE;
	if (!fRet)
		return;

	SavePlayList(szFile);
}

////////////////////////////////////////////////////////////////////////////////
void CMainWnd::OnFileOpen()
{
	if (OpenMediaFile(FALSE) && m_pListFile->GetCount())
		Play();

	if (m_pPlayListDlg)
		m_pPlayListDlg->UpdatePlayList();
}

void CMainWnd::OnFileOpenLocation()
{
	TCHAR szLocation[MAX_URL];
	if (m_pOptions->ShowLocationDlg(m_hWnd, szLocation) == IDOK) {
		DeleteAllFile();
		AddFile(szLocation);
		if (m_pListFile->GetCount())
			Play();

		if (m_pPlayListDlg)
			m_pPlayListDlg->UpdatePlayList();
	}
}

void CMainWnd::OnFileAdd()
{
	OpenMediaFile(TRUE);

	if (m_pPlayListDlg)
		m_pPlayListDlg->UpdatePlayList();
}

void CMainWnd::OnFileFind()
{
	TCHAR szPath[MAX_PATH] = {0};
#ifdef _WIN32_WCE
	CFolderDlg dlg;
	dlg.SetSubFolder(m_pOptions->m_fSearchSubFolders);
	if (dlg.ShowFolderDlg(m_hWnd, szPath, MAX_PATH) == IDCANCEL)
		return;

	m_pOptions->m_fSearchSubFolders = dlg.GetSubFolder();
#else
	CTempStr strTitle(IDS_TITLE_FIND_FILE);

	//僼僅儖僟慖戰僟僀傾儘僌偺昞帵
	LPMALLOC pmalloc;
	LPITEMIDLIST lPIDL;
	LPITEMIDLIST pIDL;
	if (SUCCEEDED(SHGetMalloc(&pmalloc))) {
		if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &lPIDL)))	{
			TCHAR szBuff[MAX_PATH];
			_tcscpy(szBuff, m_pOptions->m_szLastDir);
			BROWSEINFO binfo = {0};
			binfo.hwndOwner = m_hWnd;
			binfo.lpszTitle = strTitle;
			binfo.pidlRoot = lPIDL;
			binfo.pszDisplayName = szBuff;
			binfo.ulFlags = BIF_RETURNONLYFSDIRS;
			pIDL = SHBrowseForFolder(&binfo);
			if (pIDL)
				SHGetPathFromIDList(pIDL, szPath);
			pmalloc->Free(pIDL);
		}
		pmalloc->Release();
	}

	if (!_tcslen(szPath))
		return;
#endif
	_tcscpy(m_pOptions->m_szLastDir, szPath);
	AddDir(szPath);

	if (m_pPlayListDlg)
		m_pPlayListDlg->UpdatePlayList();
}

void CMainWnd::OnFileList()
{
	if (!m_pPlayListDlg)
		m_pPlayListDlg = new CPlayListDlg();
	m_pPlayListDlg->Show(this);
}

void CMainWnd::OnFileSaveList()
{
	SaveMediaFile();
}

void CMainWnd::OnPlayPlayPause()
{
	if (MAP_GetStatus(m_hMap) == MAP_STATUS_STOP) {
		Play();
	}
	else 
		Pause();
}

void CMainWnd::OnPlayStop()
{
	// 儗僕儏乕儉梡偺忣曬傪庢摼偟偰偍偔
	if (m_pOptions->m_fResume && MAP_GetStatus(m_hMap) != MAP_STATUS_STOP) {
		m_pOptions->m_nResumeTime = MAP_GetCurrent(m_hMap);
	}

	if (MAP_GetStatus(m_hMap) == MAP_STATUS_STOP)
		MAP_AudioDeviceClose(m_hMap);

	// 掆巭張棟
	Stop();

	// 僔儍僢僼儖僼儔僌傪儕僙僢僩
	if (m_pOptions->m_fShuffle) {
		ResetShuffle();
		FILEINFO* p = (FILEINFO*)m_pListFile->GetAt(m_nCurrent);
		if (p) p->fShuffle = TRUE;
	}

	// 儗僕儏乕儉偺応崌帪崗傪僙僢僩
	if (m_pOptions->m_fResume) {
		MAP_Seek(m_hMap, m_pOptions->m_nResumeTime);
		m_pOptions->m_nResumeTime = 0;
	}

	UpdateTime();
	UpdateStatus();
	UpdateStreamTitle();
}

void CMainWnd::OnPlayPrev()
{
	BOOL fPlay = MAP_GetStatus(m_hMap) != MAP_STATUS_STOP;

	// 僼傽僀儖嵞惗偺帪偵嵞惗帪娫偑2昩埲忋側傜愭摢偵
	// 2昩枹枮偺応崌偼慜偺嬋
	FILEINFO* pInfo = GetInfo(GetCurrentFile());
	if (pInfo && !IsURL(pInfo->szPath)) {
		long lCurrent = MAP_GetCurrent(m_hMap);
		if (fPlay && lCurrent > 2000) {
			MAP_Seek(m_hMap, 0);
			return;
		}
	}

	int nPrev = GetPrevIndex();
	if (nPrev == OPEN_NONE)
		return;

	Open(nPrev);
	if (fPlay)
		Play();
}

void CMainWnd::OnPlayNext()
{
	int nNext = GetNextIndex();
	if (nNext == OPEN_NONE)
		return;

	BOOL fPlay = MAP_GetStatus(m_hMap) != MAP_STATUS_STOP;
	Open(nNext);
	if (fPlay)
		Play();
}

void CMainWnd::OnPlayRew()
{
	Seek((MAP_GetCurrent(m_hMap) - SKIP_INTERVAL));
}

void CMainWnd::OnPlayFf()
{
	Seek((MAP_GetCurrent(m_hMap) + SKIP_INTERVAL));
}

void CMainWnd::OnPlayRepeat()
{
	switch (m_pOptions->m_fRepeat) {
	case COptions::RepeatNone:
		m_pOptions->m_fRepeat = COptions::RepeatAll;
		break;
	case COptions::RepeatAll:
		m_pOptions->m_fRepeat = COptions::RepeatOne;
		break;
	default:
		m_pOptions->m_fRepeat = COptions::RepeatNone;
		break;
	}
	UpdatePlayOption();
}

void CMainWnd::OnPlayRepeatNone()
{
	m_pOptions->m_fRepeat = COptions::RepeatNone;
	UpdatePlayOption();
}

void CMainWnd::OnPlayRepeatAll()
{
	m_pOptions->m_fRepeat = COptions::RepeatAll;
	UpdatePlayOption();
}

void CMainWnd::OnPlayRepeatOne()
{
	m_pOptions->m_fRepeat = COptions::RepeatOne;
	UpdatePlayOption();
}

void CMainWnd::OnPlayShuffle()
{
	m_pOptions->m_fShuffle = !m_pOptions->m_fShuffle;
	if (m_pOptions->m_fShuffle) {
		srand(GetTickCount());
		FILEINFO* p = (FILEINFO*)m_pListFile->GetAt(m_nCurrent);
		if (p) p->fShuffle = TRUE;
	}
	else {
		ResetShuffle();
	}
	UpdatePlayOption();
}

#define VOLUME_INT ((double)0xFFFF * 2 / 100)
void CMainWnd::OnToolVolUp()
{
	DWORD dwVolume;
	waveOutGetVolume(NULL, &dwVolume);

	double dLeft = LOWORD(dwVolume) + 1;
	double dRight = HIWORD(dwVolume) + 1;

	//left channnel (low word)
	dLeft = min(dLeft + VOLUME_INT, 0xFFFF);

	//right channel (high word)
	dRight = min(dRight + VOLUME_INT, 0xFFFF);

	waveOutSetVolume(NULL, MAKELONG((int)dLeft, (int)dRight));

	// 昞帵傪峏怴 (悢昩屻偵尦偵栠偡)
	KillTimer(m_hWnd, ID_TIMER_VOLUME);
	m_fDrawVolume = TRUE;
	UpdateTitle();
	SetTimer(m_hWnd, ID_TIMER_VOLUME, TIMER_VOLUME_INTERVAL, NULL);

	UpdateVolumeSlider();
}

void CMainWnd::OnToolVolDown()
{
	DWORD dwVolume;
	waveOutGetVolume(NULL, &dwVolume);

	double dLeft = LOWORD(dwVolume) + 1;
	double dRight = HIWORD(dwVolume) + 1;

	//left channnel (low word)
	dLeft = max(dLeft - VOLUME_INT, 0);

	//right channel (high word)
	dRight = max(dRight - VOLUME_INT, 0);

	waveOutSetVolume(NULL, MAKELONG((int)dLeft, (int)dRight));

	// 昞帵傪峏怴 (悢昩屻偵尦偵栠偡)
	KillTimer(m_hWnd, ID_TIMER_VOLUME);
	m_fDrawVolume = TRUE;
	UpdateTitle();
	SetTimer(m_hWnd, ID_TIMER_VOLUME, TIMER_VOLUME_INTERVAL, NULL);

	UpdateVolumeSlider();
}

void CMainWnd::OnToolEffect()
{
	CEffectDlg dlg;
	dlg.ShowEffectDlg(m_hWnd, m_hMap);
}

void CMainWnd::OnToolTopMost()
{
	m_pOptions->m_fTopMost = !m_pOptions->m_fTopMost;
	SetWindowPos(m_hWnd, m_pOptions->m_fTopMost ? HWND_TOPMOST : HWND_NOTOPMOST, 
						0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
}

void CMainWnd::OnToolOption()
{
	m_pOptions->ShowOptionDlg(m_hWnd, m_hMap);
	MAP_SetScanPeek(m_hMap, m_pOptions->m_fDrawPeek);

	// 嵞昤夋偡傞
	DeleteImages();
	InitImages();
	InvalidateRect(m_hWnd, NULL, TRUE);
	UpdateWindow(m_hWnd);
}

void CMainWnd::OnToolSleepTimer()
{
	if (m_pOptions->ShowSleepTimerDlg(m_hWnd)) {
		if (m_pOptions->m_nSleepTime != -1) {
			m_pOptions->m_nSleepTime = 0;
			m_pOptions->m_dwSleepLast = GetTickCount();
			SetTimer(m_hWnd, ID_TIMER_SLEEPTIMER, TIMER_SLEEPTIMER_INTERVAL, NULL);
		}
		else {
			KillTimer(m_hWnd, ID_TIMER_SLEEPTIMER);
		}
	}
}

void CMainWnd::OnShowMenu(POINT* ppt)
{
	if (m_hMenu)
		return;

	m_hMenu = LoadMenu(GetInst(), (LPCTSTR)IDR_POPUP);
	HMENU hSub = GetSubMenu(m_hMenu, IDM_SUBMENU_MAIN);

	POINT pt;
	if (ppt)
		pt = *ppt;
	else {
		if (m_pSkin->GetImageList(IMAGELIST_BUTTON)) {
			pt.x = BTN_LEFT + BTN_MENU * BTN_WIDTH + (BTN_WIDTH / 2);
			pt.y = BTN_TOP + (BTN_HEIGHT / 2);
		}
		else {
			pt.x = 0;
			pt.y = 0;
		}
	}
	ClientToScreen(m_hWnd, &pt);

	switch (m_pOptions->m_fRepeat) {
	case COptions::RepeatAll:
		CheckMenuItem(hSub, IDM_PLAY_REPEAT_ALL, MF_BYCOMMAND | MF_CHECKED);
		break;
	case COptions::RepeatOne:
		CheckMenuItem(hSub, IDM_PLAY_REPEAT_ONE, MF_BYCOMMAND | MF_CHECKED);
		break;
	default:
		CheckMenuItem(hSub, IDM_PLAY_REPEAT_NONE, MF_BYCOMMAND | MF_CHECKED);
		break;
	}
	if (m_pOptions->m_fShuffle)
		CheckMenuItem(hSub, IDM_PLAY_SHUFFLE, MF_BYCOMMAND | MF_CHECKED);
	if (m_pOptions->m_fTopMost)
		CheckMenuItem(hSub, IDM_TOOL_TOPMOST, MF_BYCOMMAND | MF_CHECKED);

	SetForegroundWindow(m_hWnd);
	TrackPopupMenu(hSub, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, m_hWnd, NULL);
	DestroyMenu(m_hMenu);
	m_hMenu = NULL;
}

⌨️ 快捷键说明

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