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

📄 mainwnd.cpp

📁 PPC流行的播放软件gsplayer源码2.24版
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "GSPlayer2.h"
#include "MainWnd.h"

////////////////////////////////////////////////////////////////////////////////
// public儊儞僶
CMainWnd::CMainWnd()
{
	m_hWnd = NULL;
	m_hAccel = NULL;
	m_hMenu = NULL;
	m_hFnt = NULL;
	m_hFntTitle = NULL;

	m_pSkin = NULL;
	m_hBakDC = NULL;
	m_hBakBmp = NULL;
	m_hMemDC = NULL;
	m_hMemBmp = NULL;
	m_pPlayListDlg = NULL;

	m_nWidth = MAINWND_WIDTH;
	m_nHeight = MAINWND_HEIGHT;
	m_nPeek[0] = m_nPeek[1] = 0;

	m_nClientWidth = MAINWND_WIDTH;
	m_nClientHeight = MAINWND_HEIGHT;
	m_nDispWidth = DISP_WIDTH;
	m_nDispHeight = DISP_HEIGHT;
	m_nBtnTop = BTN_TOP;
	m_nBtnMax = BTN_MAX;

	m_nStatusTop = STATUS_TOP;
	m_nStatusHeight = STATUS_HEIGHT;
	m_nTitleTop = TITLE_TOP;
	m_nTitleWidth = TITLE_WIDTH;
	m_nTitleHeight = TITLE_HEIGHT;
	m_nSeekTop = SEEK_TOP;
	m_nSeekWidth = SEEK_WIDTH;
	m_nStreamTitleTop = STREAM_TITLE_TOP;
	m_nStreamTitleWidth = STREAM_TITLE_WIDTH;
	m_nStreamTitleHeight = STREAM_TITLE_HEIGHT;

	m_nVolumeSliderLeft = VOLSLIDER_LEFT;
	m_nVolumeSliderTop = VOLSLIDER_TOP;
	m_nVolumeSliderWidth = VOLSLIDER_WIDTH;
	m_nVolumeSliderHeight = VOLSLIDER_HEIGHT;
	m_nVolumeTrackWidth = VOLTRACK_WIDTH;

	m_fPressed = FALSE;
	m_nPressed = -1;
	m_ptPressed.x = -1;
	m_ptPressed.y = -1;
	m_fVolPressed = FALSE;
	m_fDrawVolume = FALSE;
	m_nLastDrawTime = -1;
	m_nLastDrawSeek = -1;
	m_fShowOpenDlg = FALSE;

	m_hMap = MAP_Initialize();
	m_pListFile = new CMultiBuff();
	m_nCurrent = OPEN_NONE;
	m_pOptions = NULL;
	m_hTrayIcon = NULL;
	m_fRegEvent = FALSE;

	m_nTitleLen = 0;
	m_nTitlePos = 0;
	m_nTitleWait = 0;
	m_nStreamTitleLen = 0;
	m_nStreamTitlePos = 0;
	m_nStreamTitleWait = 0;
	m_pszOpenFilter = NULL;

	srand(GetTickCount());

	// User Agent偺愝掕
	MAP_STREAMING_OPTIONS options;
	MAP_GetStreamingOptions(m_hMap, &options);
	_tcscpy(options.szUserAgent, STREAMING_USER_AGENT);
	MAP_SetStreamingOptions(m_hMap, &options);
}

CMainWnd::~CMainWnd()
{
	DeleteAllFile();
	if (m_pOptions) {
		delete m_pOptions;
		m_pOptions = NULL;
	}
	if (m_pSkin) {
		delete m_pSkin;
		m_pSkin = NULL;
}
	if (m_hMap) {
		MAP_Uninitialize(m_hMap);
		m_hMap = NULL;
	}
	if (m_pListFile) {
		delete m_pListFile;
		m_pListFile = NULL;
	}
	if (m_hAccel) {
		DestroyAcceleratorTable(m_hAccel);
		m_hAccel = NULL;
	}
	if (m_pszOpenFilter) {
		delete m_pszOpenFilter;
		m_pszOpenFilter = NULL;
	}
}

COptions* CMainWnd::GetOptionsClass()
{
	return new COptions();
}

CSkin* CMainWnd::GetSkinClass()
{
	return new CSkin();
}

BOOL CMainWnd::CanTransAccel(MSG* pMsg)
{
	return pMsg->hwnd == m_hWnd;
}

BOOL CMainWnd::Create(LPTSTR pszCmdLine, HWND hwndParent, DWORD dwStyle)
{
	CWaitCursor wc;

	// 僋儔僗偺搊榐
	RegisterClass();

	// 僂僀儞僪僂嶌惉
#ifdef _WIN32_WCE
	CreateWindowEx(0, MAINWND_CLASS_NAME, MAINWND_TITLE, dwStyle, 
		0, 0, m_nClientWidth, m_nClientHeight, NULL, NULL, GetInst(), this);
#else
	CreateWindowEx(WS_EX_ACCEPTFILES, MAINWND_CLASS_NAME, MAINWND_TITLE, dwStyle, 
		0, 0, m_nClientWidth, m_nClientHeight, NULL, NULL, GetInst(), this);
#endif

	if (!m_hWnd)
		return FALSE;

	// 僂僀儞僪僂僒僀僘傪挷惍偡傞
	RECT rc;
	GetClientRect(m_hWnd, &rc);
	m_nWidth = m_nClientWidth + (m_nClientWidth - RECT_WIDTH(&rc));
	m_nHeight = m_nClientHeight + (m_nClientHeight - RECT_HEIGHT(&rc));
	MoveWindow(m_hWnd, 0, 0, m_nWidth, m_nHeight, TRUE);
	
	// 恊僂僀儞僪僂偑側偄応崌偼僂僀儞僪僂傪弶婜埵抲偵堏摦
	if (!hwndParent) {
		MoveWindow(m_hWnd, m_pOptions->m_ptInitWnd.x, 
							m_pOptions->m_ptInitWnd.y,
							m_nWidth, m_nHeight, FALSE);
	}
	ShowWindow(m_hWnd, SW_SHOW);
	UpdateWindow(m_hWnd);

	SetWindowPos(m_hWnd, m_pOptions->m_fTopMost ? HWND_TOPMOST : HWND_NOTOPMOST, 
					0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

	if (_tcslen(pszCmdLine)) {
		SendCmdLine(m_hWnd, pszCmdLine);
	}
	else {
		// 僨僼僅儖僩儕僗僩偺撉傒崬傒
		if (m_pOptions->m_fSaveDefList) {
			m_nCurrent = 0;	// 奐偐側偄傛偆偵偡傞

			// 撉傒崬傒
			TCHAR szPath[MAX_PATH];
			GetDefPlayListPath(szPath);
			LoadPlayList(szPath);

			m_nCurrent = OPEN_NONE;

			// 儗僕儏乕儉忣曬傪斀塮偡傞
			if (m_pOptions->m_fResume && 
				m_pOptions->m_nResumeTrack != -1 &&
				m_pOptions->m_nResumeTrack < m_pListFile->GetCount()) {
				Open(m_pOptions->m_nResumeTrack);
				if (m_nCurrent == OPEN_NONE)
					OpenFirstFile();
				else {
					MAP_Seek(m_hMap, m_pOptions->m_nResumeTime);
					m_pOptions->m_nResumeTime = 0;
				}
			}
			else
				OpenFirstFile();
			if (m_pOptions->m_fPlayOnStart)
				Play();
		}
	}
	return TRUE;
}

HACCEL CMainWnd::GetAccelHandle()
{
	if (!m_hAccel) {
		ACCEL accel[] = {
			{FVIRTKEY, 'Z', IDM_PLAY_PLAYPAUSE},		// Play/Pause
			{FVIRTKEY, VK_RETURN, IDM_PLAY_PLAYPAUSE},	// Play/Pause
			{FVIRTKEY, 'X', IDM_PLAY_STOP},				// Stop
			{FVIRTKEY, VK_SPACE, IDM_PLAY_STOP},		// Stop
			{FVIRTKEY, 'C', IDM_PLAY_PREV},				// Prev
			{FVIRTKEY, VK_LEFT, IDM_PLAY_PREV},			// Prev
			{FVIRTKEY, 'V', IDM_PLAY_REW},				// Rew
			{FVIRTKEY, VK_PRIOR, IDM_PLAY_REW},			// Rew
			{FVIRTKEY, 'B', IDM_PLAY_FF},				// FF
			{FVIRTKEY, VK_NEXT, IDM_PLAY_FF},			// FF
			{FVIRTKEY, 'N', IDM_PLAY_NEXT},				// Next
			{FVIRTKEY, VK_RIGHT, IDM_PLAY_NEXT},		// Next
			{FVIRTKEY, 'R', IDM_PLAY_REPEAT},			// Repeat
			{FVIRTKEY, 'H', IDM_PLAY_SHUFFLE},			// Shuffle
			{FVIRTKEY, 'O', IDM_FILE_OPEN},				// Open
			{FVIRTKEY, 'U', IDM_FILE_OPEN_LOCATION},	// Open Location
			{FVIRTKEY, 'A', IDM_FILE_ADD},				// Add
			{FVIRTKEY, 'F', IDM_FILE_FIND},				// Find
			{FVIRTKEY, 'L', IDM_FILE_LIST},				// List
			{FVIRTKEY, 'S', IDM_FILE_SAVE_LIST},		// Save List
			{FVIRTKEY, VK_TAB, IDM_FILE_LIST},			// List
			{FVIRTKEY, 'E', IDM_TOOL_EFFECT},			// Effect
			{FVIRTKEY, VK_UP, IDM_TOOL_VOLUP},			// Volume Up
			{FVIRTKEY, VK_DOWN, IDM_TOOL_VOLDOWN},		// Volume Down
			{FVIRTKEY, 'M', IDM_SHOW_MENU},				// Show Menu
			{FVIRTKEY, VK_ESCAPE, IDM_APP_SHOWHIDE},	// Show / Hide
			{FVIRTKEY | FCONTROL, 'Q', IDM_APP_EXIT},	// Exit
		};
		m_hAccel = CreateAcceleratorTable(accel, sizeof(accel) / sizeof(ACCEL));
	}
	return m_hAccel;
}

BOOL CMainWnd::IsDialogMessage(LPMSG pMsg)
{
	if (m_pPlayListDlg) {
		return m_pPlayListDlg->IsDialogMessage(pMsg);
	}
	return FALSE;
}

void CMainWnd::CheckSystem()
{
	::CheckSystem();
}

////////////////////////////////////////////////////////////////////////////////
// 僂僀儞僪僂僾儘僔乕僕儍
LRESULT CALLBACK CMainWnd::MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static CMainWnd* pMainWnd;
	switch (uMsg) {
		case WM_CREATE:
		{
			CREATESTRUCT* pcs;
			pcs = (CREATESTRUCT*)lParam;
			pMainWnd = (CMainWnd*)pcs->lpCreateParams;
			pMainWnd->OnCreate(hwnd);
			return 0;
		}
		case WM_COMMAND:
			return pMainWnd->OnCommand(wParam, lParam);
		case WM_DESTROY:
			pMainWnd->OnDestroy();
			return 0;
		case WM_LBUTTONDOWN:
			pMainWnd->OnLButtonDown((short)LOWORD(lParam), (short)HIWORD(lParam));
			return 0;
		case WM_LBUTTONUP:
			pMainWnd->OnLButtonUp((short)LOWORD(lParam), (short)HIWORD(lParam));
			return 0;
		case WM_MOUSEMOVE:
			pMainWnd->OnMouseMove(wParam, (short)LOWORD(lParam), (short)HIWORD(lParam));
			return 0;
		case WM_RBUTTONUP:
		{
			POINT pt = {LOWORD(lParam), HIWORD(lParam)};
			pMainWnd->OnShowMenu(&pt);
			return 0;
		}
		case WM_ERASEBKGND:
			pMainWnd->OnEraseBkgnd((HDC)wParam);
			return 0;
		case WM_TIMER:
			pMainWnd->OnTimer(wParam);
			return 0;
		case WM_MOVE:
			pMainWnd->OnMove(LOWORD(lParam), HIWORD(lParam));
			return 0;
		case WM_SIZE:
			pMainWnd->OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
			return 0;
		case WM_ACTIVATE:
			pMainWnd->OnActivate(LOWORD(wParam), (BOOL)HIWORD(wParam), (HWND)lParam);
			return 0;
		case WM_HOTKEY:
			pMainWnd->OnHotKey((int)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam));
			return 0;
		case WM_PAINT:
		{
			PAINTSTRUCT ps;
			HDC hDC = BeginPaint(hwnd, &ps);
			pMainWnd->OnPaint(hDC, &ps);
			EndPaint(hwnd, &ps);
			return 0;
		}
#ifdef _WIN32_WCE
		case WM_COPYDATA:
			pMainWnd->OnCopyData((COPYDATASTRUCT*)lParam);
			return 0;
#else
		case WM_DROPFILES:
			pMainWnd->OnDropFiles((HDROP)wParam);
			return 0;
#endif
		case MAP_MSG_STATUS:
			pMainWnd->OnMsgStatus((MAP_STATUS)wParam, lParam);
			return 0;
		case MAP_MSG_PEEK:
			pMainWnd->OnMsgPeek(wParam, lParam);
			return 0;
		case MAP_MSG_STREAM_TITLE:
			pMainWnd->OnMsgStreamTitle((LPTSTR)wParam);
			return 0;
		case WM_CLOSE:
			pMainWnd->OnClose();
			return 0;
		case WM_TRAYNOTIFY:
			pMainWnd->OnTrayNotify(lParam);
			return 0;
#ifdef REGISTER_WAKE_EVENT
		case WM_WAKEUP:
			pMainWnd->OnWakeUp();
			return 0;
#endif
		default:
			return DefWindowProc(hwnd, uMsg, wParam, lParam);
	}
}

////////////////////////////////////////////////////////////////////////////////
// 儊僢僙乕僕僴儞僪儔
void CMainWnd::OnCreate(HWND hWnd)
{
	m_hWnd = hWnd;

	// 僆僾僔儑儞僋儔僗偺嶌惉
	m_pOptions = GetOptionsClass();

	// 僗僉儞僋儔僗偺嶌惉
	m_pSkin = GetSkinClass();

	// 愝掕偺撉傒崬傒
	Load();

	// 僀儊乕僕偺儘乕僪
	if (!InitImages()) {
		DeleteImages();
	}

	// 弶婜壔張棟
	MAP_SetMessageWindow(m_hMap, m_hWnd);
	SetTimer(m_hWnd, ID_TIMER_TIME, TIMER_TIME_INTERVAL, NULL);
	SetTimer(m_hWnd, ID_TIMER_SUSPEND, TIMER_SUSPEND_INTERVAL, NULL);
	SetTimer(m_hWnd, ID_TIMER_VOLSLIDER, TIMER_VOLSLIDER_INTERVAL, NULL);

	// 傾僀僐儞偺僙僢僩
	HICON hIcon = LoadIcon(GetInst(), (LPCTSTR)IDI_MAIN);
	SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
	DestroyIcon(hIcon);

#ifdef _WIN32_WCE
	hIcon = (HICON)LoadImage(GetInst(), (LPCTSTR)IDI_MAIN, IMAGE_ICON, 16, 16, 0);
	SendMessage(m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
	DestroyIcon(hIcon);
#endif

#ifdef REGISTER_WAKE_EVENT
	TCHAR sz[MAX_PATH];
	GetModuleFileName(GetInst(), sz, MAX_PATH);
	LPTSTR psz = _tcschr(sz + 1, _T('\\'));
	if (psz) {
		*psz = NULL;
		if (_tcscmp(sz, _T("\\")) != 0 &&
			!(GetFileAttributes(sz) & FILE_ATTRIBUTE_TEMPORARY))
			m_fRegEvent = TRUE;
		*psz = _T('\\');
	}
	else m_fRegEvent = TRUE;


	if (m_fRegEvent)
		CeRunAppAtEvent(sz, NOTIFICATION_EVENT_WAKEUP);
#endif
}

void CMainWnd::OnEraseBkgnd(HDC hDC)
{
}

BOOL NeedToRepaint(RECT* prc1, RECT* prc2)
{
	RECT rc;
	IntersectRect(&rc, prc1, prc2);
	return !IsRectEmpty(&rc);
}

void CMainWnd::OnPaint(HDC hDC, PAINTSTRUCT* pps)
{
	RECT rc;

	if (!m_hMemDC || !m_hMemBmp)
		return;

	// 儊儌儕DC傪嶌惉偟攚宨傪昤夋
	BitBlt(m_hMemDC, pps->rcPaint.left, pps->rcPaint.top,
		RECT_WIDTH(&pps->rcPaint), RECT_HEIGHT(&pps->rcPaint),
		m_hBakDC, pps->rcPaint.left, pps->rcPaint.top, SRCCOPY);

	// 儃僞儞
	for (int i = 0; i < m_nBtnMax; i++) {
		SetRect(&rc, BTN_LEFT + (BTN_WIDTH * i), m_nBtnTop, 
			BTN_LEFT + (BTN_WIDTH * (i + 1)), m_nBtnTop + BTN_HEIGHT);
		if (NeedToRepaint(&pps->rcPaint, &rc))
			DrawButton(m_hMemDC, i);
	}

	// 僩儔僢僋No.
	SetRect(&rc, TRACK_LEFT, TRACK_TOP, 
			TRACK_LEFT + TRACK_WIDTH, TRACK_TOP + TRACK_HEIGHT);
	if (NeedToRepaint(&pps->rcPaint, &rc))
		DrawTrack(m_hMemDC);

	// 帪崗
	SetRect(&rc, TIME_LEFT, TIME_TOP, 
			TIME_LEFT + TIME_WIDTH, TIME_TOP + TIME_HEIGHT);
	if (NeedToRepaint(&pps->rcPaint, &rc))
		DrawTime(m_hMemDC);

	// 僔乕僋僶乕
	SetRect(&rc, SEEK_LEFT, m_nSeekTop, 
			SEEK_LEFT + m_nSeekWidth, m_nSeekTop + SEEK_HEIGHT);
	if (NeedToRepaint(&pps->rcPaint, &rc))
		DrawSeek(m_hMemDC);

	// 忣曬
	SetRect(&rc, INFO_LEFT, INFO_TOP, 
			INFO_LEFT + INFO_WIDTH, INFO_TOP + INFO_HEIGHT);
	if (NeedToRepaint(&pps->rcPaint, &rc))
		DrawInfo(m_hMemDC);

	// 僆僾僔儑儞
	SetRect(&rc, PLAYOPT_LEFT, PLAYOPT_TOP, 
			PLAYOPT_LEFT + PLAYOPT_WIDTH, PLAYOPT_TOP + PLAYOPT_HEIGHT);
	if (NeedToRepaint(&pps->rcPaint, &rc))
		DrawPlayOption(m_hMemDC);

	// 僞僀僩儖 (儃儕儏乕儉)
	SetRect(&rc, TITLE_LEFT, m_nTitleTop, 
		TITLE_LEFT + m_nTitleWidth, m_nTitleTop + m_nTitleHeight);
	if (NeedToRepaint(&pps->rcPaint, &rc))
		DrawTitle(m_hMemDC);

	// 僗僥乕僞僗
	SetRect(&rc, STATUS_LEFT, m_nStatusTop, 
		STATUS_LEFT + STATUS_WIDTH, m_nStatusTop + m_nStatusHeight);
	if (NeedToRepaint(&pps->rcPaint, &rc))

⌨️ 快捷键说明

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