困擾很久的問題....和Propertypage有關 |
尚未結案
|
jenpeter
一般會員 發表:39 回覆:37 積分:15 註冊:2002-08-14 發送簡訊給我 |
弟用Directx 做了一個case ...是有關KTV播放器的
..此程式需做到切伴唱模式 ,我是利用呼叫系統ProPerty Page 設定的
但有一個問題很怪,就是只是只能 切換一次 後就不能切換了..
一定要重新開一次影片才能再切換一次 ,切換channel程式碼如下:
sample:SetmusicOnoff(Form1,Basefilter,True); =>伴唱(有音樂和原唱)
SetmusicOnoff(Form1,Basefilter,False); =>獨唱(沒原歌手的聲音)
ps:此程式需安裝DSPACK 2.3,將這斷程式碼加入Dsutil.pas中 Const
IID_MpegAudioDecoder : TGUID = '{CC785860-B2CA-11CE-8D2B-0000E202599C}';
type
TPropertyPageSiteObject = class(TInterfacedObject, IPropertyPageSite)
protected
{ FRefCount: Integer;
constructor Create;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;}
public
function OnStatusChange(flags: Longint): HResult; stdcall;
function GetLocaleID(out localeID: TLCID): HResult; stdcall;
function GetPageContainer(out unk: IUnknown): HResult; stdcall;
function TranslateAccelerator(msg: PMsg): HResult; stdcall;
end; procedure SetMusicOnOff(parent:integer;Filter: IBaseFilter; OnOff:boolean);
var
SpecifyPropertyPages : ISpecifyPropertyPages;
CAGUID :TCAGUID;
hr : HRESULT;
FilterGuid : TGUID;
Page : IPropertyPage;
pageSite : IPropertyPageSite ;
punk:PUnknownList;
tunk:TUnknownList;
rect:trect;
hdlg, hbutton:integer;
clname: array [0..255] of Char;
len:integer;
begin
punk:=@tunk;
pageSite:= TPropertyPageSiteObject.Create as IPropertyPageSite;
//if Filter = nil then exit;
//hr := Filter.QueryInterface(IID_ISpecifyPropertyPages, SpecifyPropertyPages);
//if hr <> S_OK then exit;
//hr := SpecifyPropertyPages.GetPages(CAGUID);
//if hr <> S_OK then exit;
//FilterGuid := CAGUID.pElems^[0];
hr := CoCreateInstance(IID_MpegAudioDecoder,
nil ,CLSCTX_INPROC_SERVER,IID_IPropertyPage,Page);
if hr <> S_OK then exit;
hr := Page.SetPageSite(pageSite);
if hr <> S_OK then exit;
hr := Filter.QueryInterface(IID_IUnknown,tUnk);
if hr <> S_OK then exit;
hr := page.SetObjects(1,punk);
if hr <> S_OK then exit;
rect.Left:=0;
rect.Right:=1;
rect.Top:=0;
rect.Bottom:=1;
hr := page.Activate(parent, rect, false);
hdlg := GetWindow(parent, GW_CHILD);
len:=255;
// hdlg := FindWindowEx(parent,hdlg,'#32770','');
while not (hdlg=0) do
begin
hDlg := GetWindow(hDlg, GW_HWNDNEXT);
getclassname(hdlg, clname, len);
if string(clname) = '#32770' then break;
end ;
if OnOff then
hButton:=FindWindowExA(hDlg,0,'Button','兩個(&O)')
else
hButton:=FindWindowExA(hDlg,0,'Button','第一個(&T)');
if hbutton<>0 then
begin
SendMessage(hButton,BM_SETCHECK,BST_CHECKED,0);
SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(hButton),BN_CLICKED),hButton);
end ; hr := Page.Apply;
Page.Deactivate;
Page.SetObjects(0,nil);
Page.SetPageSite(nil);
Page:=nil;
PageSite:=nil;; end ; /// *** CMyPropertyPageSite : IPropertyPageSite *** ///
function TPropertyPageSiteObject.OnStatusChange(flags: Longint): HResult; stdcall;
begin
Result := S_OK;
end ;
{
return S_OK;
} function TPropertyPageSiteObject.GetLocaleID(out localeID: TLCID): HResult; stdcall;
begin
localeID:=0;
result := S_OK;
end ;
{
*pLocaleID = 0;
return S_OK;
} function TPropertyPageSiteObject.GetPageContainer(out unk: IUnknown): HResult; stdcall;
begin
unk:=nil;
result := E_NOTIMPL;
end ;
|
ljy_17
一般會員 發表:0 回覆:1 積分:0 註冊:2003-03-26 發送簡訊給我 |
|
jenpeter
一般會員 發表:39 回覆:37 積分:15 註冊:2002-08-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |