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

📄 playlistview.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        if(m_initialCount)
            m_initialCount--;
        else
        {
            m_bListChanged = true;
            UpdateButtonStates();
        }

        UpdateTotalTime();
    }
    else
    {
        m_itemsAddedBeforeWeWereCreated += items->size();
    }

    if(count > 999)
    {
        //ListView_SetColumnWidth(m_hPlaylistView, 0, INDEX_COLUMN_WIDTH + 6);
        //ListView_SetColumnWidth(m_hPlaylistView, 1, ListView_GetColumnWidth(m_hPlaylistView, 1) - 2);
        //ListView_SetColumnWidth(m_hPlaylistView, 2, ListView_GetColumnWidth(m_hPlaylistView, 2) - 2);
        //ListView_SetColumnWidth(m_hPlaylistView, 3, ListView_GetColumnWidth(m_hPlaylistView, 3) - 2);
    }
}

void MusicBrowserUI::DisplayCurrentItem()
{
    ListView_EnsureVisible(m_hPlaylistView, 
                           m_plm->GetCurrentIndex(), 
                           FALSE);
}

void MusicBrowserUI::GetSelectedPlaylistItems(vector<PlaylistItem*>* items)
{
    uint32 selected = ListView_GetSelectedCount(m_hPlaylistView);
    uint32 count = ListView_GetItemCount(m_hPlaylistView);
    uint32 index = 0;
    uint32 found = 0;

    for(index = 0, found = 0; found < selected && index < count; index++)
    {
        uint32 state = ListView_GetItemState(m_hPlaylistView, 
                                             index, 
                                             LVIS_SELECTED);
        if(state & LVIS_SELECTED)
        {
            PlaylistItem* item = m_plm->ItemAt(index);

            items->push_back(item);
            found++;
        }
    }
}

void MusicBrowserUI::LVBeginDrag(HWND hwnd, NM_LISTVIEW* nmlv)
{
    vector<string>* urls = new vector<string>;
    vector<PlaylistItem*> items;

    m_playlistDropTarget->TargetIsSource(true);

    GetSelectedPlaylistItems(&items);

    vector<PlaylistItem*>::iterator i;

    for(i = items.begin(); i != items.end(); i++)
    {
        urls->push_back((*i)->URL().c_str());
    }

    HIMAGELIST himl;
    RECT rcItem;
    POINT hotspot;
    
    himl = ListView_CreateDragImage(hwnd, nmlv->iItem, &hotspot);

    ListView_GetItemRect(hwnd, nmlv->iItem, &rcItem, LVIR_ICON); 

    hotspot.x = 0;
    hotspot.y = (rcItem.bottom - rcItem.top)/2;

    DataObject* data = new DataObject(CFSTR_FREEAMP_PLAYLISTITEM, urls);
    DropSource* src = new DropSource(hwnd, himl, hotspot, nmlv->ptAction);
    DWORD dwEffect = 0;

    DoDragDrop(data, 
               src, 
               DROPEFFECT_COPY|DROPEFFECT_SCROLL|DROPEFFECT_MOVE, 
               &dwEffect); 

    if(dwEffect == DROPEFFECT_MOVE)
    {
        vector<PlaylistItem*>::iterator i;

        for(i = items.begin(); i != items.end(); i++)
        {
            m_plm->RemoveItem(*i);         
        }
    }

    /*if(dwEffect != DROPEFFECT_NONE)
    {
        for(index = 0, found = 0; found < selected && index < count; index++)
        {
            uint32 state = ListView_GetItemState(hwnd, 
                                                 index, 
                                                 LVIS_SELECTED);
            if(state & LVIS_SELECTED)
            {
                ListView_SetItemState(hwnd, index, 0, LVIS_SELECTED);
                found++;
            }
        }
    }

    if(dwEffect == DROPEFFECT_MOVE)
    {
        vector<PlaylistItem*>::iterator i;

        for(i = list.begin(); i != list.end(); i++)
        {
            m_plm->RemoveItem(*i);         
        }
    }*/

    data->Release();
    src->Release();

    m_playlistDropTarget->TargetIsSource(false);
}

void MusicBrowserUI::UpdateTotalTime()
{
    uint32 count = ListView_GetItemCount(m_hPlaylistView);
    uint32 index = 0;
    uint32 total = 0;
    bool approximate = false;

    /*
    for(index = 0; index < count; index++)
    {
        PlaylistItem* item = m_plm->ItemAt(index);

        if(item)
        {
            uint32 time = item->GetMetaData().Time();

            if(!time)
                approximate = true;

            total += time;
        }
    }   
    */

    total = m_plm->Time();

    char buf[32] = "~";
    char* time = buf;

    // this will place a twiddle in front of the time
    // if any of the times are zero and thus assumed 
    // to be unknown...
    if(approximate)
        time=buf + 1;

    uint32 hours = total / 3600;
    uint32 minutes = total / 60 - hours * 60;
    uint32 seconds = total - minutes * 60 - hours * 3600;

    if(hours)
        sprintf(time, "%d:%02d:%02d", hours, minutes, seconds);
    else
        sprintf(time, "%d:%02d", minutes, seconds);

    SendMessage(m_hStatus, SB_SETTEXT, 1, (LPARAM) time);
}

LRESULT WINAPI 
ListViewWndProc(HWND hwnd, 
                UINT msg, 
                WPARAM wParam, 
                LPARAM lParam)
{
    MusicBrowserUI* ui = (MusicBrowserUI*)GetProp(hwnd, "this" );

    return ui->ListViewWndProc(hwnd, msg, wParam, lParam);
}

void MusicBrowserUI::ResizeHeader(HWND hwnd, uint32 column)
{
//    if(ListView_GetItemCount(hwnd))
//    {
        PlaylistItem* item = NULL;
        uint32 textLength = 0;
        int32 columnWidth = ListView_GetColumnWidth(hwnd,column);
        uint32 i = 0;
        string text;
        HDC hdc = GetDC(hwnd);

        while(item = m_plm->ItemAt(i++))
        {
            MetaData metadata = item->GetMetaData();
      
            const char *columnText = GetColumnText(column);

            if ( stricmp( columnText, ARTIST_COLUMN ) == 0 )
            {
                text = metadata.Artist();
            }
            else if ( stricmp( columnText, TITLE_COLUMN ) == 0 )
            {
                text = metadata.Title();
            }
            else if ( stricmp( columnText, ALBUM_COLUMN ) == 0 )
            {
                text = metadata.Album();
            }
            else if ( stricmp( columnText, LOCATION_COLUMN ) == 0 )
            {
                char path[_MAX_PATH];
                uint32 length = sizeof(path);
                URLToFilePath(item->URL().c_str(), path, &length);
                text = path;
            }
            else if ( stricmp( columnText, TIME_COLUMN ) == 0 )
            {
                char buf[16];
                if(metadata.Time() != 0)
                {
                    int32 seconds = metadata.Time();
                    int32 hours = seconds / 3600;
                    int32 minutes = seconds / 60 - hours * 60;
                    seconds = seconds - minutes * 60 - hours * 3600;

                    if(hours)
                       sprintf(buf, "%d:%02d:%02d", hours, minutes, seconds);
                    else
                       sprintf(buf, "%d:%02d", minutes, seconds);

                    text = buf;
                }
            }
            else if ( stricmp( columnText, GENRE_COLUMN ) == 0 )
            {
                text = metadata.Genre();
            }
            else if ( stricmp( columnText, COMMENT_COLUMN ) == 0 )
            {
                text = metadata.Comment();
            }
            else if ( stricmp( columnText, YEAR_COLUMN ) == 0 )
            {
                char buf[16];
                int32 year = metadata.Year();
                if(year)
                    sprintf(buf, "%d", year );
                else
                    sprintf(buf, "Unknown");

                text = buf;
            }
            else if ( stricmp( columnText, TRACK_COLUMN) == 0 )
            {
                char buf[16];
                int32 track = metadata.Track();
                if (track)
                    sprintf(buf, "%d", track );
                else
                    sprintf(buf, "Unknown");

                text = buf;
            }
            else
            {
                text = "Unknown";
            }

			if (strlen(text.c_str()) < strlen(columnText)) 
				text = columnText;

            SIZE size;

            GetTextExtentPoint32(hdc, text.c_str(), text.size(), &size); 

            if(size.cx > textLength)
                textLength = size.cx;
        }
		if (textLength <= 2)
        {
			text = GetColumnText(column);

			SIZE size;
			GetTextExtentPoint32(hdc, text.c_str(), text.size(), &size);

			textLength = size.cx;
		}

        ReleaseDC(hwnd, hdc);

        textLength += 5;

        if(column < m_columnInfo.GetNColumns()) 
        {
            int32 nextColumnWidth = ListView_GetColumnWidth(hwnd,column + 1);

            ListView_SetColumnWidth(hwnd,column, textLength);

            int32 delta = columnWidth - textLength;

            nextColumnWidth += delta;

            ListView_SetColumnWidth(hwnd,column + 1, nextColumnWidth);
        }
        else
        {
            int32 nextColumnWidth = ListView_GetColumnWidth(hwnd,column - 1);

            ListView_SetColumnWidth(hwnd,column, textLength);

            int32 delta = columnWidth - textLength;

            nextColumnWidth += delta;

            ListView_SetColumnWidth(hwnd,column - 1, nextColumnWidth);
        }
//  }
}

LRESULT MusicBrowserUI::ListViewWndProc(HWND hwnd, 
                                        UINT msg, 
                                        WPARAM wParam, 
                                        LPARAM lParam)
{
    WNDPROC lpOldProc = (WNDPROC)GetProp( hwnd, "oldproc" );
    bool filesAreURLs = false;

	switch(msg)
	{
		case WM_DESTROY:   
		{
			//  Put back old window proc and
			SetWindowLong( hwnd, GWL_WNDPROC, (DWORD)lpOldProc );

			// remove window property
			RemoveProp( hwnd, "oldproc" ); 
            RemoveProp( hwnd, "this" ); 

			break;
		}

        case WM_SETFOCUS:
        case WM_KILLFOCUS:
            UpdateButtonStates();
            break;
        
        case UWM_MOVEITEMS:
        {
            LV_HITTESTINFO hti;
            RECT itemRect;

            hti.pt = *((POINT*)lParam);
            int32 insertIndex = ListView_HitTest(hwnd, &hti);

            if(insertIndex < 0)
            {
                insertIndex = ListView_GetItemCount(hwnd) - 1;

				if (insertIndex > 0)
					insertIndex++;
            }
            else
            {   

⌨️ 快捷键说明

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