📄 mainwnd.cpp
字号:
pInfo->info.nSamplingRate / 1000, pInfo->info.nChannels == 1 ? _T("MONO") : _T("STEREO"));
COLORREF crBk = SetTextColor(hDC, m_pSkin->GetColor(COLOR_INFO));
int nOld = SetBkMode(hDC, TRANSPARENT);
HFONT hBk = (HFONT)SelectObject(hDC, m_hFnt);
DrawText(hDC, szInfo, -1, &rc, DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOPREFIX);
SetTextColor(hDC, crBk);
SetBkMode(hDC, nOld);
SelectObject(hDC, hBk);
}
}
void CMainWnd::DrawPlayOption(HDC hDC)
{
if (m_pOptions->m_fRepeat == COptions::RepeatAll) {
ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_PLAYOPT), 0, hDC, PLAYOPT_LEFT, PLAYOPT_TOP, ILD_TRANSPARENT);
}
else if (m_pOptions->m_fRepeat == COptions::RepeatOne) {
int nIndex = (ImageList_GetImageCount(m_pSkin->GetImageList(IMAGELIST_PLAYOPT)) > 2) ? 2 : 0;
ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_PLAYOPT), nIndex, hDC, PLAYOPT_LEFT, PLAYOPT_TOP, ILD_TRANSPARENT);
}
if (m_pOptions->m_fShuffle) {
ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_PLAYOPT), 1, hDC, PLAYOPT_LEFT, PLAYOPT_TOP + 8, ILD_TRANSPARENT);
}
}
void CMainWnd::DrawStatus(HDC hDC)
{
RECT rc = {STATUS_LEFT, m_nStatusTop,
STATUS_LEFT + STATUS_WIDTH, m_nStatusTop + m_nStatusHeight};
int nIndex;
MAP_STATUS status = MAP_GetStatus(m_hMap);
switch (status) {
case MAP_STATUS_PLAY: nIndex = 1; break;
case MAP_STATUS_PAUSE: nIndex = 2; break;
case MAP_STATUS_WAIT: nIndex = 3; break;
default: nIndex = 0;
}
#ifdef _WIN32_WCE_PPC
ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_STATUS), nIndex, hDC, STATUS_LEFT,
m_nStatusTop + (m_nStatusHeight - STATUS_WIDTH) - 2, ILD_TRANSPARENT);
#else
ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_STATUS), nIndex, hDC, STATUS_LEFT,
m_nStatusTop, ILD_TRANSPARENT);
#endif
}
void CMainWnd::DrawTitle(HDC hDC)
{
if (m_fDrawVolume) {
DrawVolume(hDC);
return;
}
TCHAR szTitle[MAX_PATH] = {0};
GetTitle(m_nCurrent, szTitle);
SIZE size;
HFONT hBk = (HFONT)SelectObject(hDC, m_hFntTitle);
GetTextExtentPoint32(hDC, szTitle, _tcslen(szTitle), &size);
if (size.cx != m_nTitleLen - SCROLL_TITLE_MARGIN) {
KillTimer(m_hWnd, ID_TIMER_SCROLLTITLE);
m_nTitlePos = 0;
m_nTitleWait = 0;
m_nTitleLen = size.cx + SCROLL_TITLE_MARGIN;
if (m_nTitleLen - SCROLL_TITLE_MARGIN > m_nTitleWidth)
SetTimer(m_hWnd, ID_TIMER_SCROLLTITLE, TIMER_SCROLLTITLE_INTERVAL, NULL);
}
while (m_nTitlePos >= m_nTitleLen)
m_nTitlePos = m_nTitlePos - m_nTitleLen;
if (!m_pOptions->m_fScrollTitle || m_nTitlePos == 0 || m_nTitleLen - SCROLL_TITLE_MARGIN < m_nTitleWidth) {
// 僗僋儘乕儖側偟
RECT rc = {TITLE_LEFT, m_nTitleTop,
TITLE_LEFT + m_nTitleWidth, m_nTitleTop + m_nTitleHeight};
COLORREF crBk = SetTextColor(hDC, m_pSkin->GetColor(COLOR_TITLE));
int nOld = SetBkMode(hDC, TRANSPARENT);
DrawText(hDC, szTitle, -1, &rc, DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOPREFIX);
SetTextColor(hDC, crBk);
SetBkMode(hDC, nOld);
}
else {
// 僗僋儘乕儖偁傝
RECT rc = {0, 0, m_nTitleLen, m_nTitleHeight};
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hDC, m_nTitleLen, m_nTitleHeight);
SelectObject(hMemDC, hBmp);
if (m_nTitleLen - m_nTitlePos < m_nTitleWidth) {
BitBlt(hMemDC, m_nTitlePos, 0, m_nTitleLen - m_nTitlePos,
m_nTitleHeight, hDC, TITLE_LEFT, m_nTitleTop, SRCCOPY);
BitBlt(hMemDC, 0, 0,
m_nTitleWidth - (m_nTitleLen - m_nTitlePos),
m_nTitleHeight, hDC, TITLE_LEFT + (m_nTitleLen - m_nTitlePos), m_nTitleTop, SRCCOPY);
}
else {
BitBlt(hMemDC, m_nTitlePos, 0, m_nTitleWidth,
m_nTitleHeight, hDC, TITLE_LEFT, m_nTitleTop, SRCCOPY);
}
COLORREF crBk = SetTextColor(hMemDC, m_pSkin->GetColor(COLOR_TITLE));
int nOld = SetBkMode(hMemDC, TRANSPARENT);
HFONT hFnt = (HFONT)SelectObject(hMemDC, m_hFntTitle);
DrawText(hMemDC, szTitle, -1, &rc, DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOPREFIX);
SetTextColor(hMemDC, crBk);
SetBkMode(hMemDC, nOld);
SelectObject(hMemDC, hFnt);
if (m_nTitleLen - m_nTitlePos < m_nTitleWidth) {
BitBlt(hDC, TITLE_LEFT, m_nTitleTop, m_nTitleLen - m_nTitlePos,
m_nTitleHeight, hMemDC, m_nTitlePos, 0, SRCCOPY);
BitBlt(hDC, TITLE_LEFT + (m_nTitleLen - m_nTitlePos), m_nTitleTop,
m_nTitleWidth - (m_nTitleLen - m_nTitlePos), m_nTitleHeight, hMemDC, 0, 0, SRCCOPY);
}
else {
BitBlt(hDC, TITLE_LEFT, m_nTitleTop, m_nTitleWidth,
m_nTitleHeight, hMemDC, m_nTitlePos, 0, SRCCOPY);
}
DeleteDC(hMemDC);
DeleteObject(hBmp);
}
SelectObject(hDC, hBk);
}
void CMainWnd::DrawVolume(HDC hDC)
{
SIZE size;
TCHAR szTitle[MAX_PATH] = {0};
RECT rc = {TITLE_LEFT, m_nTitleTop,
TITLE_LEFT + m_nTitleWidth, m_nTitleTop + m_nTitleHeight};
DWORD dwVolume;
waveOutGetVolume(NULL, &dwVolume);
dwVolume = max(LOWORD(dwVolume), HIWORD(dwVolume));
dwVolume = dwVolume * 100 / 0xFFFF;
wsprintf(szTitle, CTempStr(IDS_FMT_DISP_VOLUME), dwVolume);
COLORREF crBk = SetTextColor(hDC, m_pSkin->GetColor(COLOR_TITLE));
int nOld = SetBkMode(hDC, TRANSPARENT);
HFONT hBk = (HFONT)SelectObject(hDC, m_hFntTitle);
GetTextExtentPoint32(hDC, szTitle, _tcslen(szTitle), &size);
DrawText(hDC, szTitle, -1, &rc, DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOPREFIX);
SetTextColor(hDC, crBk);
SetBkMode(hDC, nOld);
SelectObject(hDC, hBk);
#ifdef _WIN32_WCE_PPC
#define VOLBAR_LEFT 80
#define VOLBAR_WIDTH 125
#define VOLBAR_HEIGHT 8
#else
#define VOLBAR_LEFT 50
#define VOLBAR_WIDTH 145
#define VOLBAR_HEIGHT 8
#endif
if (!dwVolume)
return;
int nWidth = VOLBAR_WIDTH * dwVolume / 100;
RECT rcBar = {TITLE_LEFT + VOLBAR_LEFT, m_nTitleTop + m_nTitleHeight - size.cy + 1,
TITLE_LEFT + VOLBAR_LEFT + nWidth, m_nTitleTop + m_nTitleHeight};
HBRUSH hbr = CreateSolidBrush(m_pSkin->GetColor(COLOR_TITLE));
FillRect(hDC, &rcBar, hbr);
DeleteObject(hbr);
}
void CMainWnd::DrawPeek(HDC hDC)
{
if (m_pOptions->m_fDrawPeek) {
int n = min(PEEK_WIDTH * m_nPeek[0] / 100, PEEK_WIDTH);
RECT rcLeft = {PEEK_LEFT, PEEK_TOP, PEEK_LEFT + n, PEEK_TOP + 2};
HBRUSH hbr = CreateSolidBrush(m_pSkin->GetColor(COLOR_PEEKL));
FillRect(hDC, &rcLeft, hbr);
DeleteObject(hbr);
n = min(PEEK_WIDTH * m_nPeek[1] / 100, PEEK_WIDTH);
RECT rcRight = {PEEK_LEFT, PEEK_TOP + 3, PEEK_LEFT + n, PEEK_TOP + 5};
hbr = CreateSolidBrush(m_pSkin->GetColor(COLOR_PEEKR));
FillRect(hDC, &rcRight, hbr);
DeleteObject(hbr);
}
}
void CMainWnd::DrawStreamTitle(HDC hDC)
{
TCHAR szTitle[MAX_URL] = {0};
GetStreamTitle(szTitle);
SIZE size;
HFONT hBk = (HFONT)SelectObject(hDC, m_hFntTitle);
GetTextExtentPoint32(hDC, szTitle, _tcslen(szTitle), &size);
if (size.cx != m_nStreamTitleLen - SCROLL_TITLE_MARGIN) {
KillTimer(m_hWnd, ID_TIMER_SCROLLSTREAM);
m_nStreamTitlePos = 0;
m_nStreamTitleWait = 0;
m_nStreamTitleLen = size.cx + SCROLL_TITLE_MARGIN;
if (m_nStreamTitleLen - SCROLL_TITLE_MARGIN > m_nStreamTitleWidth)
SetTimer(m_hWnd, ID_TIMER_SCROLLSTREAM, TIMER_SCROLLSTREAM_INTERVAL, NULL);
}
while (m_nStreamTitlePos >= m_nStreamTitleLen)
m_nStreamTitlePos = m_nStreamTitlePos - m_nStreamTitleLen;
if (!m_pOptions->m_fScrollTitle || m_nStreamTitlePos == 0 ||
m_nStreamTitleLen - SCROLL_TITLE_MARGIN < m_nStreamTitleWidth) {
// 僗僋儘乕儖側偟
RECT rc = {STREAM_TITLE_LEFT, m_nStreamTitleTop,
STREAM_TITLE_LEFT + m_nStreamTitleWidth, m_nStreamTitleTop + m_nStreamTitleHeight};
COLORREF crBk = SetTextColor(hDC, m_pSkin->GetColor(COLOR_TITLE));
int nOld = SetBkMode(hDC, TRANSPARENT);
DrawText(hDC, szTitle, -1, &rc, DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOPREFIX);
SetTextColor(hDC, crBk);
SetBkMode(hDC, nOld);
}
else {
// 僗僋儘乕儖偁傝
RECT rc = {0, 0, m_nStreamTitleLen, m_nStreamTitleHeight};
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hDC, m_nStreamTitleLen, m_nStreamTitleHeight);
SelectObject(hMemDC, hBmp);
if (m_nStreamTitleLen - m_nStreamTitlePos < m_nStreamTitleWidth) {
BitBlt(hMemDC, m_nStreamTitlePos, 0, m_nStreamTitleLen - m_nStreamTitlePos,
m_nStreamTitleHeight, hDC, STREAM_TITLE_LEFT, m_nStreamTitleTop, SRCCOPY);
BitBlt(hMemDC, 0, 0,
m_nStreamTitleWidth - (m_nStreamTitleLen - m_nStreamTitlePos),
m_nStreamTitleHeight, hDC, STREAM_TITLE_LEFT + (m_nStreamTitleLen - m_nStreamTitlePos), m_nStreamTitleTop, SRCCOPY);
}
else {
BitBlt(hMemDC, m_nStreamTitlePos, 0, m_nStreamTitleWidth,
m_nStreamTitleHeight, hDC, STREAM_TITLE_LEFT, m_nStreamTitleTop, SRCCOPY);
}
COLORREF crBk = SetTextColor(hMemDC, m_pSkin->GetColor(COLOR_TITLE));
int nOld = SetBkMode(hMemDC, TRANSPARENT);
HFONT hFnt = (HFONT)SelectObject(hMemDC, m_hFntTitle);
DrawText(hMemDC, szTitle, -1, &rc, DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOPREFIX);
SetTextColor(hMemDC, crBk);
SetBkMode(hMemDC, nOld);
SelectObject(hMemDC, hFnt);
if (m_nStreamTitleLen - m_nStreamTitlePos < m_nStreamTitleWidth) {
BitBlt(hDC, STREAM_TITLE_LEFT, m_nStreamTitleTop, m_nStreamTitleLen - m_nStreamTitlePos,
m_nStreamTitleHeight, hMemDC, m_nStreamTitlePos, 0, SRCCOPY);
BitBlt(hDC, STREAM_TITLE_LEFT + (m_nStreamTitleLen - m_nStreamTitlePos), m_nStreamTitleTop,
m_nStreamTitleWidth - (m_nStreamTitleLen - m_nStreamTitlePos), m_nStreamTitleHeight, hMemDC, 0, 0, SRCCOPY);
}
else {
BitBlt(hDC, STREAM_TITLE_LEFT, m_nStreamTitleTop, m_nStreamTitleWidth,
m_nStreamTitleHeight, hMemDC, m_nStreamTitlePos, 0, SRCCOPY);
}
DeleteDC(hMemDC);
DeleteObject(hBmp);
}
SelectObject(hDC, hBk);
}
void CMainWnd::DrawVolumeSlider(HDC hDC)
{
ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_VOLSLIDER), 0, hDC,
m_nVolumeSliderLeft, m_nVolumeSliderTop, ILD_TRANSPARENT);
DWORD dwVolume;
waveOutGetVolume(NULL, &dwVolume);
dwVolume = max(LOWORD(dwVolume), HIWORD(dwVolume));
dwVolume = dwVolume * 100 / 0xFFFF;
double dLeft = (double)(m_nVolumeSliderWidth - m_nVolumeTrackWidth) / 100 * dwVolume;
ImageList_Draw(m_pSkin->GetImageList(IMAGELIST_VOLTRACK), 0, hDC,
m_nVolumeSliderLeft + (int)dLeft, m_nVolumeSliderTop, ILD_TRANSPARENT);
waveOutGetVolume(NULL, &m_dwCurrentVolume);
}
void CMainWnd::UpdateDisp()
{
RECT rc = {DISP_LEFT, DISP_TOP,
DISP_LEFT + m_nDispWidth, DISP_TOP + m_nDispHeight};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdateTrack()
{
RECT rc = {TRACK_LEFT, TRACK_TOP,
TRACK_LEFT + TRACK_WIDTH, TRACK_TOP + TRACK_HEIGHT};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdateTime()
{
RECT rc;
BOOL fUpdate = FALSE;
int nSec = GetDrawTime();
if (m_nLastDrawTime != nSec) {
SetRect(&rc, TIME_LEFT, TIME_TOP,
TIME_LEFT + TIME_WIDTH, TIME_TOP + TIME_HEIGHT);
InvalidateRect(m_hWnd, &rc, TRUE);
fUpdate = TRUE;
}
FILEINFO* pInfo = GetInfo(GetCurrentFile());
if (!pInfo || !IsURL(pInfo->szPath)) {
if (m_nLastDrawSeek != MAP_GetCurrent(m_hMap)) {
SetRect(&rc, SEEK_LEFT, m_nSeekTop,
SEEK_LEFT + m_nSeekWidth, m_nSeekTop + SEEK_HEIGHT);
InvalidateRect(m_hWnd, &rc, TRUE);
fUpdate = TRUE;
}
}
if (fUpdate)
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdateInfo()
{
RECT rc = {INFO_LEFT, INFO_TOP,
INFO_LEFT + INFO_WIDTH, INFO_TOP + INFO_HEIGHT};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdatePlayOption()
{
RECT rc = {PLAYOPT_LEFT, PLAYOPT_TOP,
PLAYOPT_LEFT + PLAYOPT_WIDTH, PLAYOPT_TOP + PLAYOPT_HEIGHT};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdateStatus()
{
RECT rc = {STATUS_LEFT, m_nStatusTop,
STATUS_LEFT + STATUS_WIDTH, m_nStatusTop + m_nStatusHeight};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdateTitle()
{
RECT rc = {TITLE_LEFT, m_nTitleTop,
TITLE_LEFT + m_nTitleWidth, m_nTitleTop + m_nTitleHeight};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdatePeek()
{
RECT rc = {PEEK_LEFT, PEEK_TOP,
PEEK_LEFT + PEEK_WIDTH, PEEK_TOP + PEEK_HEIGHT};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdateStreamTitle()
{
FILEINFO* pInfo = GetInfo(GetCurrentFile());
if (!pInfo || !IsURL(pInfo->szPath))
return;
RECT rc = {STREAM_TITLE_LEFT, m_nStreamTitleTop,
STREAM_TITLE_LEFT + m_nStreamTitleWidth, m_nStreamTitleTop + m_nStreamTitleHeight};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
void CMainWnd::UpdateVolumeSlider()
{
RECT rc = {m_nVolumeSliderLeft, m_nVolumeSliderTop,
m_nVolumeSliderLeft + m_nVolumeSliderWidth, m_nVolumeSliderTop + m_nVolumeSliderHeight};
InvalidateRect(m_hWnd, &rc, TRUE);
UpdateWindow(m_hWnd);
}
// 曐懚娭學
void CMainWnd::Save()
{
RECT rc;
GetWindowRect(m_hWnd, &rc);
m_pOptions->m_ptInitWnd.x = rc.left;
m_pOptions->m_ptInitWnd.y = rc.top;
m_pOptions->Save(m_hMap);
}
void CMainWnd::Load()
{
m_pOptions->Load(m_hMap);
}
void CMainWnd::GetDefPlayListPath(LPTSTR pszFile)
{
GetModuleFileName(GetInst(), pszFile, MAX_PATH);
LPTSTR p = _tcsrchr(pszFile, _T('.'));
if (p) {
*(p + 1) = NULL;
_tcscat(pszFile, M3U_FILE_EXT);
}
}
BOOL CMainWnd::IsExisting(LPTSTR pszFile)
{
if (m_pOptions->m_fAddExisting)
return FALSE;
TCHAR szFile1[MAX_PATH];
_tcscpy(szFile1, pszFile);
_tcslwr(szFile1);
for (int i = 0; i < m_pListFile->GetCount(); i++) {
TCHAR szFile2[MAX_PATH];
FILEINFO* p = (FILEINFO*)m_pListFile->GetAt(i);
if (p) {
_tcscpy(szFile2, p->szPath);
_tcslwr(szFile2);
if (_tcscmp(szFile1, szFile2) == 0)
return TRUE;
}
}
return FALSE;
}
void CMainWnd::RegisterTrayIcon(BOOL fRegist)
{
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 1;
if (fRegist) {
if (!m_hTrayIcon) {
m_hTrayIcon = (HICON)LoadImage(GetInst(), (LPCTSTR)IDI_MAIN, IMAGE_ICON, 16, 16, 0);
nid.hIcon = m_hTrayIcon;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_TRAYNOTIFY;
_tcscpy(nid.szTip, MAINWND_TITLE);
Shell_NotifyIcon(NIM_ADD, &nid);
}
}
else {
if (m_hTrayIcon) {
Shell_NotifyIcon(NIM_DELETE, &nid);
DestroyIcon(m_hTrayIcon);
m_hTrayIcon = NULL;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -