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