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

📄 mainwnd.cpp

📁 PPC流行的播放软件gsplayer源码2.24版
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#endif

void CMainWnd::OnMsgStatus(MAP_STATUS status, BOOL fError)
{
	if (status == MAP_STATUS_STOP) {
		Stop();

		// 1儕僺乕僩帪
		if (m_pOptions->m_fRepeat == COptions::RepeatOne) {
			if (!fError)
				Play();
			else {
				int n = m_nCurrent;
				Close();
				Open(m_nCurrent);
			}
		}
		else {
			// 師傪嵞惗
			int nNext = GetNextIndex(TRUE, fError);
			if (nNext != OPEN_NONE) {
				fError ? Open(nNext) : Play(nNext);
			}
			else {
				// 儕僗僩偺廔抂偵払偟偨偲偒
				UpdateTime();
				UpdateStatus();
				UpdateStreamTitle();

				// 儕僗僩偺愭摢偵栠偡
				nNext = m_pOptions->m_fShuffle ? GetNextIndex(TRUE) : 0;
				Open(nNext);
			}
		}
	}
	else if (status == MAP_STATUS_PLAY) {
		MAP_GetFileInfo(m_hMap, &GetInfo(m_nCurrent)->info);
		UpdateInfo();
		UpdateTitle();
		UpdateStreamTitle();
	}
	else if (status == MAP_STATUS_WAIT) {
		if (MAP_GetStreamingStatus(m_hMap) > MAP_STREAMING_DISCONNECTED) {
			UpdateStreamTitle();
			SetTimer(m_hWnd, ID_TIMER_STREAMINGWAIT, TIMER_STREAMINGWAIT_INTERVAL, NULL);
		}
	}
	UpdateStatus();
}

void CMainWnd::OnMsgPeek(int nLeft, int nRight)
{
	if (!m_pOptions->m_fDrawPeek)
		return;

	m_nPeek[0] = nLeft;
	m_nPeek[1] = nRight;
	UpdatePeek();
}

void CMainWnd::OnMsgStreamTitle(LPTSTR pszTitle)
{
	UpdateStreamTitle();
}

LRESULT CMainWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
	switch (LOWORD(wParam)) {
		case IDM_APP_EXIT:
			PostMessage(m_hWnd, WM_CLOSE, 0, 0);
			return 0;
		case IDM_FILE_OPEN:
			OnFileOpen();
			return 0;
		case IDM_FILE_OPEN_LOCATION:
			OnFileOpenLocation();
			return 0;
		case IDM_FILE_ADD:
			OnFileAdd();
			return 0;
		case IDM_FILE_FIND:
			OnFileFind();
			return 0;
		case IDM_FILE_LIST:
			OnFileList();
			return 0;
		case IDM_FILE_SAVE_LIST:
			OnFileSaveList();
			return 0;
		case IDM_PLAY_PLAYPAUSE:
			OnPlayPlayPause();
			return 0;
		case IDM_PLAY_STOP:
			OnPlayStop();
			return 0;
		case IDM_PLAY_PREV:
			OnPlayPrev();
			return 0;
		case IDM_PLAY_NEXT:
			OnPlayNext();
			return 0;
		case IDM_PLAY_REW:
			OnPlayRew();
			return 0;
		case IDM_PLAY_FF:
			OnPlayFf();
			return 0;
		case IDM_PLAY_REPEAT:
			OnPlayRepeat();
			return 0;
		case IDM_PLAY_REPEAT_NONE:
			OnPlayRepeatNone();
			return 0;
		case IDM_PLAY_REPEAT_ALL:
			OnPlayRepeatAll();
			return 0;
		case IDM_PLAY_REPEAT_ONE:
			OnPlayRepeatOne();
			return 0;
		case IDM_PLAY_SHUFFLE:
			OnPlayShuffle();
			return 0;
		case IDM_SHOW_MENU:
			OnShowMenu();
			return 0;
		case IDM_TOOL_EFFECT:
			OnToolEffect();
			return 0;
		case IDM_TOOL_OPTION:
			OnToolOption();
			return 0;
		case IDM_TOOL_VOLUP:
			OnToolVolUp();
			return 0;
		case IDM_TOOL_VOLDOWN:
			OnToolVolDown();
			return 0;
		case IDM_TOOL_TOPMOST:
			OnToolTopMost();
			return 0;
		case IDM_TOOL_SLEEPTIMER:
			OnToolSleepTimer();
			return 0;
		case IDM_HELP_ABOUT:
			m_pOptions->ShowAboutDlg(m_hWnd, m_hMap);
			return 0;
		case IDM_APP_SHOWHIDE:
			if (GetWindowLong(m_hWnd, GWL_STYLE) & WS_VISIBLE) {
#ifndef _WIN32_WCE_PPC
				ShowWindow(m_hWnd, SW_MINIMIZE);
#endif
			}
			else {
				ShowWindow(m_hWnd, SW_RESTORE);
				RegisterTrayIcon(FALSE);
				SetForegroundWindow(m_hWnd);
			}
			return 0;
		default:
			return 0;
	}
}

void CMainWnd::OnTrayNotify(UINT uMsg)
{
	if (GetWindowLong(m_hWnd, GWL_STYLE) & WS_DISABLED)
		return;

	if (uMsg == WM_LBUTTONDBLCLK) {
		ShowWindow(m_hWnd, SW_RESTORE);
		RegisterTrayIcon(FALSE);
		SetForegroundWindow(m_hWnd);
	}
	else if (uMsg == WM_LBUTTONDOWN || 
			uMsg == WM_RBUTTONDOWN) {

		if (m_hMenu)
			return;

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

		POINT pt;
		UINT uFlags;
#ifdef _WIN32_WCE
		pt.x = GetSystemMetrics(SM_CXSCREEN);
		pt.y = GetSystemMetrics(SM_CYSCREEN) - 25;
		uFlags = TPM_RIGHTALIGN | TPM_BOTTOMALIGN;
#else
		GetCursorPos(&pt);
		uFlags = TPM_LEFTALIGN | TPM_TOPALIGN;
		SetMenuDefaultItem(hSub, IDM_APP_SHOWHIDE, FALSE);
#endif

		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, uFlags, pt.x, pt.y, 0, m_hWnd, NULL);
		DestroyMenu(m_hMenu);
		m_hMenu = NULL;
	}
}

#ifdef REGISTER_WAKE_EVENT
void CMainWnd::OnWakeUp()
{
	if (MAP_GetStatus(m_hMap) == MAP_STATUS_PLAY) {
		Pause();
	}
}
#endif

////////////////////////////////////////////////////////////////////////////////
void CMainWnd::RegisterClass()
{
	WNDCLASS	wc;
	memset(&wc, 0, sizeof(WNDCLASS));
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wc.lpfnWndProc = (WNDPROC)MainWndProc;
    wc.hInstance = GetInst();
    wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wc.lpszClassName = MAINWND_CLASS_NAME;
#ifndef _WIN32_WCE
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
#endif
	::RegisterClass(&wc);
}

BOOL CMainWnd::InitImages()
{
	m_pSkin->Load(m_pOptions->m_szSkinFile);

	// 昤夋梡DC傪嶌惉
	HDC hDC = GetDC(m_hWnd);
	m_hMemDC = CreateCompatibleDC(hDC);
	m_hMemBmp = CreateCompatibleBitmap(hDC, m_nClientWidth, m_nClientHeight);
	SelectObject(m_hMemDC, m_hMemBmp);

	// 攚宨傪儊儌儕DC偵昤夋偟偰偍偔
	m_hBakDC = CreateCompatibleDC(hDC);
	m_hBakBmp = CreateCompatibleBitmap(hDC, m_nClientWidth, m_nClientHeight);
	SelectObject(m_hBakDC, m_hBakBmp);
	DrawBackground(m_hBakDC);
	ReleaseDC(m_hWnd, hDC);

	// 僼僅儞僩
	LOGFONT lf;
	memset(&lf, 0, sizeof(LOGFONT));
	lf.lfCharSet = DEFAULT_CHARSET;
#ifdef _WIN32_WCE
	lf.lfHeight = 11;
	_tcscpy(lf.lfFaceName, _T("Tahoma"));
#else
	lf.lfHeight = 10;
#endif
	m_hFnt = CreateFontIndirect(&lf);
	m_hFntTitle = m_hFnt;

	// 僗僉儞偺夁嫀僶乕僕儑儞偲屳姺惈傪曐偮偨傔
	if (m_pSkin->GetImageList(IMAGELIST_BUTTON))
		m_nBtnMax = BTN_MAX;
	else
		m_nBtnMax = BTN_MAX - 1;

	m_nTitlePos = 0;
	m_nTitleLen = 0;
	m_nStreamTitlePos = 0;
	m_nStreamTitleLen = 0;

	// 儃儕儏乕儉僗儔僀僟乕偑桳岠偐柍岠偐
	if (m_pSkin->GetImageList(IMAGELIST_VOLSLIDER) && m_pSkin->GetImageList(IMAGELIST_VOLTRACK)) {
		m_nVolumeSliderLeft = VOLSLIDER_LEFT;
		m_nVolumeSliderTop = VOLSLIDER_TOP;
		m_nVolumeSliderWidth = VOLSLIDER_WIDTH;
		m_nVolumeSliderHeight = VOLSLIDER_HEIGHT;
	}
	else {
		m_nVolumeSliderLeft = 0;
		m_nVolumeSliderTop = 0;
		m_nVolumeSliderWidth = 0;
		m_nVolumeSliderHeight = 0;
	}

	return TRUE;
}

void CMainWnd::DeleteImages()
{
	m_pSkin->Unload();
	if (m_hBakDC) {
		DeleteDC(m_hBakDC);
		m_hBakDC = NULL;
	}
	if (m_hBakBmp) {
		DeleteObject(m_hBakBmp);
		m_hBakBmp = NULL;
	}
	if (m_hMemDC) {
		DeleteDC(m_hMemDC);
		m_hMemDC = NULL;
	}
	if (m_hMemBmp) {
		DeleteObject(m_hMemBmp);
		m_hMemBmp = NULL;
	}
	if (m_hFnt) {
		DeleteObject(m_hFnt);
		m_hFnt = NULL;
	}
	m_hFntTitle = NULL;
}

void CMainWnd::DrawBackground(HDC hDC)
{
	// 攚宨傪昤夋
	if (GetDeviceCaps(hDC, BITSPIXEL) < 16 ||
		!m_pSkin->GetBkImage()) {
		RECT rc;
		GetClientRect(m_hWnd, &rc);
		FillRect(hDC, &rc, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
	}
	else {
		HDC hMemDC = CreateCompatibleDC(hDC);
		SelectObject(hMemDC, m_pSkin->GetBkImage());
		BitBlt(hDC, 0, 0, m_nClientWidth, m_nClientHeight, hMemDC, 0, 0, SRCCOPY);
		DeleteDC(hMemDC);
	}

	// 僨傿僗僾儗僀傪昤夋
	if (m_pSkin->IsDispVisible())
		DrawDispEdge(hDC);
}

void CMainWnd::DrawDispEdge(HDC hDC)
{
	RECT rc = {DISP_LEFT, DISP_TOP,
		DISP_LEFT + m_nDispWidth, DISP_TOP + m_nDispHeight};

	HBRUSH hbr = CreateSolidBrush(m_pSkin->GetColor(COLOR_DISP));
	FillRect(hDC, &rc, hbr);
	DrawEdge(hDC, &rc, BDR_SUNKENINNER, BF_BOTTOMRIGHT | BF_TOPLEFT);
	DeleteObject(hbr);
}

void CMainWnd::DrawButton(HDC hDC, int nIndex)
{
	if (nIndex < 0 || nIndex >= m_nBtnMax)
		return;

	int x = BTN_LEFT + BTN_WIDTH * nIndex;
	int y = m_nBtnTop;

	if (m_pSkin->GetImageList(IMAGELIST_BUTTON)) {
		// 屆偄僶乕僕儑儞偺儃僞儞昤夋
		if (m_fPressed && m_nPressed == nIndex) {
			// 儃僞儞偑墴偝傟偰偄傞応崌
			RECT rc = {x, y, x + BTN_WIDTH, y + BTN_HEIGHT};
			DrawEdge(hDC, &rc, BDR_SUNKENINNER, BF_BOTTOMRIGHT | BF_TOPLEFT);

			// 傾僀僐儞傪昤夋
			ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_BUTTON), nIndex, hDC, 
				x + ((BTN_WIDTH - 16) / 2) + 1, y + ((BTN_HEIGHT - 16) / 2) + 1, ILD_TRANSPARENT);
		}
		else {
			ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_BUTTON), nIndex, hDC, 
				x + ((BTN_WIDTH - 16) / 2), y + ((BTN_HEIGHT - 16) / 2), ILD_TRANSPARENT);
		}
	}
	else {
		// 怴偟偄僶乕僕儑儞偺儃僞儞昤夋
		if (m_fPressed && m_nPressed == nIndex) {
			// 儃僞儞偑墴偝傟偰偄傞応崌
			ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_BUTTON_PUSH), nIndex, hDC, 
				x, y , ILD_TRANSPARENT);
		}
		else {
			ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_BUTTON_NORMAL), nIndex, hDC, 
				x, y , ILD_TRANSPARENT);
		}
	}
}

void CMainWnd::DrawTrack(HDC hDC)
{
	int n = (m_nCurrent == -1) ? 0 : m_nCurrent + 1;
	n = n % 100;
	ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_NUMBER), n / 10, hDC, TRACK_LEFT, TRACK_TOP, ILD_TRANSPARENT);
	ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_NUMBER), n % 10, hDC, TRACK_LEFT + 10, TRACK_TOP, ILD_TRANSPARENT);
}

int CMainWnd::GetDrawTime()
{
	int nSec;
	
	FILEINFO* pInfo = (FILEINFO*)m_pListFile->GetAt(m_nCurrent);
	if (MAP_GetStatus(m_hMap) == MAP_STATUS_STOP)
		nSec = MAP_GetDuration(m_hMap) / 1000;
	else if (IsURL(pInfo->szPath))
		nSec = MAP_GetCurrent(m_hMap) / 1000;
	else if (m_pOptions->m_fTimeReverse)
		nSec = max((MAP_GetDuration(m_hMap) - MAP_GetCurrent(m_hMap)) / 1000, 0);
	else
		nSec = MAP_GetCurrent(m_hMap) / 1000;

	if (nSec >= 100 * 60)
		nSec %= (100 * 60);
	if (nSec < 0)
		nSec = 0;

	return nSec;
}

void CMainWnd::DrawTime(HDC hDC)
{
	int nSec = GetDrawTime();
	m_nLastDrawTime = nSec;

	// Minutes
	int n = nSec / 60;
	ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_NUMBER), n / 10, hDC, TIME_LEFT, TIME_TOP, ILD_TRANSPARENT);
	ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_NUMBER), n % 10, hDC, TIME_LEFT + 10, TIME_TOP, ILD_TRANSPARENT);

	// Separator
	ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_NUMBER), 10, hDC, TIME_LEFT + 20, TIME_TOP, ILD_TRANSPARENT);

	// Seconds
	n = nSec % 60;
	ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_NUMBER), n / 10, hDC, TIME_LEFT + 24, TIME_TOP, ILD_TRANSPARENT);
	ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_NUMBER), n % 10, hDC, TIME_LEFT + 34, TIME_TOP, ILD_TRANSPARENT);
}

void CMainWnd::DrawSeek(HDC hDC)
{
	int nDur = MAP_GetDuration(m_hMap);
	int nCur = MAP_GetCurrent(m_hMap);
	m_nLastDrawSeek = nCur;
	if (!nDur)
		return;

	if (nCur) {
		nCur = min((nCur * m_nSeekWidth) / nDur, m_nSeekWidth);
		RECT rc = {SEEK_LEFT, m_nSeekTop, SEEK_LEFT + nCur, m_nSeekTop + SEEK_HEIGHT};
		HBRUSH hbr = CreateSolidBrush(m_pSkin->GetColor(COLOR_SEEK));
		FillRect(hDC, &rc, hbr);
		DeleteObject(hbr);
	}
}

void CMainWnd::DrawInfo(HDC hDC)
{
	FILEINFO* pInfo = GetInfo(m_nCurrent);
	if (pInfo && pInfo->info.nSamplingRate && pInfo->info.nChannels) {
		TCHAR szInfo[128];
		RECT rc = {INFO_LEFT, INFO_TOP, INFO_LEFT + INFO_WIDTH,
					INFO_TOP + INFO_HEIGHT};

		wsprintf(szInfo, CTempStr(IDS_FMT_DISP_INFO), pInfo->info.nBitRate,

⌨️ 快捷键说明

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