首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >音乐与TrackBar调戏

音乐与TrackBar调戏
EN

Stack Overflow用户
提问于 2018-11-01 19:33:08
回答 1查看 123关注 0票数 0

我正在创建一个简单的音乐(mp3)播放器在WinForm in C#。我想要实现的是:

1)播放选定的音乐文件

2)在音乐播放时自动移动TrackBar

3)允许用户来回移动轨迹栏,这样他们就可以在轨道上的任何地方播放音乐。(音乐也在播放)

我的第一和第二工作没有任何问题。然而,我在实现#3时遇到了困难。当我重写这个值时,音乐播放得很不稳定。这是我的密码。

代码语言:javascript
复制
private AxWMPLib.AxWindowsMediaPlayer player;

/*Play the music file selected (#1) */
private void BtnPlay_Click(object sender, EventArgs e)
{
    player = new AxWMPLib.AxWindowsMediaPlayer();
    player.CreateControl();
    player.URL = filePath; //Initialized somewhere in the code
    player.PlayStateChange += player_PlayStateChange;
    player.Ctlcontrols.play();
}

private void player_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
    if (player.playState == WMPLib.WMPPlayState.wmppsPlaying)
    {
        MyTrackBar.Maximum = (int)player.Ctlcontrols.currentItem.duration;
        TmrPlay.Start();
    }
    else if(player.playState == WMPLib.WMPPlayState.wmppsStopped)
    {
        TmrPlay.Stop();
        MyTrackBar.Value = 0;
    }
}

/*Move the TrackBar automatically with Timer. (#2) Runs every 100 ms */
private void TmrPlay_Tick(object sender, EventArgs e)
{
    if (player.playState == WMPLib.WMPPlayState.wmppsPlaying)         
        MyTrackBar.Value = (int)player.Ctlcontrols.currentPosition;
}

/* Trying to play music from anywhere when the TrackBar is manually moved. 
   For example, they can move the TrackBar and move it towards the end of the 
   music, WHILE THE MUSIC IS PLAYING. */
/* With this below event code, I can move the TrackBar freely, but the music
   plays very choppy because it keeps changing the currentPosition. */
private void MyTrackBar_ValueChanged(object sender, EventArgs e)
{
    player.Ctlcontrols.currentPosition = MyTrackBar.Value;
}

有人能给我一些建议吗?当TrackBar被移动的时候,如何不让音乐变得波涛汹涌?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-01 20:45:05

您面临的问题是,您正在更新跟踪条从滴答事件,然后这是触发球员的位置被重新更新到它的位置。因此,每个滴答迫使跟踪条更新两次,这是介绍你正在经历的口吃。

要修复它,您需要不更新球员的位置,如果勾选事件是触发。

类级bool变量将完成以下任务:

代码语言:javascript
复制
private bool ticking = false;

在您的TmrPlay_Tick中,应该将ticking设置为true:

代码语言:javascript
复制
if (player.playState == WMPLib.WMPPlayState.wmppsPlaying)         
{
    ticking = true;
    MyTrackBar.Value = (int)player.Ctlcontrols.currentPosition;
}

然后在您的MyTrackBar_ValueChanged事件中,如果滴答为真,就不要再次更新跟踪栏:

代码语言:javascript
复制
if (ticking)
{
    ticking = false;
}
else
{
    player.Ctlcontrols.currentposition = MyTrackBar.Value;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53108193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档