Zitat:
Naja, Du hats ja absolute nichts unternommen, um die Bitmap mit dem erzeugten device context zu verbinden. Sieh Dir mal die SelectObject
API Funktion an. Wichtig: Speicher den Rückgabewert der Funktion und selektiere diesen wieder per SelectObject in den glDC bevor Du den zerstörst, sonst ist deine Bitmap futsch.
Du meinst sicherlich OldBmp := SelectObject(… Ich habe festgestellt das meistens das OldBitmap 0 ist, es ist also nicht sicher auf der weise die Rückgabe auszuwerten.
Das ist ja mein Problem
Was soll ich unternehmen um das
DC mit dem device context zu verbinden?
Das Bitmap kann nicht zerstört werden es wird von außen zugeführt und ist solange gültig wie die Anwendung läuft.
Das einzige was verloren geht ist das
DC.. nach jedem
Delphi-Quellcode:
glFlush;
SwapBuffers(glDC);
Ich könnte vor glClearColor das
DC neu zuweisen und selektieren.. was anderes fällt mir da jetzt nicht ein.
Delphi-Quellcode:
glDC := CreateCompatibleDc(0);
SelectObject(glDC, MeinÜbergebenesBitmap);
PS:
Bitmap erstellen..
Delphi-Quellcode:
if gBin.UsePlugin then
begin
sFile := SpriteResPath + 'plugin.png';
if FileExists(sFile) then
gSprDisplayC.GI_SetFromFile(HSprDisplayC, PWideChar(sFile))
end
else
gSprDisplayC.GI_SetFromFile(HSprDisplayC, gG.PhoneBackground);
Dieses wird in meiner Lib intern gespeichert und kann damit zurückgeholt werden..
Mein Container und dessen
Handle mit dem das Bitmap erstellt wurde. (Typ Bitmap)
gSprDisplayC.GI_GetProperty(HSprDisplayC, GI_BITMAP);
Jetzt übergeben ich das an meinen BassVis Wrapper..
Delphi-Quellcode:
mExec.Pluginfile := PAnsiChar(Filename);
mExec.SON_ConfigFile := PAnsiChar(PluginDir + 'vis.ini');
mExec.SON_UseOpenGL := true;
mExec.SON_ParentHandle := HSprDisplayC;
mExec.SON_ViewportWidth := 1024;
mExec.SON_ViewportHeight := 800;
mExec.SON_ShowPrgBar := false;
mExec.SON_ShowFPS := false;
mExec.SON_UseCover := false;
mExec.SON_PaintHandle := gSprDisplayC.GI_GetProperty(HSprDisplayC, GI_BITMAP); // hier das Bitmap
mExec.Left := 0;
mExec.Top := 0;
mExec.Width := Rect.Right;
mExec.Height := Rect.Bottom;
Delphi-Quellcode:
Base.VisHandle := BASSSoVisAPI.SONIQUEVIS_CreateVis(Param^.PluginFile,
Param^.SON_ConfigFile,
Param^.Left,
Param^.Top,
Param^.Width,
Param^.Height,
Param^.SON_ParentHandle,
Param^.SON_ViewportWidth,
Param^.SON_ViewportHeight,
Param^.SON_ShowPrgBar,
Param^.SON_ShowFPS,
Param^.SON_UseCover,
Param^.SON_PaintHandle,
Param^.SON_UseOpenGL);
In der
DLL erstelle ich das
DC
Delphi-Quellcode:
function TBASSSoVis.IntMeinGL(WinHandle: HWND): BOOL;
var
IntI, IntJ: integer;
begin
// OpenGL-Funtionen initialisieren
Result := False;
try
LastWidth := 0;
LastHeight := 0;
if not InitOpenGL
then
Halt;
glDC := CreateCompatibleDc(GetDC(WinHandle));
// hier mein DC
nur damit ich über CreateRenderingContext die richtigen Flags bekomme.
Und nun beim rendern vor glClearColor..
Delphi-Quellcode:
if VisRenderThread.PaintHandle <> 0 then
begin
glDC := CreateCompatibleDc(GetDC(VisRenderThread.ParentHandle));
SelectObject(glDC, VisRenderThread.PaintHandle);
end;
Was wird gerendert? Nichts!
Nebenbei gelöscht werden darf das Bitmap in meinem Wrapper nicht der ist nicht der Eigentümer davon das ist mein Container mit dem es erstellt wurde
der gibt das beim beenden wieder frei.
gruss