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

📄 listview.cpp

📁 WINCE XAUDIO可播放各种音乐格式内附SOURCE CODE可以再不同CPU 平台编译测试
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void
ListView::AddFile(const char *name)
{
    m_PlayList.AddTrack(name);
}

/*----------------------------------------------------------------------
|       ListView::AddPlayList
+---------------------------------------------------------------------*/
void
ListView::AddPlayList(const char *name)
{
    char   line[MAX_PATH];
    int    offset = 0;
    DWORD  bytes_read;
    HANDLE file;
    USES_CONVERSION;

    file = CreateFile(A2W(name),            // pointer to name of the file
                      GENERIC_READ,         // access (read-write) mode
                      0,                    // share mode
                      NULL,                 // pointer to security attributes
                      OPEN_EXISTING,        // how to create
                      FILE_ATTRIBUTE_NORMAL,// file attributes
                      NULL);                // handle to file with attributes to copy
    if (file == INVALID_HANDLE_VALUE) {
        ShowWindowsError(TEXT("Cannot Open PlayList"), GetLastError());
        return;
    }
    while (ReadFile(file, &line[offset], 1, &bytes_read, NULL) > 0) {
        if (bytes_read == 0) break;
        if (line[offset] == '\n' || line[offset] == '\r') { 
            line[offset] = '\0';
            if (offset >= 1) AddFile(line);
            offset = 0;
        } else {
            offset++;
            if (offset >= MAX_PATH) break;
        }
    }
    CloseHandle(file);
}

/*----------------------------------------------------------------------
|       ListView::DoOpenFile
+---------------------------------------------------------------------*/
void
ListView::DoOpenFile()
{
    char name[MAX_PATH];

    if (ChooseOpenFile(m_Window, name, sizeof(name)-1,
                       FILE_CHOOSER_TYPE_MPEG_AUDIO)) {
        m_Player->Stop();
        m_PlayList.Clear();
        AddFile(name);
        PlayListItem *item = GetPlayListItem(0);
        if (item) {
            item->Play();
        }
    }
}

/*----------------------------------------------------------------------
|       ListView::DoAddFile
+---------------------------------------------------------------------*/
void
ListView::DoAddFile()
{
    char name[MAX_PATH];

    if (ChooseOpenFile(m_Window, name, sizeof(name)-1,
                       FILE_CHOOSER_TYPE_MPEG_AUDIO)) {
        AddFile(name);
    }
}

/*----------------------------------------------------------------------
|       ListView::DoOpenPlayList
+---------------------------------------------------------------------*/
void
ListView::DoOpenPlayList()
{
    char  name[MAX_PATH];
    if (ChooseOpenFile(m_Window, name, sizeof(name)-1,
                       FILE_CHOOSER_TYPE_PLAYLIST)) {
        m_Player->Stop();
        m_PlayList.Clear();
        AddPlayList(name);
        PlayListItem *item = GetPlayListItem(0);
        if (item) {
            item->Play();
        }
    }
}

/*----------------------------------------------------------------------
|       ListView::DoAddPlayList
+---------------------------------------------------------------------*/
void
ListView::DoAddPlayList()
{
    char  name[MAX_PATH];

    if (ChooseOpenFile(m_Window, name, sizeof(name)-1, 
                       FILE_CHOOSER_TYPE_PLAYLIST)) {
        AddPlayList(name);
    }
}

/*----------------------------------------------------------------------
|       ListView::DoSave
+---------------------------------------------------------------------*/
void
ListView::DoSave()
{
    char name[MAX_PATH];
    int  items;

    items = ListView_GetItemCount(m_ListView);
    if (items <= 0) return;

    if (ChooseSaveFile(m_Window, name, sizeof(name)-1, 
                       FILE_CHOOSER_TYPE_PLAYLIST)) {
        HANDLE file;
        USES_CONVERSION;
        file = CreateFile(A2W(name),            // pointer to name of the file
                          GENERIC_WRITE,        // access (read-write) mode
                          0,                    // share mode
                          NULL,                 // pointer to security attributes
                          CREATE_ALWAYS,        // how to create
                          FILE_ATTRIBUTE_NORMAL,// file attributes
                          NULL);                // handle to file with attributes to copy
        if (file == INVALID_HANDLE_VALUE) {
            ShowWindowsError(TEXT("Cannot Save PlayList"), GetLastError());
            return;
        }
        for (int i=0; i<items; i++) {
            PlayListItem *item;
            item = GetPlayListItem(i);
            if (item) {
                DWORD nb_written;
                WriteFile(file,
                          item->m_FullName,
                          strlen(item->m_FullName)+1,
                          &nb_written,
                          NULL);
                WriteFile(file,
                          "\r\n",
                          1,
                          &nb_written,
                          NULL);
            }
        }
        CloseHandle(file);
    }
}

/*----------------------------------------------------------------------
|       ListView::DoDelete
+---------------------------------------------------------------------*/
void
ListView::DoDelete()
{
    // find index of selected item
    int index = ListView_GetNextItem(m_ListView, -1, LVNI_SELECTED);
    if (index < 0) return;

    PlayListItem *item = GetPlayListItem(index);
    if (item) {
        delete item;
    }
}

/*----------------------------------------------------------------------
|       ListView::DoPlay
+---------------------------------------------------------------------*/
void
ListView::DoPlay()
{
    m_PlayList.Play();
}

/*----------------------------------------------------------------------
|       ListView::DoNext
+---------------------------------------------------------------------*/
void
ListView::DoNext()
{
    if (m_Playing) {
        m_Player->OutputReset();
    }
    m_PlayList.Next();
}

/*----------------------------------------------------------------------
|       ListView::DoPrev
+---------------------------------------------------------------------*/
void
ListView::DoPrev()
{
    if (m_Playing) {
        m_Player->OutputReset();
    }
    m_PlayList.Prev();
}

/*----------------------------------------------------------------------
|       ListView::DoLoop
+---------------------------------------------------------------------*/
void
ListView::DoLoop()
{
    TBBUTTONINFO info;
    
    info.cbSize = sizeof(TBBUTTONINFO);
    info.dwMask = TBIF_STATE;

    if (SendMessage(m_CommandBar1, 
                TB_GETBUTTONINFO, 
                XA_LISTVIEW_LOOP, 
                (LPARAM)&info) >= 0) {
        if (info.fsState & TBSTATE_CHECKED) {
            m_PlayList.SetMode(PLAYLIST_MODE_LOOP, PLAYLIST_MODE_LOOP);
        } else {
            m_PlayList.SetMode(PLAYLIST_MODE_LOOP, 0);
        }
    }

}

/*----------------------------------------------------------------------
|       ListView::DoRandom
+---------------------------------------------------------------------*/
void
ListView::DoRandom()
{
    TBBUTTONINFO info;
    
    info.cbSize = sizeof(TBBUTTONINFO);
    info.dwMask = TBIF_STATE;

    if (SendMessage(m_CommandBar2, 
                TB_GETBUTTONINFO, 
                XA_LISTVIEW_RANDOM, 
                (LPARAM)&info) >= 0) {
        if (info.fsState & TBSTATE_CHECKED) {
            m_PlayList.SetMode(PLAYLIST_MODE_RANDOM, PLAYLIST_MODE_RANDOM);
        } else {
            m_PlayList.SetMode(PLAYLIST_MODE_RANDOM, 0);
        }
    }

}

/*----------------------------------------------------------------------
|       ListView::DoDoubleClick
+---------------------------------------------------------------------*/
void
ListView::DoDoubleClick(int x, int y)
{
    // find index of selected item
    int index = ListView_GetNextItem(m_ListView, -1, LVNI_SELECTED);
    if (index < 0) return;

    PlayListItem *item = GetPlayListItem(index);
    if (item) {
        m_Player->Stop();
        item->Play();
    }
}

/*----------------------------------------------------------------------
|       ListView::OnItemCreated
+---------------------------------------------------------------------*/
void
ListView::OnItemCreated(PlayListItem *item) 
{
    USES_CONVERSION;
    LV_ITEM lv_item;
    int     item_position;

    // compute which position to insert the item at
    if (item->m_LeftSibling) {
        int sibling_position = GetListViewItem(item->m_LeftSibling);
        if (sibling_position >= 0) {
            item_position = sibling_position+1;
        } else {
            item_position = 0;
        }
    } else {
        item_position = 0;
    }

    lv_item.mask     = LVIF_TEXT | LVIF_PARAM;
    lv_item.pszText  = A2W(item->m_ShortName);
    lv_item.iItem    = item_position;
    lv_item.iSubItem = 0;
    lv_item.lParam   = (LPARAM)item;

    ListView_InsertItem(m_ListView, &lv_item);
}

/*----------------------------------------------------------------------
|       ListView::OnItemDeleted
+---------------------------------------------------------------------*/
void
ListView::OnItemDeleted(PlayListItem *item) 
{
    int index;

    index = GetListViewItem(item);
    if (index >= 0) ListView_DeleteItem(m_ListView, index);
}

/*----------------------------------------------------------------------
|       ListView::OnCurrentChanged
+---------------------------------------------------------------------*/
void
ListView::OnCurrentChanged(PlayListCurrentChangedEvent *event) 
{
    if (event->previous) {
        int previous_index = GetListViewItem(event->previous);
        ListView_SetItemState(m_ListView, previous_index, 
                              INDEXTOSTATEIMAGEMASK(0), 
                              LVIS_STATEIMAGEMASK);
        ListView_RedrawItems(m_ListView, 
                             previous_index,
                             previous_index);
    }
    if (event->current) {
        int current_index = GetListViewItem(event->current);
        ListView_SetItemState(m_ListView, current_index, 
                              INDEXTOSTATEIMAGEMASK(1), 
                              LVIS_STATEIMAGEMASK);
        ListView_EnsureVisible(m_ListView, current_index, FALSE);
        ListView_RedrawItems(m_ListView, 
                             current_index,
                             current_index);
        if (event->action == PLAYLIST_ACTION_PLAY) {
            m_Player->InputOpen(event->current->m_FullName);
        } else {
            m_Player->InputClose();
            m_Player->SetInputName(event->current->m_FullName);
        }
    }
}

/*----------------------------------------------------------------------
|       ListView::OnActionStopPlaying
+---------------------------------------------------------------------*/
void
ListView::OnActionStopPlaying() 
{
    m_Player->Stop();
    m_Player->Seek(0,1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -