Zitat von
E307:
Die WinAmp_ Visualisierung startet und funktioniert auch super! Das Problem ist aber, dass sie in einem extra- fenster geöffnet wird, über das der Rest des Players keine Kontrolle hat. (Kein änderbares Design, keine Speziellen Einstellungen des Players). Deshalb setze ich das Fenster mit SetParent() in ein Delphi-Formular. Dort wird die Visualisierung dann aber nicht angezeigt! Das ist das Problem.
Logisch!
1. Man nehme Winamp5 Plugins und keine Winamp2x
2. Man nehme die neue Bass_Vis 2.3.0.3
Die Version die du benutzt hat einen fehler bei Bass_Free welcher gefixt wurde.
Habe mir dein Sample mal angeschaut
und auf die schnelle abgeändert Bass_Vis 2.3.0.2 die du benutzt.
Setze hier mal nen Breakpoint
if hWndGen <> 0 then
und prüfe ob mehr als 0
Delphi-Quellcode:
procedure TBassObject.StartWinVis(ListID: Integer; FrmHandle: THandle);
Var
ISPlaying: DWORD;
wndChild: Hwnd;
begin
// check if we have something selected on the list
if (ListID >= 0) then
begin
VisTimer.Enabled := False;
InfoTimer.Enabled := False;
if hWndWinAMP <> 0 then
begin
// free, in case there was one loaded before
BASS_WINAMPVIS_Free(vischan);
// Wait a little to VisFree
Sleep(200);
end;
// create our new plugin
vischan := BASS_WINAMPVIS_CreateVis(PChar(vislist.Strings[ListID]), StrToInt(modlist.Strings[ListID]), 0, FrmHandle, true);
if vischan <> 0 then
Begin
// Get HWND from Winamp Dummy Window
repeat
hWndWinAMP := BASS_WINAMPVIS_GetAmpHwnd;
Until hWndWinAMP <> 0;
//Give D3D Plugin time for Render
repeat
Sleep(200);
hWndGen := BASS_WINAMPVIS_GetGenHwnd;
inc(RCounter);
//lblCounter.Caption := IntToStr(RCounter);
until (hWndGen <> 0) OR (RCounter = 32000); //ms
if hWndGen <> 0 then
begin
wndChild:=GetWindow(hWndGen ,GW_CHILD);
Windows.SetParent(wndChild, FrmHandle);
Windows.MoveWindow(wndChild,0,0,240,320,True);
// SendMessage Playing Status
SendMessage(hWndWinAMP, WM_COMMAND, WINAMP_BUTTON2, 0);
// Check IsPlaying
ISPlaying := SendMessage(hWndWinAMP, WM_WA_IPC, 0, IPC_ISPLAYING);
Sleep(150);
// Result 1 RenderTimer activate
if ISPlaying = 1 then
begin
InfoTimer.Enabled := True;
VisTimer.Enabled := True;
end;
end;
end;
end;
end;
allerdings hängt sich dein prog bei mir hier auf
AmpMagnet:= TJvFormMagnet.Create(TComponent(Bass.WinAmpHandle));
da mußt du selbst mal schaun ...
gruß