📄 ppcmainwnd.cpp
字号:
uItem1 = ListView_GetItemState(hwndLV, nItem1, LVIS_FOCUSED | LVIS_SELECTED);
uItem2 = ListView_GetItemState(hwndLV, nItem2, LVIS_FOCUSED | LVIS_SELECTED);
ListView_SetItemText(hwndLV, nItem1, 0, szTitle2);
ListView_SetItemText(hwndLV, nItem2, 0, szTitle1);
ListView_SetItemState(hwndLV, nItem1, uItem2, LVIS_FOCUSED | LVIS_SELECTED);
ListView_SetItemState(hwndLV, nItem2, uItem1, LVIS_FOCUSED | LVIS_SELECTED);
}
BOOL CPpcMainWnd::UpFile(int nIndex)
{
if (nIndex <= 0)
return FALSE;
FILEINFO* p1 = (FILEINFO*)m_pListFile->GetAt(nIndex);
FILEINFO* p2 = (FILEINFO*)m_pListFile->GetAt(nIndex - 1);
if (!p1 || !p2)
return FALSE;
m_pListFile->SetAt(nIndex - 1, (DWORD)p1);
m_pListFile->SetAt(nIndex, (DWORD)p2);
ExchangeItem(m_hwndLV, nIndex - 1, nIndex);
if (m_nCurrent == nIndex)
m_nCurrent--;
else if (m_nCurrent == nIndex - 1)
m_nCurrent++;
UpdateTrack();
return TRUE;
}
BOOL CPpcMainWnd::DownFile(int nIndex)
{
if (nIndex >= m_pListFile->GetCount() - 1)
return FALSE;
FILEINFO* p1 = (FILEINFO*)m_pListFile->GetAt(nIndex);
FILEINFO* p2 = (FILEINFO*)m_pListFile->GetAt(nIndex + 1);
if (!p1 || !p2)
return FALSE;
m_pListFile->SetAt(nIndex + 1, (DWORD)p1);
m_pListFile->SetAt(nIndex, (DWORD)p2);
ExchangeItem(m_hwndLV, nIndex + 1, nIndex);
if (m_nCurrent == nIndex)
m_nCurrent++;
else if (m_nCurrent == nIndex + 1)
m_nCurrent--;
UpdateTrack();
return TRUE;
}
BOOL CPpcMainWnd::DeleteFile(int nIndex)
{
if (!m_pListFile->RemoveAt(nIndex))
return FALSE;
ListView_DeleteItem(m_hwndLV, nIndex);
if (!m_pListFile->GetCount()) {
Close();
m_nCurrent = OPEN_NONE;
InvalidateRect(m_hWnd, NULL, TRUE);
UpdateWindow(m_hWnd);
}
else if (m_nCurrent == nIndex) {
Stop();
UpdateTime();
UpdateStatus();
m_nCurrent = OPEN_NONE;
Open(m_pListFile->GetCount() - 1 < nIndex ? 0 : nIndex);
}
else if (m_nCurrent > nIndex) {
m_nCurrent--;
UpdateTrack();
}
return TRUE;
}
void CPpcMainWnd::DeleteAllFile()
{
Stop();
Close();
m_nCurrent = OPEN_NONE;
for (int i = 0; i < m_pListFile->GetCount(); i++) {
FILEINFO* pInfo = (FILEINFO*)m_pListFile->GetAt(i);
delete pInfo;
}
m_pListFile->RemoveAll();
ListView_DeleteAllItems(m_hwndLV);
InvalidateRect(m_hWnd, NULL, TRUE);
UpdateWindow(m_hWnd);
}
void CPpcMainWnd::SortFile(int nSort)
{
#define CURRENT_MASK 0x8000
int i, nFocus = -1;
FILEINFO* p;
TCHAR szTitle[MAX_PATH];
for (i = 0; i < m_pListFile->GetCount(); i++) {
p = (FILEINFO*)m_pListFile->GetAt(i);
p->dwUser = (i == m_nCurrent) ? CURRENT_MASK : 0;
p->dwUser |= ListView_GetItemState(m_hwndLV, i, LVIS_FOCUSED | LVIS_SELECTED);
}
m_pListFile->Sort(SortCompareProc, nSort);
for (i = 0; i < m_pListFile->GetCount(); i++) {
p = (FILEINFO*)m_pListFile->GetAt(i);
if (p->dwUser & CURRENT_MASK)
m_nCurrent = i;
GetTitle(i, szTitle);
ListView_SetItemText(m_hwndLV, i, 0, szTitle);
ListView_SetItemState(m_hwndLV, i, p->dwUser, LVIS_FOCUSED | LVIS_SELECTED);
if (p->dwUser &LVIS_FOCUSED)
nFocus = i;
}
if (nFocus != -1)
ListView_EnsureVisible(m_hwndLV, nFocus, FALSE);
UpdateTrack();
}
void CPpcMainWnd::OnFileUp()
{
if (!ListView_GetSelectedCount(m_hwndLV))
return;
int nCount = ListView_GetItemCount(m_hwndLV);
if (ListView_GetItemState(m_hwndLV, 0, LVIS_SELECTED))
return;
for (int i = 1; i < nCount; i++) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_SELECTED))
UpFile(i);
}
}
void CPpcMainWnd::OnFileDown()
{
if (!ListView_GetSelectedCount(m_hwndLV))
return;
int nCount = ListView_GetItemCount(m_hwndLV);
if (ListView_GetItemState(m_hwndLV, nCount - 1, LVIS_SELECTED))
return;
for (int i = nCount - 2; i >= 0; i--) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_SELECTED))
DownFile(i);
}
}
void CPpcMainWnd::OnFileDelete()
{
int i;
if (!ListView_GetSelectedCount(m_hwndLV))
return;
int nCount = ListView_GetItemCount(m_hwndLV);
for (i = nCount - 1; i >= 0; i--) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_SELECTED))
DeleteFile(i);
}
nCount = ListView_GetItemCount(m_hwndLV);
for (i = 0; i < nCount; i++) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_FOCUSED)) {
ListView_SetItemState(m_hwndLV, i, LVIS_SELECTED, LVIS_SELECTED);
break;
}
}
}
void CPpcMainWnd::OnFileDeleteAll()
{
m_fNoListRedraw = TRUE;
SendMessage(m_hwndLV, WM_SETREDRAW, 0, 0);
int nCount = ListView_GetItemCount(m_hwndLV);
for (int i = nCount - 1; i >= 0; i--)
DeleteFile(i);
SendMessage(m_hwndLV, WM_SETREDRAW, 1, 0);
m_fNoListRedraw = FALSE;
}
void CPpcMainWnd::OnPlaySelected()
{
OnListViewDblClk(NULL);
}
void CPpcMainWnd::OnListViewReturn(NMHDR* pnmh)
{
// 僶僢僋儔僀僩惂屼埲奜偱
// 帺摦僶僢僋儔僀僩ON惂屼偑桳岠偺偲偒
if (((CPpcOptions*)m_pOptions)->m_fDispAutoOn) {
TurnOnDisplay();
m_fDisplay = TRUE;
InvalidateRect(m_hWnd, NULL, TRUE);
UpdateWindow(m_hWnd);
}
if (!ListView_GetSelectedCount(m_hwndLV))
return;
int nCount = ListView_GetItemCount(m_hwndLV);
for (int i = 0; i < nCount; i++) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_FOCUSED)) {
Play(i);
break;
}
}
}
void CPpcMainWnd::OnListViewKeyDown(NMHDR* pnmh)
{
// 僶僢僋儔僀僩惂屼埲奜偱
// 帺摦僶僢僋儔僀僩ON惂屼偑桳岠偺偲偒
if (((CPpcOptions*)m_pOptions)->m_fDispAutoOn) {
TurnOnDisplay();
m_fDisplay = TRUE;
InvalidateRect(m_hWnd, NULL, TRUE);
UpdateWindow(m_hWnd);
}
if (((LPNMLVKEYDOWN)pnmh)->wVKey == 'Q' && (GetAsyncKeyState(VK_CONTROL) & 0x8000))
PostMessage(m_hWnd, WM_CLOSE, 0, 0);
}
void CPpcMainWnd::OnListViewDblClk(NMHDR* pnmh)
{
if (!ListView_GetSelectedCount(m_hwndLV))
return;
int nCount = ListView_GetItemCount(m_hwndLV);
for (int i = 0; i < nCount; i++) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_FOCUSED)) {
Play(i);
break;
}
}
}
void CPpcMainWnd::OnListViewBeginDrag(NMHDR* pnmh)
{
NMLISTVIEW* pnmlv = (NMLISTVIEW*)pnmh;
SetCapture(m_hWnd);
m_fListDrag = TRUE;
m_nListDragItem = pnmlv->iItem;
}
void CPpcMainWnd::OnListViewConextMenu(NMHDR* pnmh)
{
NMRGINFO* pnmri = (NMRGINFO*)pnmh;
int nCount = ListView_GetSelectedCount(m_hwndLV);
if (nCount) {
HMENU hMenu, hSub;
hMenu = LoadMenu(GetInst(), (LPCTSTR)IDR_POPUP);
if (nCount == 1)
hSub = GetSubMenu(hMenu, IDM_SUBMENU_SEL0);
else
hSub = GetSubMenu(hMenu, IDM_SUBMENU_SEL1);
TrackPopupMenu(hSub, TPM_LEFTALIGN | TPM_TOPALIGN,
pnmri->ptAction.x, pnmri->ptAction.y, 0, m_hWnd, NULL);
DestroyMenu(hMenu);
}
}
void CPpcMainWnd::OnMsgStatus(MAP_STATUS status, BOOL fError)
{
CMainWnd::OnMsgStatus(status, fError);
if (status == MAP_STATUS_PLAY) {
TCHAR szText[MAX_PATH];
TCHAR szTitle[MAX_PATH];
ListView_GetItemText(m_hwndLV, m_nCurrent, 0, szText, MAX_PATH);
GetTitle(m_nCurrent, szTitle);
if (_tcscmp(szTitle, szText) != 0)
ListView_SetItemText(m_hwndLV, m_nCurrent, 0, szTitle);
}
}
void CPpcMainWnd::DrawTitle(HDC hDC)
{
if (m_fDrawHold) {
RECT rc = {TITLE_LEFT, m_nTitleTop,
TITLE_LEFT + m_nTitleWidth, m_nTitleTop + m_nTitleHeight};
CTempStr str(m_fHold ? IDS_MSG_HOLD_ON : IDS_MSG_HOLD_OFF);
COLORREF crBk = SetTextColor(hDC, m_pSkin->GetColor(COLOR_TITLE));
int nOld = SetBkMode(hDC, TRANSPARENT);
HFONT hBk = (HFONT)SelectObject(hDC, m_hFntTitle);
DrawText(hDC, str, -1, &rc, DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOPREFIX);
SetTextColor(hDC, crBk);
SetBkMode(hDC, nOld);
SelectObject(hDC, hBk);
}
else CMainWnd::DrawTitle(hDC);
}
void CPpcMainWnd::OnPlayPlayStop()
{
if (MAP_GetStatus(m_hMap) == MAP_STATUS_STOP)
OnPlayPlayPause();
else
OnPlayStop();
}
BOOL CPpcMainWnd::Open(int nIndex)
{
m_fDrawHold = FALSE;
KillTimer(m_hWnd, ID_TIMER_HOLD);
return CMainWnd::Open(nIndex);
}
void CPpcMainWnd::OnCopyData(COPYDATASTRUCT* pcds)
{
m_fNoListRedraw = TRUE;
SendMessage(m_hwndLV, WM_SETREDRAW, 0, 0);
CMainWnd::OnCopyData(pcds);
SendMessage(m_hwndLV, WM_SETREDRAW, 1, 0);
m_fNoListRedraw = FALSE;
InvalidateRect(m_hwndLV, NULL, FALSE);
UpdateWindow(m_hwndLV);
}
void CPpcMainWnd::OnFileFind()
{
m_fNoListRedraw = TRUE;
SendMessage(m_hwndLV, WM_SETREDRAW, 0, 0);
CMainWnd::OnFileFind();
SendMessage(m_hwndLV, WM_SETREDRAW, 1, 0);
m_fNoListRedraw = FALSE;
InvalidateRect(m_hwndLV, NULL, FALSE);
UpdateWindow(m_hwndLV);
}
#define FILE_BUFF_LEN 2048
BOOL CPpcMainWnd::OpenMediaFile(BOOL fAdd, HWND hwndParent)
{
if (m_fShowOpenDlg)
return FALSE;
BOOL fRet;
m_fShowOpenDlg = TRUE;
CTempStr strTitle(fAdd ? IDS_TITLE_ADD_FILE : IDS_TITLE_OPEN_FILE);
TCHAR szFile[FILE_BUFF_LEN] = {0};
OPENFILENAME ofn;
memset(&(ofn), 0, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwndParent ? hwndParent : m_hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = FILE_BUFF_LEN;
ofn.lpstrTitle = strTitle;
BOOL (*gsGetOpenFileName)(OPENFILENAME*) = NULL;
HINSTANCE hInst = LoadLibrary(_T("gsgetfile.dll"));
if (hInst) {
(FARPROC&)gsGetOpenFileName = GetProcAddress(hInst, _T("gsGetOpenFileName"));
}
if (gsGetOpenFileName) {
if (!m_pszOpenFilter) MakeOpenFilter(&m_pszOpenFilter, TRUE);
ofn.lpstrFilter = m_pszOpenFilter;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY;
ofn.lpstrInitialDir = ((CPpcOptions*)m_pOptions)->m_szLastDir;
fRet = gsGetOpenFileName(&ofn);
}
else {
if (!m_pszOpenFilter) MakeOpenFilter(&m_pszOpenFilter, TRUE);
ofn.lpstrFilter = m_pszOpenFilter;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrInitialDir = ((CPpcOptions*)m_pOptions)->m_szLastDir;
fRet = GetOpenFileName(&ofn);
}
if (hInst) FreeLibrary(hInst);
m_fShowOpenDlg = FALSE;
if (!fRet)
return FALSE;
m_fNoListRedraw = TRUE;
SendMessage(m_hwndLV, WM_SETREDRAW, 0, 0);
// 婛懚偺儕僗僩傪嶍彍
if (!fAdd) DeleteAllFile();
// 捛壛
DWORD dw = GetFileAttributes(szFile);
if (dw != 0xFFFFFFFF) {
if (!(dw & FILE_ATTRIBUTE_DIRECTORY)) {
// single
if (IsPlayList(szFile))
LoadPlayList(szFile);
else
AddFile(szFile);
LPTSTR psz = _tcsrchr(szFile, _T('\\'));
if (psz) *psz = _T('\0');
_tcscpy(((CPpcOptions*)m_pOptions)->m_szLastDir, szFile);
}
else {
// multi
TCHAR szPath[MAX_PATH];
LPTSTR p = szFile;
_tcscpy(((CPpcOptions*)m_pOptions)->m_szLastDir, szFile);
while (TRUE) {
p += _tcslen(p);
if (*p != NULL || *(p + 1) == NULL)
break;
wsprintf(szPath, _T("%s\\%s"), ((CPpcOptions*)m_pOptions)->m_szLastDir, ++p);
if (IsPlayList(szPath))
LoadPlayList(szPath);
else
AddFile(szPath);
}
}
}
SendMessage(m_hwndLV, WM_SETREDRAW, 1, 0);
m_fNoListRedraw = FALSE;
InvalidateRect(m_hwndLV, NULL, FALSE);
UpdateWindow(m_hwndLV);
return TRUE;
}
void CPpcMainWnd::OpenFirstFile()
{
CMainWnd::OpenFirstFile();
if (m_fNoListRedraw)
SendMessage(m_hwndLV, WM_SETREDRAW, 0, 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -