⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 medialibrarydlg.cpp

📁 WINCE 下的Media Player 播放器控制源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        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 + -