要写一段CD播放程序,怎么办?

解决方案 »

  1.   

    //以下是一个源程序,你看看吧!!
    //好的话,就多给我加点分吧!!!呵呵……
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus, StdCtrls, ExtCtrls, ComCtrls, Buttons, MPlayer,mmsystem;type
      CDAUDIOSTATE=(cdNo,cdOpen,CdPause,cdPlay,cdStop);
      CDDISPLAYTIME=(cdMusicLeft,cdDiskLeft,CDMusicPlay,cdDiskPlay);
      TMSFREC=record
        Tracks : byte;
        Minutes : byte;
        Seconds : byte;
        Frames : byte;
      end;
      MSFREC=record
        Minutes : byte;
        Seconds : byte;
        Frames : byte;
        Unused : byte;
      end;
    type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        DiskMenu: TMenuItem;
        ExitMenu: TMenuItem;
        HelpMenu: TMenuItem;
        AboutMenu: TMenuItem;
        ViewMenu: TMenuItem;
        MusicLeft: TMenuItem;
        MusicPlay: TMenuItem;
        DiskLeft: TMenuItem;
        DiskPlay: TMenuItem;
        Panel1: TPanel;
        Image1: TImage;
        Timer1: TTimer;
        Label1: TLabel;
        Label2: TLabel;
        HintEdit: TEdit;
        PlayBtn: TBitBtn;
        Pausebtn: TBitBtn;
        StopBtn: TBitBtn;
        PrevBtn: TBitBtn;
        BackBtn: TBitBtn;
        StepBtn: TBitBtn;
        NextBtn: TBitBtn;
        EjectBtn: TBitBtn;
        MusicTrack: TTrackBar;
        LeftVolume: TTrackBar;
        RightVolume: TTrackBar;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        MediaPlayer1: TMediaPlayer;
        ComboBox1: TComboBox;
        StatusBar1: TStatusBar;
        ProgressBar1: TProgressBar;
        EjectMenu: TMenuItem;
        N1: TMenuItem;
        PlayMenu: TMenuItem;
        procedure PlayBtnClick(Sender: TObject);
        procedure PausebtnClick(Sender: TObject);
        procedure EjectBtnClick(Sender: TObject);
        procedure StopBtnClick(Sender: TObject);
        procedure PrevBtnClick(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
        procedure NextBtnClick(Sender: TObject);
        procedure BackBtnClick(Sender: TObject);
        procedure StepBtnClick(Sender: TObject);
        procedure ExitMenuClick(Sender: TObject);
        procedure AboutMenuClick(Sender: TObject);
        procedure MusicLeftClick(Sender: TObject);
        procedure MusicPlayClick(Sender: TObject);
        procedure DiskPlayClick(Sender: TObject);
        procedure DiskLeftClick(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Image1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure LeftVolumeChange(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure RightVolumeChange(Sender: TObject);
        procedure StatusBar1DrawPanel(StatusBar: TStatusBar;
          Panel: TStatusPanel; const Rect: TRect);
      private
        { Private declarations }
        NowState : CDAUDIOSTATE;
        NowTrack : integer;
        NowStep : integer;
        DisplayTime : CDDISPLAYTIME;
        dontseek : Boolean;
        procedure opencd;
        procedure setHint;
        procedure outputstr(s:string;x0,y0:integer;image:TImage);
        procedure setmenucheck;
        function inttostradd0(number:integer): string;
        function subtime(time1,time2:longint): longint;
        function getdisplaystr:string;  public
        { Public declarations }
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.DFM}procedure TForm1.opencd;
    var
      i,j: integer;
      str1,str2 : string;
    begin
      mediaplayer1.open;
      mediaplayer1.next;
      mediaplayer1.rewind;
      NowTrack:=1;
      if mediaplayer1.error=0 then
      begin
        mediaplayer1.stop;
        combobox1.items.clear;
        for i:=1 to mediaplayer1.tracks do
        begin
          str1:='曲目' + inttostr(i);
          str2:='<' + inttostr(i)+ '>';
          for j:=1 to 40-length(str1)-length(str2) do
            str1:=str1+' ';
          combobox1.Items.add(str1+str2);
        end;
        combobox1.ItemIndex:=0;
        Nowstate:=cdopen;
        SetHint;
      end
      else
      begin
        combobox1.Items.clear;
        NowState:=cdNo;
        SetHint;
        playBtn.Enabled:=true;
        playMenu.Enabled:=true;
        pauseBtn.Enabled:=false;
        stopBtn.Enabled:=false;
        prevBtn.Enabled:=false;
        backBtn.Enabled:=false;
        stepBtn.Enabled:=false;
        nextBtn.Enabled:=false;
        ejectBtn.Enabled:=true;
        ejectMenu.Enabled:=true;
      end;
    end;procedure TForm1.SetHint;
    begin
      case NowState of
        cdNo: HintEdit.Text:='没有CD唱片插入';
        cdOpen: HintEdit.Text:='有CD唱片插入';
        cdPause: HintEdit.Text:='暂停播放';
        cdPlay: HintEdit.Text:='正在播放';
        cdStop: HintEdit.Text:='停止播放';
      end;
    end;procedure TForm1.Outputstr(s:string;x0,y0:integer;Image:TImage);
    var
      rect1 : Trect;
    begin
      with image1 do
      begin
        Canvas.CopyMode :=cmBlackness;
        rect1 := rect(0,0,width,height);
        Canvas.CopyRect(rect1,canvas,rect1);
        Canvas.Brush.Style :=bsclear;
        Canvas.Font.Name:='黑体';
        Canvas.Font.Color:=clYellow;
        Canvas.Font.Style:=[fsbold];
        Canvas.Font.Size:=20;
        Canvas.TextOut(x0,y0,s);
      end;
    end;procedure TForm1.Setmenucheck;
    begin
      MusicLeft.Checked:=false;
      MusicPlay.Checked:=false;
      DiskLeft.Checked:=false;
      DiskPlay.Checked:=false;
      case displaytime of
        cdMusicLeft: MusicLeft.Checked:=true;
        cdMusicPlay: Musicplay.Checked:=true;
        cdDiskLeft: DiskLeft.Checked:=true;
        cdDiskPlay: DiskPlay.Checked:=true;
      end;end;//接后……
      

  2.   

    //接上……
    function TForm1.Inttostradd0(number:integer): string;
    begin
      if number<10 then
        Result:='0'+inttostr(number)
      else
        result:=inttostr(number);
    end;function TForm1.Subtime(time1,time2:longint): longint;
    var
      min1,min2:byte;
      sec1,sec2:byte;
    begin
      min1:=MSFREC(time1).Minutes;
      min2:=MSFREC(time2).Minutes;
      sec1:=MSFREC(time1).Seconds;
      sec2:=MSFREC(time2).Seconds;
      if sec2 > sec1 then
      begin
        inc(sec1,60);
        dec(min1);
      end;
      MSFREC(result).Minutes:=min1-min2;
      MSFREC(result).seconds:=sec1-sec2;
    end;function TForm1.Getdisplaystr:string;
    var
      playTime,trackTime,allTime : longint;
      outtime: longint;
    begin
      if DisplayTime=cdMusicPlay then
      begin
        MediaPlayer1.TimeFormat:=tfTMSF;
        outtime:=MediaPlayer1.position;
        TMSFREC(outtime).Tracks:=NowTrack;
        with TMSFREC(outtime) do
          result:='['+inttostradd0(tracks)+']<'+
                  inttostradd0(minutes)+':'+
                  inttostradd0(seconds)+'>';
      end
      else if DisplayTime=cdMusicLeft then
      begin
        MediaPlayer1.TimeFormat:=tfMSF;
        playtime:=MediaPlayer1.position;
        tracktime:=mediaplayer1.TrackPosition[NowTrack];
        outtime:=subtime(playtime,tracktime);
        outtime:=subtime(mediaplayer1.trackLength[NowTrack],outtime);
    //    TMSFREC(outtime).seconds:=MSFREC(outtime).seconds;
    //   TMSFREC(outtime).minutes:=MSFREC(outtime).minutes;
     //   TMSFREC(outtime).Tracks:=NowTrack;
        with MSFREC(outtime) do
          result:='['+inttostradd0(Nowtrack)+']<'+
                  inttostradd0(minutes)+':'+
                  inttostradd0(seconds)+'>';
      end
      else if DisplayTime=cdDiskLeft then
      begin
        MediaPlayer1.TimeFormat:=tfMSF;
        playtime:=MediaPlayer1.position;
        alltime:=mediaplayer1.length;
        outtime:=subtime(alltime,playtime);
        with MSFREC(outtime) do
          result:='[--]<'+
                  inttostradd0(minutes)+':'+
                  inttostradd0(seconds)+'>';
      end
      else
      begin
        MediaPlayer1.TimeFormat:=tfMSF;
        outtime:=MediaPlayer1.position;
        with MSFREC(outtime) do
          result:='[--]<'+
                  inttostradd0(minutes)+':'+
                  inttostradd0(seconds)+'>';
      end;
    end;
    procedure TForm1.PlayBtnClick(Sender: TObject);
    begin
      if NowState=cdNo then
        opencd;
      if NowState=cdNo then
        exit;
      mediaplayer1.play;
      Nowstate:=cdplay;
      playBtn.Enabled:=false;
      PlayMenu.Enabled:=false;
      pauseBtn.Enabled:=true;
      stopBtn.Enabled:=true;
      prevBtn.Enabled:=true;
      backBtn.Enabled:=true;
      stepBtn.Enabled:=true;
      nextBtn.Enabled:=true;
      ejectBtn.Enabled:=true;
      ejectMenu.Enabled:=true;
      SetHint;
    end;procedure TForm1.PausebtnClick(Sender: TObject);
    begin
      mediaplayer1.pause;
      NowState:=cdPause;
      Nowstep:=0;
      SetHint;
      playBtn.Enabled:=true;
      playMenu.Enabled:=true;
      pauseBtn.Enabled:=false;
    end;procedure TForm1.EjectBtnClick(Sender: TObject);
    begin
      mediaplayer1.eject;
      opencd;
    end;procedure TForm1.StopBtnClick(Sender: TObject);
    begin
      mediaplayer1.stop;
      mediaplayer1.rewind;
      playbtn.Enabled:=true;
      NowState:=cdStop;
      SetHint;
    end;procedure TForm1.PrevBtnClick(Sender: TObject);  begin
        with combobox1,combobox1.Items do
        begin
          if itemindex>0 then
          itemindex:=itemindex-1
          else
          itemindex:=count-1;
        end;
        ComboBox1Change(Sender);
      end;
    procedure TForm1.ComboBox1Change(Sender: TObject);begin
      dontseek:=true;
      if combobox1.ItemIndex=-1 then
        exit;
      if NowState=cdNo then
        exit;
      Nowtrack:=combobox1.ItemIndex+1;
    {  if NowState=cdplay then
      begin
        mediaplayer1.Pause;
        SHowmessage('this');
      end;
    }
      MediaPlayer1.stop;
      MediaPlayer1.open;
      mediaplayer1.position:=mediaplayer1.trackposition[NowTrack];
      if NowState=cdplay then
        begin
        mediaplayer1.Play;
        Nowstate:=cdplay;
        end;
      dontseek:=false;end;procedure TForm1.NextBtnClick(Sender: TObject);  begin
        with combobox1,combobox1.Items do
        begin
          if itemindex<count-1 then
            itemindex:=itemindex+1
          else
            itemindex:=0;
        end;
        ComboBox1Change(Sender);
      end;
    procedure TForm1.BackBtnClick(Sender: TObject);
    var
      Nowpos : integer;
    begin
      with mediaplayer1 do
      begin
        Pause;
        TimeFormat:=tfTMSF;
        Nowpos:=position;
        with TMSFREC(Nowpos) do
        begin
          if Seconds<10 then
          begin
            Seconds:=Seconds+60-10;
            dec(Minutes);
            if Minutes<0 then
            begin
              Minutes:=0;
              Seconds:=0;
            end;
          end
          else
            Seconds:=Seconds-10;
        end;
        position:=Nowpos;
        if NowState = cdPlay then
          resume;
      end;
    end;procedure TForm1.StepBtnClick(Sender: TObject);
    var
      Nowpos : integer;
    begin
      with mediaplayer1 do
      begin
        Pause;
        TimeFormat:=tfTMSF;
        Nowpos:=position;
        with TMSFREC(Nowpos) do
        begin
          Seconds:=Seconds+10;
          if Seconds>60 then
          begin
            dec(Seconds,60);
            inc(Minutes);
          end;
        end;
        position:=Nowpos;
        if NowState = cdPlay then
          resume;
      end;
    end;procedure TForm1.ExitMenuClick(Sender: TObject);
    begin
      close;
    end;procedure TForm1.AboutMenuClick(Sender: TObject);
    begin
      showmessage('【TTG】小组');procedure TForm1.MusicLeftClick(Sender: TObject);
    begin
      DisplayTime:=cdMusicLeft;
      SetmenuCheck;
    end;procedure TForm1.MusicPlayClick(Sender: TObject);
    begin
      DisplayTime:=cdMusicPlay;
      SetmenuCheck;
    end;procedure TForm1.DiskPlayClick(Sender: TObject);
    begin
      DisplayTime:=cdDiskPlay;
      SetmenuCheck;
    end;procedure TForm1.DiskLeftClick(Sender: TObject);
    begin
      DisplayTime:=cdDiskLeft;
      SetmenuCheck;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if nowstate<>cdstop then
        mediaplayer1.Stop;
      mediaplayer1.Close;
    end;procedure TForm1.Image1Click(Sender: TObject);
    begin
      if DisplayTime= cdMusicLeft then
        DisplayTime:= cdMusicPlay
      else if DisplayTime= cdMusicPlay then
        DisplayTime:= cdDiskPlay
      else if DisplayTime= cdDiskPlay then
        DisplayTime:= cdDiskLeft
      else if DisplayTime= cdDiskLeft then
        DisplayTime:= cdMusicLeft;
      Setmenucheck;
    end;//接后……
      

  3.   

    //接上……
    //我想这可得给多点分吧!!!呵呵
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      Nowpos : longint;
      Tlength : longint;
      Llength,Lnowpos : longint;
    begin
      if NowState=cdNo then
        outputstr('',20,25,image1)
      else
      begin
        MediaPlayer1.TimeFormat:=tfTMSF;
        if NowState=cdPause then
        begin
          if NowStep=1 then
          begin
            NowStep:=0;
            outputstr('',20,25,image1);
            exit;
          end
          else
            NowStep:=1;
        end;
        outputstr(GetDisplaystr,20,25,image1);
        with Mediaplayer1 do
        begin      TimeFormat:=tfTMSF;
          NowPos:=Position;
          Tlength:=trackLength[NowTrack];
          with TMSFREC(Nowpos) do
          begin
            if Tracks<>NowTrack then
            begin
              combobox1.ItemIndex:=Tracks-1;
         //     showmessage(inttostr(nowtrack));
         //     showmessage(inttostr(tracks));
            if not(dontseek) then
              combobox1Change(Sender);
            end;
            lnowPos:=minutes*60+seconds;
          end;
          with TMSFREC(Tlength) do
            llength:=minutes*60+seconds;
          Musictrack.Min:=0;
          MusicTrack.Max:=llength;
          MusicTrack.Position:=lnowpos;
          TimeFormat:=tfMilliseconds;
          NowPos:=Position;
          Tlength:=Length;
          ProgressBar1.Min:=0;
          ProgressBar1.Max:=100;
          ProgressBar1.Position:=NowPos*100 div TLength;
        end;
      end;
      StatusBar1.Panels.Items[0].Text:=timetostr(time);
    end;procedure TForm1.LeftVolumeChange(Sender: TObject);
    var
      v,t: longint;
    begin
      t:=255-leftvolume.position;
      waveoutgetvolume(mediaplayer1.deviceid-1,@v);
      v:= ((t shl 8) or (v and $ffff0000));
      waveoutsetvolume(mediaplayer1.DeviceID-1,v);
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      v: longint;
    begin
      LeftVolume.max:=255;
      RightVolume.max:=255;
      LeftVolume.min:=0;
      RightVolume.min:=0;
      waveoutgetvolume(mediaplayer1.deviceid-1,@v);
      LeftVolume.position:=255-hi(v);
      RightVolume.position:=255-hi(v shr 16);
      StatusBar1.Panels.Items[1].Width:=Progressbar1.Width;
      StatusBar1.Panels.Items[0].Width:=(ClientWidth
        -StatusBar1.Panels.Items[1].Width)-10 ;
      ProgressBar1.Parent:=StatusBar1 ;
      opencd;
      SetHint;
      DisPlayTime:=cdMusicLeft;
      Setmenucheck;end;procedure TForm1.RightVolumeChange(Sender: TObject);
    var
      v,t: longint;
    begin
      t:=255-Rightvolume.position;
      waveoutgetvolume(mediaplayer1.deviceid-1,@v);
      v:= ((t shl 24) or (v and $0000ffff));
      waveoutsetvolume(mediaplayer1.deviceid-1,v);
    end;procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
    begin
      ProgressBar1.BoundsRect := Rect;
    end;
    end.
      

  4.   

    d5开发人员p554页有完整的讲了一个用TMediaplayer播放CD的程序。