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

Delphi控件源码

开发平台:

Delphi

  1. unit Editor;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, DSUTIL, DirectShow9, ComCtrls, DSPack, Menus, BaseFilterEditor;
  6. type
  7.   TFormEditor = class(TForm)
  8.     PageControl1: TPageControl;
  9.     Selector: TTabSheet;
  10.     Label1: TLabel;
  11.     Label2: TLabel;
  12.     cbCategories: TComboBox;
  13.     lbFilters: TListBox;
  14.     Interfaces: TListBox;
  15.     Label3: TLabel;
  16.     FilterGraph: TFilterGraph;
  17.     Filter: TFilter;
  18.     Pins: TTabSheet;
  19.     lbPins: TListBox;
  20.     Label4: TLabel;
  21.     PinInterfaces: TListBox;
  22.     Label5: TLabel;
  23.     MediaTypes: TListBox;
  24.     PopupMenu: TPopupMenu;
  25.     PropertyPage: TMenuItem;
  26.     VFWDisplay: TMenuItem;
  27.     VFWFormat: TMenuItem;
  28.     VFWSource: TMenuItem;
  29.     VFWConfig: TMenuItem;
  30.     VFWCapture: TMenuItem;
  31.     Config1: TMenuItem;
  32.     VFWAbout: TMenuItem;
  33.     PinMenu: TPopupMenu;
  34.     PinProperty: TMenuItem;
  35.     procedure cbCategoriesChange(Sender: TObject);
  36.     procedure lbFiltersClick(Sender: TObject);
  37.     procedure FormShow(Sender: TObject);
  38.     procedure PinsShow(Sender: TObject);
  39.     procedure lbPinsClick(Sender: TObject);
  40.     procedure InterfacesDblClick(Sender: TObject);
  41.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  42.     procedure PinInterfacesDblClick(Sender: TObject);
  43.     procedure PopupMenuPopup(Sender: TObject);
  44.     procedure PropertyPageClick(Sender: TObject);
  45.     procedure VFWDisplayClick(Sender: TObject);
  46.     procedure VFWFormatClick(Sender: TObject);
  47.     procedure VFWSourceClick(Sender: TObject);
  48.     procedure Config1Click(Sender: TObject);
  49.     procedure VFWAboutClick(Sender: TObject);
  50.     procedure PinMenuPopup(Sender: TObject);
  51.     procedure PinPropertyClick(Sender: TObject);
  52.   public
  53.     SysDevEnum: TSysDevEnum;
  54.     PinList: TPinList;
  55.     constructor Create(AOwner: TComponent); override;
  56.     destructor  Destroy; override;
  57.     procedure FindFilterInterfaces;
  58.   end;
  59.   TDSitf = record
  60.     name : string;
  61.     itf  : TGUID;
  62.   end;
  63. var
  64.   FormEditor: TFormEditor;
  65. implementation
  66. uses activex, comobj;
  67. {$R *.dfm}
  68.   constructor TFormEditor.Create(AOwner: TComponent);
  69.   begin
  70.     inherited Create(AOwner);
  71.     SysDevEnum := TSysDevEnum.Create;
  72.     PinList:= TPinList.Create;
  73.   end;
  74.   destructor  TFormEditor.Destroy;
  75.   begin
  76.     SysDevEnum.Free;
  77.     PinList.Free;
  78.     inherited destroy;
  79.   end;
  80.   procedure TFormEditor.cbCategoriesChange(Sender: TObject);
  81.   var i: integer;
  82.   begin
  83.     lbFilters.Clear;
  84.     Interfaces.Clear;
  85.     SysDevEnum.SelectIndexCategory(cbCategories.ItemIndex);
  86.     if SysDevEnum.CountFilters > 0 then
  87.       for i := 0 to SysDevEnum.CountFilters - 1 do
  88.         lbFilters.Items.Add(SysDevEnum.Filters[i].FriendlyName);
  89.   end;
  90.   procedure TFormEditor.lbFiltersClick(Sender: TObject);
  91.   begin
  92.     Filter.BaseFilter.Moniker := SysDevEnum.GetMoniker(lbFilters.ItemIndex);
  93.     IFilter(Filter).NotifyFilter(foRefresh);
  94.     FindFilterInterfaces;
  95.   end;
  96.   procedure TFormEditor.FormShow(Sender: TObject);
  97.   var
  98.     i, j: integer;
  99.     AMoniker, MyMoniker: IMoniker;
  100.     PropBag: IPropertyBag;
  101.     AVariant: OleVariant;
  102.     CLSID: TGUID;
  103.     Found: boolean;
  104.   begin
  105.     for i := 0 to SysDevEnum.CountCategories - 1 do
  106.       cbCategories.Items.Add(SysDevEnum.Categories[i].FriendlyName);
  107.     Found := false;
  108.     j := 0;
  109.     MyMoniker := Filter.BaseFilter.Moniker;
  110.     if MyMoniker = nil then exit;
  111.     MyMoniker.BindToStorage(nil,nil,IPropertyBag, PropBag);
  112.     if PropBag.Read('CLSID',AVariant,nil) = S_OK then
  113.          CLSID := StringToGUID(AVariant)
  114.     else CLSID := GUID_NULL;
  115.     for i := 0 to SysDevEnum.CountCategories - 1 do
  116.     begin
  117.       SysDevEnum.SelectIndexCategory(i);
  118.       if SysDevEnum.CountFilters > 0 then
  119.         for j := 0 to SysDevEnum.CountFilters - 1 do
  120.         begin
  121.           if IsEqualGUID(CLSID, SysDevEnum.Filters[j].CLSID) then
  122.             begin
  123.               AMoniker := SysDevEnum.GetMoniker(j);
  124.               Found := AMoniker.IsEqual(MyMoniker) = S_OK;
  125.               AMoniker := nil;
  126.             end;
  127.           if Found then Break;
  128.         end;
  129.       if Found then
  130.       begin
  131.         cbCategories.ItemIndex := i;
  132.         cbCategoriesChange(nil);
  133.         lbFilters.ItemIndex := j;
  134.         lbFiltersClick(nil);
  135.         break;
  136.       end;
  137.     end;
  138.     PropBag := nil;
  139.     MyMoniker := nil;
  140.   end;
  141. procedure TFormEditor.FindFilterInterfaces;
  142. var
  143.   i: integer;
  144.   unk: IUnknown;
  145. begin
  146.   Interfaces.Clear;
  147.   if lbFilters.ItemIndex <> -1 then
  148.   try
  149.     with Filter.BaseFilter.CreateFilter do
  150.       for i := 0 to length(DSItfs)-1 do
  151.         if Succeeded(QueryInterface(DSItfs[i].itf, unk)) then
  152.           Interfaces.Items.Add(DSItfs[i].name);
  153.   finally
  154.     unk := nil;
  155.   end
  156. end;
  157. procedure TFormEditor.PinsShow(Sender: TObject);
  158. var
  159.   i: integer;
  160.   PinInfo: TPinInfo;
  161.   BaseF: IBaseFilter;
  162. begin
  163.   lbPins.Clear;
  164.   PinInterfaces.Clear;
  165.   MediaTypes.Clear;
  166.   if Succeeded(Filter.QueryInterface(IBaseFilter, BaseF)) then
  167.   begin
  168.     PinList.Assign(BaseF);
  169.     if PinList.Count > 0 then
  170.       for i := 0 to PinList.Count - 1 do
  171.       begin
  172.         PinInfo := PinList.PinInfo[i];
  173.         case PinInfo.dir of
  174.           PINDIR_INPUT  : lbPins.Items.Add(format('%s (input)',[PinInfo.achName]));
  175.           PINDIR_OUTPUT : lbPins.Items.Add(format('%s (output)',[PinInfo.achName]));
  176.         end;
  177.         PinInfo.pFilter := nil;
  178.       end;
  179.     BaseF := nil;
  180.   end;
  181. end;
  182. procedure TFormEditor.lbPinsClick(Sender: TObject);
  183. var
  184.   i: integer;
  185.   unk: IUnknown;
  186.   EnumMT : TEnumMediaType;
  187. begin
  188.   PinInterfaces.Clear;
  189.   if lbPins.ItemIndex <> -1 then
  190.   try
  191.     with PinList.Items[lbPins.ItemIndex] do
  192.       for i := 0 to length(DSItfs)-1 do
  193.         if Succeeded(QueryInterface(DSItfs[i].itf, unk)) then
  194.           PinInterfaces.Items.Add(DSItfs[i].name);
  195.   finally
  196.     unk := nil;
  197.   end;
  198.   MediaTypes.Clear;
  199.   if lbPins.ItemIndex <> -1 then
  200.   begin
  201.     EnumMT:= TEnumMediaType.Create(PinList.Items[lbPins.ItemIndex]);
  202.     try
  203.       if EnumMT.Count > 0 then
  204.         for i := 0 to EnumMT.Count - 1 do
  205.           MediaTypes.Items.Add(EnumMt.MediaDescription[i]);
  206.     finally
  207.       EnumMT.Free;
  208.     end;
  209.   end;
  210. end;
  211. procedure TFormEditor.InterfacesDblClick(Sender: TObject);
  212. var AFilter: IBaseFilter;
  213. begin
  214.   Filter.QueryInterface(IBaseFilter, AFilter);
  215.   if Interfaces.ItemIndex <> -1 then
  216.   if Interfaces.Items.Strings[Interfaces.ItemIndex] = 'ISpecifyPropertyPages' then
  217.     ShowFilterPropertyPage(Self.Handle, AFilter);
  218.   AFilter := nil;
  219. end;
  220. procedure TFormEditor.FormCloseQuery(Sender: TObject;
  221.   var CanClose: Boolean);
  222. begin
  223.   FilterGraph.ClearGraph;
  224.   FilterGraph.Active := false;
  225. end;
  226. procedure TFormEditor.PinInterfacesDblClick(Sender: TObject);
  227. begin
  228.   if PinInterfaces.ItemIndex <> -1 then
  229.   if PinInterfaces.Items.Strings[PinInterfaces.ItemIndex] = 'ISpecifyPropertyPages' then
  230.     ShowPinPropertyPage(Self.Handle, PinList.Items[lbPins.ItemIndex]);
  231. end;
  232. procedure TFormEditor.PopupMenuPopup(Sender: TObject);
  233. var AFilter: IBaseFilter;
  234. begin
  235.   Filter.QueryInterface(IBaseFilter, AFilter);
  236.   PopupMenu.Items.Items[0].Enabled := false;
  237.   PopupMenu.Items.Items[1].Items[0].Enabled := false;
  238.   PopupMenu.Items.Items[1].Items[1].Enabled := false;
  239.   PopupMenu.Items.Items[1].Items[2].Enabled := false;
  240.   PopupMenu.Items.Items[2].Items[0].Enabled := false;
  241.   PopupMenu.Items.Items[2].Items[1].Enabled := false;
  242.   if lbFilters.ItemIndex = -1 then exit;
  243.   if HaveFilterPropertyPage(AFilter, ppDefault)       then PopupMenu.Items.Items[0].Enabled := true;
  244.   if HaveFilterPropertyPage(AFilter, ppVFWCapFormat)  then PopupMenu.Items.Items[1].Items[0].Enabled := true;
  245.   if HaveFilterPropertyPage(AFilter, ppVFWCapSource)  then PopupMenu.Items.Items[1].Items[1].Enabled := true;
  246.   if HaveFilterPropertyPage(AFilter, ppVFWCapDisplay) then PopupMenu.Items.Items[1].Items[2].Enabled := true;
  247.   if HaveFilterPropertyPage(AFilter, ppVFWCompConfig) then PopupMenu.Items.Items[2].Items[0].Enabled := true;
  248.   if HaveFilterPropertyPage(AFilter, ppVFWCompAbout)  then PopupMenu.Items.Items[2].Items[1].Enabled := true;
  249.   AFilter := nil;
  250. end;
  251. procedure TFormEditor.PropertyPageClick(Sender: TObject);
  252. var AFilter: IBaseFilter;
  253. begin
  254.   Filter.QueryInterface(IBaseFilter, AFilter);
  255.   ShowFilterPropertyPage(Self.Handle, AFilter, ppDefault);
  256.   AFilter := nil;
  257. end;
  258. procedure TFormEditor.VFWDisplayClick(Sender: TObject);
  259. var AFilter: IBaseFilter;
  260. begin
  261.   Filter.QueryInterface(IBaseFilter, AFilter);
  262.   ShowFilterPropertyPage(Self.Handle, AFilter, ppVFWCapDisplay);
  263.   AFilter := nil;
  264. end;
  265. procedure TFormEditor.VFWFormatClick(Sender: TObject);
  266. var AFilter: IBaseFilter;
  267. begin
  268.   Filter.QueryInterface(IBaseFilter, AFilter);
  269.   ShowFilterPropertyPage(Self.Handle, AFilter, ppVFWCapFormat);
  270.   AFilter := nil;
  271. end;
  272. procedure TFormEditor.VFWSourceClick(Sender: TObject);
  273. var AFilter: IBaseFilter;
  274. begin
  275.   Filter.QueryInterface(IBaseFilter, AFilter);
  276.   ShowFilterPropertyPage(Self.Handle, AFilter, ppVFWCapSource);
  277.   AFilter := nil;
  278. end;
  279. procedure TFormEditor.Config1Click(Sender: TObject);
  280. var AFilter: IBaseFilter;
  281. begin
  282.   Filter.QueryInterface(IBaseFilter, AFilter);
  283.   ShowFilterPropertyPage(Self.Handle, AFilter, ppVFWCompConfig);
  284.   AFilter := nil;
  285. end;
  286. procedure TFormEditor.VFWAboutClick(Sender: TObject);
  287. var AFilter: IBaseFilter;
  288. begin
  289.   Filter.QueryInterface(IBaseFilter, AFilter);
  290.   ShowFilterPropertyPage(Self.Handle, AFilter, ppVFWCompAbout);
  291.   AFilter := nil;
  292. end;
  293. procedure TFormEditor.PinMenuPopup(Sender: TObject);
  294. begin
  295.   if lbPins.ItemIndex = -1 then abort;
  296. end;
  297. procedure TFormEditor.PinPropertyClick(Sender: TObject);
  298. begin
  299.   ShowPinPropertyPage(Self.Handle, PinList.Items[lbPins.ItemIndex]);
  300. end;
  301. end.