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

📄 cpi_playlistwindow.c

📁 VC++视频开发实例集锦(包括“远程视频监控”"语音识别系统"等13个经典例子)
💻 C
📖 第 1 页 / 共 4 页
字号:
                || pMSG->message == WM_NCRBUTTONDOWN)
                && pMSG->hwnd != windows.wnd_playlist_IPEdit)
        {
            // Get the classname to ensure that it's not our combo popup that's got the message
            char cClassname[64];
            GetClassName(pMSG->hwnd, cClassname, 64);
            if(strcmp("ComboLBox", cClassname))
                CPlaylistWindow_DestroyIPEdit();
        }
    }

    if(globals.m_hhkListView_Posted)
        return CallNextHookEx(globals.m_hhkListView_Posted, iCode, wParam, lParam);
    else
        return 0;
}
//
//
//
void CPlaylistWindow_TrackStackMenu(iItem)
{
    HWND hWndList;
    POINT ptItem;
    RECT rSubItem;
    HMENU hmMenu;
    UINT uiMenuCommand;
    int iSearchItemIDX;
    CP_HPLAYLISTITEM hClickedItem;
    CPe_ItemStackState enClickedItemState;
    BOOL bMultipleSelection;

    // We want to get the subitem's rect in the co-ordinate space of the dialog
    hWndList = CLV_GetHWND(globals.m_hPlaylistViewControl);
    CLV_GetItemSubRect(globals.m_hPlaylistViewControl, &rSubItem, iItem, 0);

    // Are there multiple items selected?
    iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
    if(iSearchItemIDX != CPC_INVALIDITEM)
        iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
    if(iSearchItemIDX != CPC_INVALIDITEM)
        bMultipleSelection = TRUE;
    else
        bMultipleSelection = FALSE;

    ptItem.x = rSubItem.left;
    ptItem.y = rSubItem.bottom;
    ClientToScreen(hWndList, &ptItem);

    // Create menu
    hmMenu = CreatePopupMenu();

    hClickedItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iItem);
    enClickedItemState = CPL_Stack_GetItemState(globals.m_hPlaylist, hClickedItem);
    if(enClickedItemState != issUnstacked)
    {
        AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYFROMHERE, "Play from here");
        SetMenuDefaultItem(hmMenu, IDC_CMDTS_PLAYFROMHERE, FALSE);

        if(enClickedItemState != issStacked_Top)
        {
            AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNEXT, "Play next");
            AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_UNSTACK, "Unstack");
        }

        // Not played yet?
        if(enClickedItemState == issStacked || enClickedItemState == issStacked_Top)
        {
            if(options.repeat_playlist == TRUE)
            {
                AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER, "Repeat after this");
                AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER_NOREP, "Stop after this (repeat->off)");
            }
            else
            {
                AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER, "Stop after this");
            }
        }

        if(enClickedItemState != issStacked_Top)
            AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_QUEUE, "Queue at end");
    }
    else
    {
        AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNOW, "Play now");
        SetMenuDefaultItem(hmMenu, IDC_CMDTS_PLAYNOW, FALSE);

        AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNEXT, "Play next");
        AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_QUEUE, "Queue at end");
    }

    AppendMenu(hmMenu, MF_SEPARATOR, 0, NULL);
    AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_CLEARSTACK, "Clear stack");
    AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_RESTACKALL, "Restack all");

    uiMenuCommand = TrackPopupMenuEx(	hmMenu,
                                      TPM_NONOTIFY
                                      | TPM_RETURNCMD
                                      | TPM_RIGHTBUTTON,
                                      ptItem.x, ptItem.y,
                                      IF_GetHWnd(windows.m_hifPlaylist),
                                      NULL);
    DestroyMenu(hmMenu);

    if(uiMenuCommand == IDC_CMDTS_CLEARSTACK)
    {
        CPL_Stack_Clear(globals.m_hPlaylist);
    }
    else if(uiMenuCommand == IDC_CMDTS_RESTACKALL)
    {
        CPL_Stack_RestackAll(globals.m_hPlaylist);
    }
    else if(uiMenuCommand == IDC_CMDTS_PLAYFROMHERE)
    {
        CPL_Stack_SetCursor(globals.m_hPlaylist, hClickedItem);
        CPL_PlayItem(globals.m_hPlaylist, TRUE, pmCurrentItem);
    }
    else if(uiMenuCommand == IDC_CMDTS_UNSTACK)
    {
        iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
        while(iSearchItemIDX != CPC_INVALIDITEM)
        {
            CPL_Stack_Remove(globals.m_hPlaylist, (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX) );
            iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
        }
    }
    else if(uiMenuCommand == IDC_CMDTS_PLAYNOW)
    {
        CP_HPLAYLISTITEM hFirstItem;

        CPL_Stack_ClipFromCurrent(globals.m_hPlaylist);
        iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
        hFirstItem = NULL;
        while(iSearchItemIDX != CPC_INVALIDITEM)
        {
            CP_HPLAYLISTITEM hItem;

            hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);
            if(!hFirstItem)
                hFirstItem = hItem;
            CPL_Stack_Append(globals.m_hPlaylist, hItem);
            iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
        }
        CPL_Stack_SetCursor(globals.m_hPlaylist, hFirstItem);
        CPL_PlayItem(globals.m_hPlaylist, TRUE, pmCurrentItem);
    }
    else if(uiMenuCommand == IDC_CMDTS_STOPAFTER)
    {
        CPL_Stack_ClipFromItem(globals.m_hPlaylist, hClickedItem);
    }
    else if(uiMenuCommand == IDC_CMDTS_STOPAFTER_NOREP)
    {
        options.repeat_playlist = FALSE;
        InvalidateRect(windows.wnd_main, NULL, FALSE);
        CPL_Stack_ClipFromItem(globals.m_hPlaylist, hClickedItem);
    }
    else if(uiMenuCommand == IDC_CMDTS_PLAYNEXT)
    {
        iSearchItemIDX = CLV_GetPrevSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
        while(iSearchItemIDX != CPC_INVALIDITEM)
        {
            CPL_Stack_PlayNext(globals.m_hPlaylist, (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX) );
            iSearchItemIDX = CLV_GetPrevSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
        }
    }
    else if(uiMenuCommand == IDC_CMDTS_QUEUE)
    {
        iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
        while(iSearchItemIDX != CPC_INVALIDITEM)
        {
            CP_HPLAYLISTITEM hItem;

            hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);

            CPL_Stack_Remove(globals.m_hPlaylist, hItem);
            CPL_Stack_Append(globals.m_hPlaylist, hItem);
            iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
        }
    }
}
//
//
//
void CPlaylistWindow_RenameMenu(const int iItem, const int iSubItem)
{
    HWND hWndList;
    POINT ptItem;
    RECT rSubItem;
    HMENU hmMenu;
    UINT uiMenuCommand;

    // We want to get the subitem's rect in the co-ordinate space of the dialog
    hWndList = CLV_GetHWND(globals.m_hPlaylistViewControl);
    CLV_GetItemSubRect(globals.m_hPlaylistViewControl, &rSubItem, iItem, iSubItem);
    ptItem.x = rSubItem.left;
    ptItem.y = rSubItem.bottom;
    ClientToScreen(hWndList, &ptItem);

    // Create menu
    hmMenu = CreatePopupMenu();

    AppendMenu(hmMenu, MF_STRING, (DWORD)rwsArtistAlbumNumberTitle, "Rename to <artist> - <album> - <tracknum> - <title>");
    AppendMenu(hmMenu, MF_STRING, (DWORD)rwsArtistNumberTitle, "Rename to <artist> - <tracknum> - <title>");
    AppendMenu(hmMenu, MF_STRING, (DWORD)rwsAlbumNumberTitle, "Rename to <album> - <tracknum> - <title>");
    AppendMenu(hmMenu, MF_STRING, (DWORD)rwsAlbumNumber, "Rename to <album> - <tracknum>");
    AppendMenu(hmMenu, MF_STRING, (DWORD)rwsNumberTitle, "Rename to <tracknum> - <title>");
    AppendMenu(hmMenu, MF_STRING, (DWORD)rwsTitle, "Rename to <title>");

    uiMenuCommand = TrackPopupMenuEx(	hmMenu,
                                      TPM_NONOTIFY
                                      | TPM_RETURNCMD
                                      | TPM_RIGHTBUTTON,
                                      ptItem.x, ptItem.y,
                                      IF_GetHWnd(windows.m_hifPlaylist),
                                      NULL);
    DestroyMenu(hmMenu);

    if(uiMenuCommand)
    {
        int iSearchItemIDX;
        int iNumberOfErrors;

        iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
        iNumberOfErrors = 0;
        while(iSearchItemIDX != CPC_INVALIDITEM)
        {
            BOOL bSucceeded;
            bSucceeded = CPLI_RenameTrack((CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX),
                                          (CPe_FilenameFormat)uiMenuCommand);
            iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);

            if(!bSucceeded)
                iNumberOfErrors++;
        }

        if(iNumberOfErrors > 0)
        {
            MessageBox(IF_GetHWnd(windows.m_hifPlaylist),
                       "Some files could not be renamed.\n\nThis could be because they are either currently playing or are read-only.",
                       "Error",
                       MB_OK | MB_ICONASTERISK);
        }
    }
}
//
//
//
void CPlaylistWindow_CreateIPEdit(const int iItem, const int iSubItem)
{
    RECT rSubItem;
    const char* pcClass;
    DWORD dwStyle;
    int iSearchItemIDX;
    UINT uiControlID;
    BOOL bClearNonSelectedItems;
    CP_HPLAYLISTITEM hClickedItem;
    HWND hWndList;
    int iNumItemsSelected;

    // If the clicked item is not read/write then skip this
    hClickedItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iItem);
    if(CPLI_GetReadWriteState(hClickedItem) != rwsReadWrite)
    {
        MessageBox(windows.m_hWndPlaylist, "This file's ID3 tag cannot be updated.  This is because CoolPlayer cannot write to this file.", "Cannot update tag", MB_OK | MB_ICONSTOP);
        return;
    }

    // For some sub items it is not logical to multi update - action these
    if(iSubItem == PLAYLIST_TITLE)
        bClearNonSelectedItems = TRUE;
    else
        bClearNonSelectedItems = FALSE;

    // Go through the selected items and remove the selection of items that
    // cannot be written to (eg because of a read only file)
    iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
    iNumItemsSelected = 1;
    for(;iSearchItemIDX != -1; iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX))
    {
        CP_HPLAYLISTITEM hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);
        CPLI_ReadTag(hItem);

        // We've already checked this item
        if(iSearchItemIDX == iItem)
            continue;

        iNumItemsSelected++;
        if(bClearNonSelectedItems == TRUE || CPLI_GetReadWriteState(hItem) != rwsReadWrite)
            CLV_SetItemSelected(globals.m_hPlaylistViewControl, iSearchItemIDX, FALSE);
    }

    // If the "track number" column was clicked - and there are multiple selections - auto number them
    if(iSubItem == PLAYLIST_TRACKNUM && iNumItemsSelected > 1)
    {
        char cStatusMessage[1024];
        int iTrackNumber;

        // Autonumber
        SetCursor(LoadCursor(NULL, IDC_WAIT));
        iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
        iTrackNumber = 1;
        for(;iSearchItemIDX != CPC_INVALIDITEM; iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX))
        {
            CP_HPLAYLISTITEM hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);

            sprintf(cStatusMessage, "Tagging \"%s\"", CPLI_GetFilename(hItem));
 			CP_TRACE1("status: %s",cStatusMessage);
           CPIC_SetIndicatorValue("status", cStatusMessage);
            UpdateWindow(IF_GetHWnd(windows.m_hifPlaylist));

//            CPLI_SetTrackNum(hItem, iTrackNumber);
            CPLI_WriteTag(hItem);
            iTrackNumber++;
        }
        SetCursor(LoadCursor(NULL, IDC_ARROW));
        CPIC_SetIndicatorValue("status", NULL);
        return;
    }

    // If the length was clicked - work out the lengths for all selected items
    if(iSubItem == PLAYLIST_LENGTH)
    {
        char cStatusMessage[1024];

        SetCursor(LoadCursor(NULL, IDC_WAIT));
        iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
        for(; iSearchItemIDX != CPC_INVALIDITEM; iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX))
        {
            CP_HPLAYLISTITEM hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);

            CPLI_CalculateLength(hItem);
            sprintf(cStatusMessage, "Tagging \"%s\"", CPLI_GetFilename(hItem));
            
			CPIC_SetIndicatorValue("status", cStatusMessage);
			CP_TRACE1("status: %s",cStatusMessage);
           UpdateWindow(IF_GetHWnd(windows.m_hifPlaylist));

⌨️ 快捷键说明

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