Zitat von
dizzy:
Und wie sie das können
Nimm mal nen TMediaPlayer und nen Button. Dann wähle den Button als Display, und ab dafür. --> GEHT!
Ein Button ist nämlich ein WinControl, genau so wie ein Fenster, genau so wie ein Panel!
Oh, wow, das habe ich gar nicht gewusst.
Zitat von
memphis:
mir fällt gerade noch was ein? hast du das Flag für den exclusiven Modus gesetzt? Heißt glaub ich DDSCL_EXCLUSIVE oder so in der Art. Wenn ja, lösch es einfach mal... man kann nämlich wenn ich mich nicht ganz iree DirectDraw nur bei Fullscreen in den exclusiven Modus setzte.
Vieleicht hilfts...
Yo, <DDSLC_EXCLUSIVE> und <DDSCL_FULLSCREEN> müssen immer zusammen verwendet werden. Ich habe Euch jetzt mal die wichtigen Passagen meines Sourcecodes gepostet. Die Methode <init_DirectX> schlägt bei <SetCooperativeLevel> jedes Mal fehl. Übergeben wird in <display> ein TPanel-Objekt. Wie ihr sehen könnt, habe ich mit den Flags bereits herumgespielt, aber irgendwie komm' ich nicht auf die richtige Kombination.
Der Fullscreen-Modus soll NICHT gesetzt werden, ergo darf auch das <DDSCL_EXCLUSIVE>-Flag nicht gesetzt sein. Sorry, ich dokumentiere meinen Source immer in englisch. So, wie unten gepostet, funktioniert es leider NICHT.
Seht's Euch mal bitte an.
Delphi-Quellcode:
type
TLevelMap = class
private
// Display (panel, form, whatever) to be used as canvas for level
display : HWND;
// Direct Draw Object
IDD : IDirectDraw;
// front buffer surface for Direct-X
Primary : IDirectDrawSurface;
// back buffer for Direct-X
Back : IDirectDrawSurface;
public
constructor create(const display : THandle);
function Init_DirectX : boolean;
end;
implementation
constructor TLevelMap.create;
begin
inherited create;
self.display:= display;
IDD:= NIL;
Primary:= NIL;
Back:= NIL;
end;
function TLevelMap.Init_DirectX;
var ddsd: TDDSurfaceDesc;
ddscaps: TDDSCaps;
begin
result:=false;
// Try to initialize direct draw object
if not (DirectDrawCreate(nil,IDD,nil)=DD_OK) then exit;
// Set Cooperative Level to flags mentioned below
{ if not (IDD.SetCooperativeLevel(Display,DDSCL_ALLOWREBOOT or
DDSCL_EXCLUSIVE or
DDSCL_FULLSCREEN or
DDSCL_ALLOWMODEX)=DD_OK) then exit;
}
if not (IDD.SetCooperativeLevel(Display, //DDSCL_ALLOWREBOOT or
// DDSCL_EXCLUSIVE or
// DDSCL_FULLSCREEN { or
DDSCL_NORMAL or
DDSCL_NOWINDOWCHANGES or
DDSCL_ALLOWMODEX)=DD_OK) then exit;
// initialize surfaceDesc
with ddsd do
begin
dwSize:=sizeof(ddsd);
dwFlags:=DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
ddsCaps.dwCaps:=DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;
dwBackBufferCount:=1;
end;
// create front suface and attach back surface to it
if not (IDD.CreateSurface(ddsd,Primary,nil)=DD_OK) then exit;
ddscaps.dwCaps:=DDSCAPS_BACKBUFFER or DDSCAPS_VIDEOMEMORY;
if not (Primary.GetAttachedSurface(ddscaps,Back)=DD_OK) then exit;
result:=true;
end;