📄 mainwnd.cpp
字号:
#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 + -