Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#7

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?

  Alt 27. Jan 2007, 18:47
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ß
  Mit Zitat antworten Zitat