Einzelnen Beitrag anzeigen

Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#9

Re: Direct Draw in einem geschlossenen Bereich

  Alt 24. Aug 2004, 08:14
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;
How much wood would a wood-chuck chuck if a wood-chuck would chuck wood?
Check this out.
DANNYBOY
  Mit Zitat antworten Zitat