Unit1.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:14k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  5.   Dialogs, DSPack, DirectShow9, StdCtrls, ActiveX, DSUtil, Menus,
  6.   ExtCtrls, ComCtrls, Buttons, ImgList;
  7. type
  8.   pPlayListItem = ^TPlayListItem;
  9.   TPlayListItem = Record
  10.     Filename : String;
  11.     Path : String;
  12.   End;
  13.   TForm1 = class(TForm)
  14.     FilterGraph1: TFilterGraph;
  15.     OpenDialog1: TOpenDialog;
  16.     MainMenu1: TMainMenu;
  17.     File1: TMenuItem;
  18.     Open1: TMenuItem;
  19.     Exit1: TMenuItem;
  20.     Panel1: TPanel;
  21.     TrackBar1: TTrackBar;
  22.     SpeedButton1: TSpeedButton;
  23.     SpeedButton2: TSpeedButton;
  24.     SpeedButton3: TSpeedButton;
  25.     ImageList1: TImageList;
  26.     SpeedButton4: TSpeedButton;
  27.     SpeedButton5: TSpeedButton;
  28.     Label1: TLabel;
  29.     PopupMenu1: TPopupMenu;
  30.     Play1: TMenuItem;
  31.     Pause1: TMenuItem;
  32.     Stop1: TMenuItem;
  33.     N1: TMenuItem;
  34.     Fullscreen1: TMenuItem;
  35.     Panel3: TPanel;
  36.     ColorControl1: TMenuItem;
  37.     N2: TMenuItem;
  38.     SoundLevel: TTrackBar;
  39.     Label3: TLabel;
  40.     ImageList2: TImageList;
  41.     DSVideoWindowEx1: TDSVideoWindowEx2;
  42.     Panel2: TPanel;
  43.     Splitter1: TSplitter;
  44.     PopupMenu2: TPopupMenu;
  45.     Add1: TMenuItem;
  46.     Remove1: TMenuItem;
  47.     Clear1: TMenuItem;
  48.     View1: TMenuItem;
  49.     AspectRatio1: TMenuItem;
  50.     Stretched1: TMenuItem;
  51.     LetterBox1: TMenuItem;
  52.     Crop1: TMenuItem;
  53.     SpeedButton6: TSpeedButton;
  54.     SpeedButton7: TSpeedButton;
  55.     Panel4: TPanel;
  56.     ListBox1: TListBox;
  57.     SpeedButton13: TSpeedButton;
  58.     N3: TMenuItem;
  59.     Exit2: TMenuItem;
  60.     ComboBox1: TComboBox;
  61.     Memo1: TMemo;
  62.     DSTrackBar1: TDSTrackBar;
  63.     Label2: TLabel;
  64.     Bevel1: TBevel;
  65.     procedure Open1Click(Sender: TObject);
  66.     procedure Exit1Click(Sender: TObject);
  67.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  68.     procedure DSVideoWindowEx1ColorKeyChanged(Sender: TObject);
  69.     procedure TrackBar1Change(Sender: TObject);
  70.     procedure SpeedButton1Click(Sender: TObject);
  71.     procedure SpeedButton2Click(Sender: TObject);
  72.     procedure SpeedButton3Click(Sender: TObject);
  73.     procedure FormCreate(Sender: TObject);
  74.     procedure SpeedButton4Click(Sender: TObject);
  75.     procedure SpeedButton5Click(Sender: TObject);
  76.     procedure DSTrackBar1Timer(sender: TObject; CurrentPos,
  77.       StopPos: Cardinal);
  78.     procedure SoundLevelChange(Sender: TObject);
  79.     procedure CheckColorControlSupport;
  80.     procedure PopupMenu2Popup(Sender: TObject);
  81.     procedure Add1Click(Sender: TObject);
  82.     procedure ListBox1DblClick(Sender: TObject);
  83.     procedure PlayFile(Filename : String);
  84.     procedure FilterGraph1GraphComplete(sender: TObject; Result: HRESULT;
  85.       Renderer: IBaseFilter);
  86.     procedure Stretched1Click(Sender: TObject);
  87.     procedure LetterBox1Click(Sender: TObject);
  88.     procedure Crop1Click(Sender: TObject);
  89.     procedure SpeedButton13Click(Sender: TObject);
  90.     procedure PopupMenu1Popup(Sender: TObject);
  91.     procedure SpeedButton7Click(Sender: TObject);
  92.     procedure SpeedButton6Click(Sender: TObject);
  93.     procedure Clear1Click(Sender: TObject);
  94.     procedure Exit2Click(Sender: TObject);
  95.     procedure FilterGraph1DSEvent(sender: TComponent; Event, Param1,
  96.       Param2: Integer);
  97.     procedure DSVideoWindowEx1OverlayVisible(Sender: TObject;
  98.       Visible: Boolean);
  99.   private
  100.     { Private declarations }
  101.   public
  102.     { Public declarations }
  103.     OsdChanged : Boolean;
  104.     PlayListItem : pPlayListItem;
  105.     PlayingIndex : Integer;
  106.   end;
  107. var
  108.   Form1: TForm1;
  109. implementation
  110. uses ColorControl;
  111. {$R *.dfm}
  112. procedure TForm1.Open1Click(Sender: TObject);
  113. var
  114.   i : Integer;
  115. begin
  116.   // The Add file to playerlist was selected.
  117.   If OpenDialog1.Execute then
  118.   Begin
  119.     Listbox1.Items.Clear;
  120.     with OpenDialog1.Files do
  121.       // Now go thru every files selected in the opendialog and add
  122.       // them one by one to the Players playlist.
  123.       // The first file added to the players playlist will loaded
  124.       // automaticly
  125.       for I := Count - 1 downto 0 do
  126.       begin
  127.         New(PlayListItem);
  128.         PlayListItem^.Filename := ExtractFilename(Strings[I]);
  129.         PlayListItem^.Path := ExtractFilePath(Strings[I]);
  130.         ListBox1.Items.AddObject(PlayListItem^.Filename, TObject(PlayListItem));
  131.       end;
  132.     Listbox1.ItemIndex := 0;
  133.     PlayFile(OpenDialog1.Files.Strings[0]);
  134.     PlayingIndex := 0;
  135.   end;
  136.   if PlayingIndex < Listbox1.Items.Count -1 then
  137.     SpeedButton7.Enabled := True;
  138. end;
  139. procedure TForm1.Exit1Click(Sender: TObject);
  140. begin
  141.   FilterGraph1.ClearGraph;
  142. {  FilterGraph1.Active := false;
  143.   Application.Terminate;}
  144. end;
  145. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  146. begin
  147.   Exit1Click(nil)
  148. end;
  149. procedure TForm1.DSVideoWindowEx1ColorKeyChanged(Sender: TObject);
  150. begin
  151.   If DSVideoWindowEx1.OverlayVisible then
  152.   Begin
  153.     Panel2.Color := DSVideoWindowEx1.ColorKey;
  154.     ImageList2.BkColor := DSVideoWindowEx1.ColorKey;
  155.   end
  156.   else
  157.   Begin
  158.     Panel2.Color := DSVideoWindowEx1.Color;
  159.     ImageList2.BkColor := DSVideoWindowEx1.Color;
  160.   end;
  161. end;
  162. procedure TForm1.TrackBar1Change(Sender: TObject);
  163. begin
  164.   DSVideoWindowEx1.DigitalZoom := TrackBar1.Position;
  165. end;
  166. procedure TForm1.SpeedButton1Click(Sender: TObject);
  167. begin
  168.   if not FilterGraph1.Active then
  169.     Open1Click(nil)
  170.   else
  171.     FilterGraph1.play;
  172.   CheckColorControlSupport;
  173. end;
  174. procedure TForm1.SpeedButton2Click(Sender: TObject);
  175. begin
  176.   FilterGraph1.Pause;
  177. end;
  178. procedure TForm1.SpeedButton3Click(Sender: TObject);
  179. begin
  180.   FilterGraph1.Stop;
  181. end;
  182. procedure TForm1.FormCreate(Sender: TObject);
  183. var
  184.   i : Integer;
  185. begin
  186.   Imagelist1.GetBitmap(3, SpeedButton1.Glyph);
  187.   Imagelist1.GetBitmap(2, SpeedButton2.Glyph);
  188.   Imagelist1.GetBitmap(4, SpeedButton3.Glyph);
  189.   Imagelist1.GetBitmap(9, SpeedButton4.Glyph);
  190.   Imagelist1.GetBitmap(8, SpeedButton13.Glyph);
  191.   Imagelist1.GetBitmap(0, SpeedButton6.Glyph);
  192.   Imagelist1.GetBitmap(6, SpeedButton7.Glyph);
  193.   Case DSVideoWindowEx1.AspectRatio of
  194.     rmStretched : Stretched1.Checked := True;
  195.     rmLetterBox : LetterBox1.Checked := True;
  196.     rmCrop      : Crop1.Checked := True;
  197.   End;
  198.   Combobox1.Items.Add('Current Monitor');
  199.   If Screen.MonitorCount > 1 then
  200.   Begin
  201.     for I := 0 to Screen.MonitorCount - 1 do
  202.       Combobox1.Items.Add('Monitor'+inttostr(I));
  203.     Combobox1.Enabled := True;
  204.   End;
  205.   Combobox1.ItemIndex := 0;
  206. end;
  207. procedure TForm1.SpeedButton4Click(Sender: TObject);
  208. begin
  209.   If DSVideoWindowEx1.FullScreen then
  210.     DSVideoWindowEx1.NormalPlayback
  211.   else
  212.     If Combobox1.ItemIndex > 0 then
  213.       DSVideoWindowEx1.StartFullScreen(Screen.Monitors[Combobox1.Itemindex -1])
  214.     else
  215.       DSVideoWindowEx1.StartFullScreen;
  216.   SpeedButton4.Down := DSVideoWindowEx1.FullScreen;
  217. end;
  218. procedure TForm1.SpeedButton5Click(Sender: TObject);
  219. begin
  220.   ColorControlForm.Show;
  221. end;
  222. procedure TForm1.DSTrackBar1Timer(sender: TObject; CurrentPos,
  223.   StopPos: Cardinal);
  224. var
  225.   CurrPos : Int64;
  226.   Value, H, M, S : Integer;
  227.   MediaSeeking: IMediaSeeking;
  228. begin
  229.   FilterGraph1.QueryInterface(IMediaSeeking, MediaSeeking);
  230.   with MediaSeeking do
  231.   Begin
  232.     GetCurrentPosition(CurrPos);
  233.     Value := Trunc(CurrPos / 10000000);
  234.     H := value div 3600;
  235.     M := (value mod 3600) div 60;
  236.     S := (value mod 3600) mod 60;
  237.     Panel2.Caption := Format('%d:%2.2d:%2.2d', [H, M, S]);
  238.   End;
  239.   If OsdChanged then
  240.   Begin
  241.     DSVideoWindowEx1.ClearBack;
  242.     OsdChanged := False;
  243.   End;
  244. end;
  245. procedure TForm1.SoundLevelChange(Sender: TObject);
  246. var
  247.   Tmp : TBitmap;
  248. begin
  249.   Tmp := TBitmap.Create;
  250.   Imagelist2.GetBitmap(0, Tmp);
  251.   FilterGraph1.Volume := SoundLevel.Position;
  252.   DSVideoWindowEx1.Canvas.CopyRect(Rect(10, DSVideoWindowEx1.Height - 65, 218, DSVideoWindowEx1.Height - 27), Tmp.Canvas, Rect(0, 0, 104, 23));
  253.   Imagelist2.GetBitmap(1, Tmp);
  254.   DSVideoWindowEx1.Canvas.CopyRect(Rect(10, DSVideoWindowEx1.Height - 65, 10 + Trunc((104 / 10000) * SoundLevel.Position) * 2, DSVideoWindowEx1.Height - 27), Tmp.Canvas, Rect(0,0,Trunc((104 / 10000) * SoundLevel.Position), 23));
  255.   Tmp.Free;
  256.   OsdChanged := True;
  257. end;
  258. procedure TForm1.CheckColorControlSupport;
  259. Begin
  260.   SpeedButton5.Enabled := True;
  261.   ColorControl1.Enabled := True;
  262. End;
  263. procedure TForm1.PopupMenu2Popup(Sender: TObject);
  264. begin
  265.   If Listbox1.ItemIndex <> -1 then
  266.     Remove1.Enabled := True
  267.   else
  268.     Remove1.Enabled := False;
  269.   If Listbox1.Items.Count > 0 then
  270.     Clear1.Enabled := True
  271.   else
  272.     Clear1.Enabled := False;
  273. end;
  274. procedure TForm1.Add1Click(Sender: TObject);
  275. var
  276.   i : Integer;
  277. begin
  278.   If ListBox1.Items.Count < 1 then
  279.   Begin
  280.     Open1Click(nil);
  281.     SpeedButton6.Enabled := False;
  282.     SpeedButton7.Enabled := False;
  283.     Exit;
  284.   End;
  285.   if OpenDialog1.Execute then
  286.   begin
  287.     with OpenDialog1.Files do
  288.       // Now go thru every files selected in the opendialog and add
  289.       // them one by one to the Players playlist.
  290.       // The first file added to the players playlist will loaded
  291.       // automaticly
  292.       for I := Count - 1 downto 0 do
  293.       begin
  294.         New(PlayListItem);
  295.         PlayListItem^.Filename := ExtractFilename(Strings[I]);
  296.         PlayListItem^.Path := ExtractFilePath(Strings[I]);
  297.         ListBox1.Items.AddObject(PlayListItem^.Filename, TObject(PlayListItem));
  298.       end;
  299.   End;
  300.   If PlayingIndex > 0 then
  301.     SpeedButton6.Enabled := True;
  302.   if PlayingIndex < Listbox1.Items.Count -1 then
  303.     SpeedButton7.Enabled := True;
  304. end;
  305. procedure TForm1.ListBox1DblClick(Sender: TObject);
  306. var
  307.   Filename : String;
  308. begin
  309.   If ListBox1.ItemIndex = PlayingIndex then Exit;
  310.   PlayListItem := pPlayListitem(Listbox1.Items.Objects[ListBox1.Itemindex]);
  311.   Filename := PlayListItem^.Path;
  312.   If Filename[Length(Filename)] <> '' then
  313.     Filename := Filename + '';
  314.   Filename := Filename + PlayListItem^.Filename;
  315.   PlayFile(Filename);
  316.   PlayingIndex := Listbox1.Itemindex;
  317.   If PlayingIndex > 0 then
  318.     SpeedButton6.Enabled := True
  319.   else
  320.     SpeedButton6.Enabled := False;
  321.   if PlayingIndex < Listbox1.Items.Count -1 then
  322.     SpeedButton7.Enabled := True
  323.   else
  324.     SpeedButton7.Enabled := False;
  325. end;
  326. procedure TForm1.PlayFile(Filename : String);
  327. Begin
  328.   FilterGraph1.ClearGraph;
  329.   // --------------------------------------------------------------------------------------
  330.   // This is a workaround the problem that we don't always get the EC_CLOCK_CHANGED.
  331.   // and because we didn't get the EC_CLOCK_CHANGED the DSTrackbar and DSVideoWindowEx1
  332.   // didn't got reassigned and that returned in misfuntions.
  333.   FilterGraph1.Active := False;
  334.   FilterGraph1.Active := True;
  335.   // --------------------------------------------------------------------------------------
  336.   FilterGraph1.RenderFile(FileName);
  337.   SoundLevel.Position := FilterGraph1.Volume;
  338.   FilterGraph1.Play;
  339.   CheckColorControlSupport;
  340. End;
  341. procedure TForm1.FilterGraph1GraphComplete(sender: TObject;
  342.   Result: HRESULT; Renderer: IBaseFilter);
  343. Var
  344.   Filename : String;
  345. begin
  346.   If Playingindex < Listbox1.Items.Count -1 then
  347.   Begin
  348.     Listbox1.ItemIndex := ListBox1.ItemIndex +1;
  349.     PlayListItem := pPlayListItem(Listbox1.Items.Objects[Listbox1.ItemIndex]);
  350.     Filename := PlayListItem^.Path;
  351.     If Filename[Length(Filename)] <> '' then
  352.       Filename := Filename + '';
  353.     Filename := Filename + PlayListItem^.Filename;
  354.     PlayFile(Filename);
  355.     PlayingIndex := Listbox1.Itemindex;
  356.   End;
  357.   If PlayingIndex > 0 then
  358.     SpeedButton6.Enabled := True
  359.   else
  360.     SpeedButton6.Enabled := False;
  361.   if PlayingIndex < Listbox1.Items.Count -1 then
  362.     SpeedButton7.Enabled := True
  363.   else
  364.     SpeedButton7.Enabled := False;
  365. end;
  366. procedure TForm1.Stretched1Click(Sender: TObject);
  367. begin
  368.   DSVideoWindowEx1.AspectRatio := rmStretched;
  369. end;
  370. procedure TForm1.LetterBox1Click(Sender: TObject);
  371. begin
  372.   DSVideoWindowEx1.AspectRatio := rmLetterBox;
  373. end;
  374. procedure TForm1.Crop1Click(Sender: TObject);
  375. begin
  376.   DSVideoWindowEx1.AspectRatio := rmCrop;
  377. end;
  378. procedure TForm1.SpeedButton13Click(Sender: TObject);
  379. begin
  380.   If Not DSVideoWindowEx1.DesktopPlayback then
  381.   Begin
  382.     If Combobox1.ItemIndex > 0 then
  383.       DSVideoWindowEx1.StartDesktopPlayback(Screen.Monitors[Combobox1.Itemindex -1])
  384.     else
  385.       DSVideoWindowEx1.StartDesktopPlayback;
  386.   End
  387.   else
  388.     DSVideoWindowEx1.NormalPlayback;
  389. end;
  390. procedure TForm1.PopupMenu1Popup(Sender: TObject);
  391. begin
  392.   FullScreen1.Checked := DSVideoWindowEx1.FullScreen;
  393. end;
  394. procedure TForm1.SpeedButton7Click(Sender: TObject);
  395. Var
  396.   Filename : String;
  397. begin
  398.   If Playingindex < Listbox1.Items.Count -1 then
  399.   Begin
  400.     Listbox1.ItemIndex := ListBox1.ItemIndex +1;
  401.     PlayListItem := pPlayListItem(Listbox1.Items.Objects[Listbox1.ItemIndex]);
  402.     Filename := PlayListItem^.Path;
  403.     If Filename[Length(Filename)] <> '' then
  404.       Filename := Filename + '';
  405.     Filename := Filename + PlayListItem^.Filename;
  406.     PlayFile(Filename);
  407.     PlayingIndex := Listbox1.Itemindex;
  408.   End;
  409.   If PlayingIndex > 0 then
  410.     SpeedButton6.Enabled := True
  411.   else
  412.     SpeedButton6.Enabled := False;
  413.   if PlayingIndex < Listbox1.Items.Count -1 then
  414.     SpeedButton7.Enabled := True
  415.   else
  416.     SpeedButton7.Enabled := False;
  417. end;
  418. procedure TForm1.SpeedButton6Click(Sender: TObject);
  419. Var
  420.   Filename : String;
  421. begin
  422.   If Playingindex > 0 then
  423.   Begin
  424.     Listbox1.ItemIndex := ListBox1.ItemIndex -1;
  425.     PlayListItem := pPlayListItem(Listbox1.Items.Objects[Listbox1.ItemIndex]);
  426.     Filename := PlayListItem^.Path;
  427.     If Filename[Length(Filename)] <> '' then
  428.       Filename := Filename + '';
  429.     Filename := Filename + PlayListItem^.Filename;
  430.     PlayFile(Filename);
  431.     PlayingIndex := Listbox1.Itemindex;
  432.   End;
  433.   If PlayingIndex > 0 then
  434.     SpeedButton6.Enabled := True
  435.   else
  436.     SpeedButton6.Enabled := False;
  437.   if PlayingIndex < Listbox1.Items.Count -1 then
  438.     SpeedButton7.Enabled := True
  439.   else
  440.     SpeedButton7.Enabled := False;
  441. end;
  442. procedure TForm1.Clear1Click(Sender: TObject);
  443. begin
  444.   FilterGraph1.Stop;
  445.   FilterGraph1.ClearGraph;
  446.   FilterGraph1.Active := False;
  447.   Listbox1.Items.Clear;
  448. end;
  449. procedure TForm1.Exit2Click(Sender: TObject);
  450. begin
  451.   Close;
  452. end;
  453. procedure TForm1.FilterGraph1DSEvent(sender: TComponent; Event, Param1,
  454.   Param2: Integer);
  455. begin
  456.   Memo1.Lines.Add(GetEventCodeDef(event));
  457. end;
  458. procedure TForm1.DSVideoWindowEx1OverlayVisible(Sender: TObject;
  459.   Visible: Boolean);
  460. begin
  461.   If Visible then
  462.     Panel2.Color := DSVideoWindowEx1.ColorKey
  463.   else
  464.     Panel2.Color := DSVideoWindowEx1.Color;
  465. end;
  466. end.