📄 medialibrarydlg.cpp
字号:
TreeView_DeleteItem(m_hTree, hCurChild);
}
hPreChild = TreeView_GetChild(m_hTree, m_hAutoPlaylistwNode);
while(hPreChild != NULL)
{
hCurChild = hPreChild;
hPreChild = TreeView_GetNextSibling(m_hTree, hPreChild);
TreeView_DeleteItem(m_hTree, hCurChild);
}
// Fill playlist node
long i(0), lCount(0);
CComPtr<IWMPPlaylist> spPlaylist;
CComPtr<IWMPPlaylistArray> spPlaylistArray;
CComBSTR bstrName, bstrAttr, bstrType;
BOOL bIsAutoPlaylist;
HRESULT hr = E_POINTER;
USES_CONVERSION;
bstrAttr = _T("PlaylistType");
// Get all playlists
if(m_spPC.p != NULL)
{
hr = m_spPC->getAll(&spPlaylistArray);
}
if(SUCCEEDED(hr) && (spPlaylistArray.p != NULL))
{
hr = spPlaylistArray->get_count(&lCount);
}
if(SUCCEEDED(hr))
{
// Enumerate the playlist
for(i = 0 ; i < lCount; i++)
{
hr = spPlaylistArray->item(i, &spPlaylist);
if(SUCCEEDED(hr) && (spPlaylist.p != NULL))
{
bIsAutoPlaylist = FALSE;
// Use PlaylistType attribute to tell whether it's a static playlist or auto playlist
hr = spPlaylist->getItemInfo(bstrAttr, &bstrType);
if(SUCCEEDED(hr) && (bstrType.m_str != NULL))
{
bIsAutoPlaylist = !_tcsicmp(OLE2T(bstrType), _T("auto"));
bstrType.Empty();
}
hr = spPlaylist->get_name(&bstrName);
if(SUCCEEDED(hr) && (bstrName.m_str != NULL))
{
AddNode(OLE2T(bstrName), bIsAutoPlaylist? TREE_AUTOPLAYLISTITEM: TREE_MYPLAYLISTITEM, bIsAutoPlaylist? m_hAutoPlaylistwNode: m_hMyPlaylistsNode);
bstrName.Empty();
}
spPlaylist = NULL;
}
}
}
return hr;
}
/***********************************************************************
* ShowOthers
*
* This function shows all other items in media list
***********************************************************************/
HRESULT CMediaLibraryDlg::ShowOthers()
{
HRESULT hr = E_POINTER;
CComPtr<IWMPPlaylist> spPlaylist;
if(m_spMC.p != NULL)
{
hr = m_spMC->getByAttribute(CComBSTR(_T("MediaType")), CComBSTR(_T("Other")), &spPlaylist);
}
if(SUCCEEDED(hr) && (spPlaylist.p != NULL))
{
hr = ShowPlaylist(spPlaylist);
}
return hr;
}
/***********************************************************************
* ShowStringCollection
* hParent: handler to the parent node
* enumNode: the type of the node. it will be used for param of the node
* szAttr: attribute name
* szMediaType: media type
*
* This function retrieves string collection for the given attribute
* and the media type, then build the sub-tree under the parent node
***********************************************************************/
HRESULT CMediaLibraryDlg::ShowStringCollection(HTREEITEM hParent, NODENAME enumNode, TCHAR *szAttr, TCHAR *szMediaType)
{
HRESULT hr = E_POINTER;
CComPtr<IWMPStringCollection> spStrColl;
CComBSTR bstrName;
long i, lCount;
USES_CONVERSION;
// Retrieve string collection
if(m_spMC.p != NULL)
{
hr = m_spMC->getAttributeStringCollection(CComBSTR(szAttr), CComBSTR(szMediaType), &spStrColl);
}
lCount = 0;
if(SUCCEEDED(hr) && (spStrColl.p != NULL))
{
hr = spStrColl->get_count(&lCount);
}
if(SUCCEEDED(hr))
{
for(i = 0; i < lCount; i++)
{
hr = spStrColl->item(i, &bstrName);
if(SUCCEEDED(hr) && (bstrName.m_str != NULL))
{
// Add a node for the attribute value
if(bstrName.Length() != 0)
{
AddNode(OLE2T(bstrName), enumNode, hParent);
}
else
{
// Those items with blank attribute are treated as "unknown"
AddNode(_T("Unknown"), (NODENAME)(enumNode + 1), hParent);
}
bstrName.Empty();
}
}
}
return hr;
}
/***********************************************************************
* OnSelectMedia
*
* This function is called when a user selects an item in the media list
* It then shows metadata in the metadata list
***********************************************************************/
LRESULT CMediaLibraryDlg::OnSelectMedia(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
int iIndex;
long lCount, i;
CComPtr<IWMPMedia> spMedia;
HRESULT hr;
TCHAR szEntry[2 * MAX_BSTR_LONG + 3];
CComBSTR bstrName, bstrVal;
iIndex = ::SendMessage(m_hList, LB_GETCURSEL, 0, 0);
// Only when it is showing a playlist, then the selected item is a media item
if((iIndex >= 0) && (m_spSavedPlaylist.p != NULL))
{
USES_CONVERSION;
// Reset metadata list
::SendMessage(m_hMetadata, LB_RESETCONTENT, 0, 0);
// List metadata
hr = m_spSavedPlaylist->get_item(iIndex, &spMedia);
lCount = 0;
if(SUCCEEDED(hr) && (spMedia.p))
{
hr = spMedia->get_attributeCount(&lCount);
}
if(SUCCEEDED(hr))
{
for(i = 0; i < lCount; i++)
{
// Use getAttributeName and getItemInfo pair to list metadata
hr = spMedia->getAttributeName(i, &bstrName);
if(SUCCEEDED(hr) && (bstrName.m_str != NULL))
{
hr = spMedia->getItemInfo(bstrName, &bstrVal);
}
if(SUCCEEDED(hr) && (bstrName.m_str != NULL) && (bstrVal.m_str != NULL))
{
_stprintf(szEntry, _T("%s: %s"), OLE2T(bstrName), OLE2T(bstrVal));
::SendMessage(m_hMetadata, LB_ADDSTRING, 0, (LPARAM)szEntry);
bstrName.Empty();
bstrVal.Empty();
}
}
}
}
return 0;
}
/***********************************************************************
* OnDbClickMediaList
*
* This function is called when a user double click an item in the media list
* It then plays the item
***********************************************************************/
LRESULT CMediaLibraryDlg::OnDbClickMediaList(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// Retrieve the selected index
int iIndex;
iIndex = ::SendMessage(m_hList, LB_GETCURSEL, 0, 0);
// If double clicking on blank area, just return
if(iIndex == LB_ERR)
{
return 0;
}
HRESULT hr = E_FAIL;
CComPtr<IWMPMedia> spMedia;
// Only when it is showing a playlist, then the selected item is a media item
if((iIndex >= 0) && (m_spSavedPlaylist.p != NULL))
{
hr = m_spSavedPlaylist->get_item(iIndex, &spMedia);
}
if(SUCCEEDED(hr) && (spMedia.p != NULL))
{
hr = m_spPlayer->put_currentMedia(spMedia);
}
return 0;
}
/***********************************************************************
* ShowChildNodes
* hParent: the parent node user clicks on
*
* This function is called when a user clicks to show playlists/stringCollections
***********************************************************************/
void CMediaLibraryDlg::ShowChildNodes(HTREEITEM hParent)
{
HTREEITEM hChild;
TCHAR szPlaylistName[MAX_BSTR_LONG + 1];
TVITEM tvi;
int iChildCount = 0;
tvi.mask = TVIF_TEXT;
tvi.pszText = szPlaylistName;
tvi.cchTextMax = MAX_BSTR_LONG;
::SendMessage(m_hList, LB_RESETCONTENT, 0, 0);
// Enumerate the child nodes and list them in media list
hChild = TreeView_GetChild(m_hTree, hParent);
while(hChild != NULL)
{
iChildCount++;
tvi.hItem = hChild;
if(TreeView_GetItem(m_hTree, &tvi))
{
::SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)szPlaylistName);
}
hChild = TreeView_GetNextSibling(m_hTree, hChild);
};
// Release m_spSavedPlaylist
m_spSavedPlaylist = NULL;
// Reset metadata list
::SendMessage(m_hMetadata, LB_RESETCONTENT, 0, 0);
TCHAR szLine[20];
_stprintf(szLine, _T("%d items"), iChildCount);
SetDlgItemText(IDC_STATUS, szLine);
}
/***********************************************************************
* TellMediaType
*
* This function is used to convert media type string to enum
***********************************************************************/
MEDIATYPE TellMediaType(TCHAR *szMediaType)
{
MEDIATYPE iRetCode = INVALID;
if(szMediaType == NULL)
{
iRetCode = INVALID;
}
else
{
if(!_tcsicmp(szMediaType, _T("audio")))
{
iRetCode = MUSIC;
}
else if(!_tcsicmp(szMediaType, _T("video")))
{
iRetCode = VIDEO;
}
else if(!_tcsicmp(szMediaType, _T("")))
{
iRetCode = OTHER;
}
else if(!_tcsicmp(szMediaType, _T("playlist")))
{
iRetCode = PLAYLIST;
}
else
{
iRetCode = INVALID;
}
}
return iRetCode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -