CreateRenderingContext..
Delphi-Quellcode:
glDC := GetDC(WinHandle);
// Renderkontext erstellen (32 Bit Farbtiefe,
// 32 Bit Tiefenpuffer, Doublebuffering)
h_RC := CreateRenderingContext(glDc,
[opDoubleBuffered], 24, 32, 0, 0, 0, 0);
// Erstellten Renderkontext aktivieren
ActivateRenderingContext(glDc, h_RC, True);
gezeichnet wird so..
Delphi-Quellcode:
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
EnterCriticalSection(CritSect);
try
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, StretchWidth, StretchHeight, GL_BGRA,
GL_UNSIGNED_BYTE, VisInfo^.VisBuf);
finally
LeaveCriticalSection(CritSect);
end;
glColor4f(1, 1, 1, 1);
glEnable(GL_TEXTURE_2D);
if VisTexture <> 0 then
glBindTexture(GL_TEXTURE_2D, VisTexture);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0);
glVertex2f(0.0, 0.0);
glTexCoord2d(0.0, 1.0);
glVertex2f(0.0, LastHeight);
glTexCoord2d(1.0, 1.0);
glVertex2f(LastWidth, LastHeight);
glTexCoord2d(1.0, 0.0);
glVertex2f(LastWidth, 0.0);
glEnd();
if length(BassSoInfo.SongTitle) > 0 then
begin
BassSoVis.SongRender;
if SON_ShowFPS then
BassSoVis.GetFramesInSec;
if SON_ShowPrgBar then
begin
SON_Current_YPos := 20;
ProgressBarRender;
end
else
SON_Current_YPos := 5;
end;
glFlush;
SwapBuffers(glDC);
end;
Bedingt durch diese Zeile teile ich dem CreateRenderingContext mit das ich auf ein Window zeichnen will das möchte ich aber nicht.
glDC := GetDC(WinHandle);
also gibt es nur die Möglichkeit das
DC auf andere weise zu erstellen.
Über...
Delphi-Quellcode:
glDC := CreateCompatibleDc(0);
SelectObject(glDC, MeinÜbergebenesBitmap);
Sollte stimmen das Problem ist nur es rendert nicht.
In der Function CreateRenderingContext wird dann abhängig von der Erstellung des
DC (MemoryDC, WindowDc.. usw..) das entsprechende Flag gesetzt.
Delphi-Quellcode:
if GL_LibHandle =
nil then
InitOpenGL;
FillChar(PFDescriptor, SizeOf(PFDescriptor), 0);
with PFDescriptor
do
begin
nSize := SizeOf(PFDescriptor);
nVersion := 1;
dwFlags := PFD_SUPPORT_OPENGL;
AType := GetObjectType(
DC);
if AType = 0
then
RaiseLastOSError;
if AType
in MemoryDCs
then
dwFlags := dwFlags
or PFD_DRAW_TO_BITMAP
else
dwFlags := dwFlags
or PFD_DRAW_TO_WINDOW;
Aber wie gesagt es tut sich nichts.
Im Moment mache ich es so das ich auf das
DC meiner Haupt Anwendung zeichne und den Canvas auf die korrekte Position verschiebe.
Logischerweise ist das Fenster nicht sichtbar, es rendert zwar aber man sieht es nicht.
Deshalb wende ich einen Trick an in dem ich das darüberliegende Fenster einfach mit dem WS_EX_LAYERED Style versehe und den Alpha Kanal auf 160 einstelle.
Nur dann sind die Schriften etwas verblasst, was ich umgehen möchte indem ich direkt auf das Bitmap zeichne. (siehe Pic)
Direkt auf das Hauptfenster zeichnen Funktioniert nicht das Flackert extrem deshalb der Umweg über das Bitmap. (WM_ERASEBKGND) macht hier Probleme.
gruss