Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi BassVis: WinAmpDummyWindow als Child in Form setzen? (https://www.delphipraxis.net/85222-bassvis-winampdummywindow-als-child-form-setzen.html)

E307 27. Jan 2007 16:10


BassVis: WinAmpDummyWindow als Child in Form setzen?
 
Hallo! Seit einiger Zeit beschäftige ich mich mit dem BassVis AddOn der Bass.dll. Eigentlich funktioniert alles, nur hätte ich das WinAmp Dummy- Window, das die Bass_Vis.dll erzeugt gerne in mein Formular eingebunden. Alle Versuche schlugen bisher fehl. (Dieses Thema) Hat jemand eine Idee, wie ich das Fenster doch noch als Child in ein Form meines Projektes einbinden kann?

--------------------
Kleines Demoprojekt:
Download
--------------------

Die Muhkuh 27. Jan 2007 16:18

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
Wenn ich das richtige verstehe, willst Du eine Form (WinAmpDummyWindow) in Deine Hauptform reinpflanzen?

Wenn ja, wäre Hier im Forum suchenMDI, Delphi-Referenz durchsuchenMDI ein Stichwort.

E307 27. Jan 2007 16:51

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
Zitat:

Zitat von Die Muhkuh
Wenn ich das richtige verstehe, willst Du eine Form (WinAmpDummyWindow) in Deine Hauptform reinpflanzen?

Wenn ja, wäre Hier im Forum suchenMDI, Delphi-Referenz durchsuchenMDI ein Stichwort.

Das Problem daran ist, dass das WinAmpDummyWindow zwar ein Fenster ist (IsWindow(Handle)=true), aber ich eben nur das Handle dieses Fensters kenne, da es von einer DLL erzeugt wird.

E307 27. Jan 2007 17:21

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
:coder2: :bounce1: Heureka!
Delphi-Quellcode:
wnd:=GetWindow(Form1.Bass.WinAmpHandle,GW_HWNDPREV);
Windows.SetParent(wnd, WinVisForm.Handle);
WinVisForm.Show;
Damit wird die Visualisierung Child von WinVisForm. So. Jetzt das Problem: Die Visualisierung (WinAmpDummyWindow) verschwindet komplett(im WinVisForm). Wie kann ich sie im WinVisForm anzeigen lassen?

EWeiss 27. Jan 2007 17:51

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
Zitat:

Zitat von E307
:coder2: :bounce1: Heureka!
Delphi-Quellcode:
wnd:=GetWindow(Form1.Bass.WinAmpHandle,GW_HWNDPREV);
Windows.SetParent(wnd, WinVisForm.Handle);
WinVisForm.Show;
Damit wird die Visualisierung Child von WinVisForm. So. Jetzt das Problem: Die Visualisierung (WinAmpDummyWindow) verschwindet komplett(im WinVisForm). Wie kann ich sie im WinVisForm anzeigen lassen?

weiss nicht was du für ein problem hast. ?
Ich habe extra für verschiedene sprachen samples geschrieben.

Schau dir dafür mal die frmMain im Vb Sample im Texteditor an.
Ist einfach das zu übersetzen.

Du mußt auf jedenfall (Thread) bedingt ..
die abfrage des hwnd in einer schleife ermitteln.

edit:
Zitat:

HVIS BASS_WINAMPVIS_CreateVis(
char *f
DWORD module
DWORD flags
DWORD AppHandle
BOOL AppHDC
int VisCounter
);
AppHDC muss auf jedenfall beim starten des Winamp5-plugin auf true gesetzt werden
AppHandle ist das handle deiner Picpox , frame oder was auch immer du als Container(muss über ein Hwnd verfügen) verwendest.

Zusätzlich hast du noch die API MoveWindow vergessen die kommt nach setparent.
MoveWindow(wnd,0,0,formweite,formhöhe,true)

gruss

E307 27. Jan 2007 18:22

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
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.

EWeiss 27. Jan 2007 18:47

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
Zitat:

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
Delphi-Quellcode:
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
Delphi-Quellcode:
AmpMagnet:= TJvFormMagnet.Create(TComponent(Bass.WinAmpHandle));
da mußt du selbst mal schaun ...

gruß

E307 27. Jan 2007 19:31

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
Mit der neuen DLL sieht das Ganze schon viel besser aus! Aber das Vis-Fenster in ein Form meiner Anwendung zu integrieren klappt immernochnicht! Woran kann die Zugriffsverletzung bei der Umwandlung in TWincontrol liegen?

EWeiss 28. Jan 2007 08:37

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
Zitat:

Zitat von E307
Mit der neuen DLL sieht das Ganze schon viel besser aus! Aber das Vis-Fenster in ein Form meiner Anwendung zu integrieren klappt immernochnicht! Woran kann die Zugriffsverletzung bei der Umwandlung in TWincontrol liegen?

KA..
Nur nochmal zur info.
Nur Winamp5/Sonique Plugins lassen sich in eigene Container verschieben/visualisieren.
In deinen Sample ist AVS ein Winamp2x Plugin das funktioniert nicht, wird also nur in seinen eigenen Fenster angezeigt.

Schau dir doch nochmal das Sample WinampTest von Delphi an.
Da ist alles drin bis auf die Visualisierung im eigenen Fenster.

Werde das die Tage mal anpassen damit auch das funktioniert.

gruss

EWeiss 28. Jan 2007 10:38

Re: BassVis: WinAmpDummyWindow als Child in Form setzen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also bei mir funktioniert das ohne probleme

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz