Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Desktop-Overlay mit DirectX (https://www.delphipraxis.net/83125-desktop-overlay-mit-directx.html)

hugo1990 27. Dez 2006 21:46


Desktop-Overlay mit DirectX
 
Ich möchte gern ein animierten Destophintergrund haben. Dazu habe ich schon in anderen Beiträgen gelesen, dass dies mit DirectX funktionniert. Man setzt die Hintergrundfarbe des Desktops beispielsweise auf Lila und lässt dann per Overlay die entsprechende Animation über diese Farbe zeichnen. Das wäre der therotische Teil dazu, ich habe auch schon ein Beispielprogramm mit Quellcode dazu gesehn. Problem dabei ist, dass es in C++ geschrieben ist, und ich davon nicht wirklich einen Plan habe. Deshalb würde ich gern wissen, wie man das mit Delphi macht und wenn es geht mit Hilfe der DelphiX-Komponenten. Wäre sehr dankbar, wenn mir jemand denn entsprechenden Quellcode dafür geben könnte.

JamesTKirk 27. Dez 2006 22:47

Re: Desktop-Overlay mit DirectX
 
Sers!

1. Herzlich willkommen in der DP!! :thumb:

2. Endlich mal jemand, der auch an animierten Desktops interessiert ist :mrgreen:

Also ich habe vor einiger Zeit das Beispiel, das du angesprochen hast nach Delphi übersetzt, allerdings schon um einiges erweitert, so dass von der eigentlichen Funktion, ein TV Flimmern darzustellen, nichts mehr übrig ist. Weiter heißt das, dass ich die Unit mit dem Overlay in eine eigene Klasse gepackt habe und dieser Klasse beim Update des Overlays einen DC übergebe (in meinem Fall stammt er aus einem Direct3D Interface, kann aber genausogut ein CanvasDC sein), der dann auf den Desktop gezeichnet und gestreckt wird.

Ich weiß nicht, in wie weit man in DelphiX an nen DC rankommt, aber direkt von DelphiX aus VideoOverlays zu verwenden is nich, da diese Komponenten da ein wenig einschränken (kann mich aber auch irren, da ich DelphiX schon lang nicht mehr verwende :zwinker: ).

Solltest du also Interesse an diesem überarbeiteten und erweitertem Overlay Beispiel haben, gib Bescheid, damit ich das Projekt mal noch kommentieren kann, da du sonst nicht wirklich durchblickst :mrgreen:

hugo1990 27. Dez 2006 23:39

Re: Desktop-Overlay mit DirectX
 
Wäre echt nett, wenn du das machen würdest.

Daniel G 27. Dez 2006 23:41

Re: Desktop-Overlay mit DirectX
 
Fände ich auch... :mrgreen:

JamesTKirk 28. Dez 2006 00:10

Re: Desktop-Overlay mit DirectX
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nur die Ruhe Leute... Nicht-mehr-wirklich-Teenie mit Schlafentzug ist doch kein D-Zug :mrgreen:

Overlay Unit ist im Anhang... ganz unten ist in nem Kommentar noch ein kleines Beispiel, das mehr oder weniger auf primitivste Art die Funktionsweise erklärt. Sollte es aber dennoch Probleme geben... ich bin ja nicht aus der Welt :zwinker:

Ach ja: An der Unit wird hin und wieder noch gewerkelt... wundert euch also nicht, dass es dort wie auf ner Baustelle aussieht :roll:

@hugo1990: Kaum editier ich meinen Beitrag, um dich willkommen zu heißen, weil ich nicht damit rechnete dich "heute" nochmal zu sehen, und dann postest du einfach... tztztz... so was aber auch... :mrgreen:

Daniel G 28. Dez 2006 00:23

Re: Desktop-Overlay mit DirectX
 
Zitat:

Zitat von JamesTKirk
Nicht-mehr-wirklich-Teenie mit Schlafentzug

Ich hab' Schlafanzug gelesen... :lol:

Danke :thumb:

JamesTKirk 28. Dez 2006 00:28

Re: Desktop-Overlay mit DirectX
 
Schlafanzug wäre zumindest auch nicht allzuweit von der Wahrheit entfernt gewesen... zumindest bezeichne ich meine TShirt + Short Kombi als solchen ;)

@Topic: Ich sollte mal schauen, dass ich an dem Projekt mal weiter komm... schließlich funktioniert mein Pluginsystem ja schon :mrgreen:

Sollte jemand eine Lösung für das Screenshotproblem in der OverlayUnit finden, wäre ich froh, wenn er oder sie mir diese mitteilen würde
:coder2:

hugo1990 28. Dez 2006 08:58

Re: Desktop-Overlay mit DirectX
 
Mal ne Frage, wo bekomm ich denn die DirectDraw.dcu und die Direct3D9.dcu her oder sollten die bei Delphi schon dabei sein

Hobby-Programmierer 28. Dez 2006 09:14

Re: Desktop-Overlay mit DirectX
 
Moin ...,
Zitat:

Zitat von hugo1990
Mal ne Frage, wo bekomm ich denn die DirectDraw.dcu und die Direct3D9.dcu her oder sollten die bei Delphi schon dabei sein

schau mal hier vorbei. Gutes Forum mit Tutorials und den benötigten DirectX Header Dateien. Bin auch seit Tagen am einarbeiten, also viel Spass :)

[edit] Noch ein Link falls Dir langweilig werden sollte
Clootie
[/edit]

hugo1990 28. Dez 2006 09:19

Re: Desktop-Overlay mit DirectX
 
Hab grad selber was dazu gefunden. Es geht jetzt, aber sagt er mir "Creation of flippable overlay surface failed", woran kann das liegen. Denn die andere Demo ging ja bei mir.

Hobby-Programmierer 28. Dez 2006 11:10

Re: Desktop-Overlay mit DirectX
 
Zitat:

Zitat von hugo1990
Es geht jetzt, aber sagt er mir "Creation of flippable overlay surface failed", woran kann das liegen. Denn die andere Demo ging ja bei mir.

Falscher oder inkompatibeler DirectX Header? Keine Ahnung, bin selbst noch im Anfägerstatus :roll:
Aber falls Dir hier niemand helfen kann dann geh doch einfach ins Forum von delphidev.de. Was ich bisher gesehen habe sind da wohl echt die Profis zu Hause!

JamesTKirk 28. Dez 2006 12:18

Re: Desktop-Overlay mit DirectX
 
Zu den Units: Mea Culpa!! Mir ist auch vor wenigen Minuten gekommen, dass da ja noch was fehlt... :wall: Aber Hobby-Programmierer hat dích zu den richtigen Headern weitergeleitet. (Die Direct3D9.pas kann übrigens aus der OverlayUnit gelöscht werden... is noch ein Überbleibsel von vor ein paar Monaten :mrgreen: )

Zu der Exception: Also sie hängt nicht mit falschen Headern zusammen (sonst wäre die vermutlich schon früher im Code gekommen ;) ), sondern höchstwahrscheinlich damit, dass deine Grafikkarte ein anderes Format möchte... Geh deshalb mal in die TDDOverlay.CreateOverlay Prozedur, entferne den Kommentar um die formats[1]- und formats[2]-Zuweisungen und ändere in der for-Schleife danach das "to 0" auf "to 2". Danach hangelst du dich per Breakpoint mal durch die Vorschleife und schaust ob und bei welchem Wert von "i" DDraw.CreateSurface erfolgreich ist.
Das könnte sich nämlich als kleines Problem erweisen, wenn man danach DCs verwenden will... :gruebel:

hugo1990 28. Dez 2006 14:41

Re: Desktop-Overlay mit DirectX
 
Also ich hab das jetzt so gemacht, aber es passiert immer noch das selbe.

JamesTKirk 28. Dez 2006 15:28

Re: Desktop-Overlay mit DirectX
 
Hmm... eins hab ich noch:

Mach mal bitte folgende Anpassungen in der TDDOverlay.CreateOverlay:

Delphi-Quellcode:
procedure TDDOverlay.CreateOverlay;
var
  formats: array[0..4] of DDPIXELFORMAT; //<- wir brauchen jetzt insgesamt 5
  (...)
begin
  (...)
  // Die beiden Formate hab ich auch noch aus dem C Beispiel ausbuddeln können
  formats[3].dwSize:=SizeOf(DDPIXELFORMAT);
  formats[3].dwFlags:=DDPF_FOURCC;
  formats[3].dwFourCC:=MAKEFOURCC('U','Y','V','Y');
  formats[3].dwRGBBitCount:=16;
  formats[3].dwRBitMask:=0;
  formats[3].dwGBitMask:=0;
  formats[3].dwBBitMask:=0;
  formats[3].dwRGBAlphaBitMask:=0;

  formats[4].dwSize:=SizeOf(DDPIXELFORMAT);
  formats[4].dwFlags:=DDPF_FOURCC;
  formats[4].dwFourCC:=MAKEFOURCC('Y','U','Y','2');
  formats[4].dwRGBBitCount:=0;
  formats[4].dwRBitMask:=0;
  formats[4].dwGBitMask:=0;
  formats[4].dwBBitMask:=0;
  formats[4].dwRGBAlphaBitMask:=0;
   
  (...)
 
  // Natürlich muss das hier auch noch geändert werden ;)
  for i := 0 to 4 do begin
    (...)
  end;
 
  (...)
end;
Vielleicht hilft das ja weiter... :gruebel:

Könntest du vielleicht mal noch posten, welche Windowsversion du verwendest? Hab allerdings keine Anhung, ob mich das dann weiterbringt :? Aber einen Versuch ist es wert...

hugo1990 28. Dez 2006 15:30

Re: Desktop-Overlay mit DirectX
 
Hab ich grad gemacht, jetzt gehts. Hatte mir einfach das C++Beispiel nochmal angeguckt und das auch gefunden.

hugo1990 28. Dez 2006 15:43

Re: Desktop-Overlay mit DirectX
 
Nagut, jetzt zeigt er was an, es sieht aber nicht wirklich so aus, wie es sein sollte. Er macht nur grüne und rosane streifen und es flimmert extrem.
Ich habe WindowsXP Home Service Pack 2.

JamesTKirk 28. Dez 2006 16:00

Re: Desktop-Overlay mit DirectX
 
Liegt dann wohl wahrlich daran, dass deine Grafikkarte/dein Grafikchip in Punkto Overlay nur YUV Farben möchte (weil XP Home SP2 verwend ich auch)... da ich grad nicht weiß wies bei meinen PCs (außer meinem Laptop) damit aussieht, kann es ne Weile dauern dafür einen Fix zu finden...

Welches Format hat er eigentlich am Ende genommen? 3 oder 4??

Edit: Es heißt YUV und net YUC -.-

hugo1990 28. Dez 2006 16:30

Re: Desktop-Overlay mit DirectX
 
Er macht es sowohl mit 3 als auch 4, das Ergbnis ist ungefähr das selbe nur die rosa streifen (3) sind cyan (4).

JamesTKirk 28. Dez 2006 18:52

Re: Desktop-Overlay mit DirectX
 
Hmm... mal folgender Vorschlag meinerseits (bis ich selbst eine Lösung gefunden habe :roll: ):

Spiel einfach mal ein wenig mit den Farbwerten in einem TBitmap rum (Infos zu YUV findest in der Wikipedia ) und schau mal in der Suche oder bei Google ob irgendwo was davon steht, wie man in DelphiX
a) einen DC bekommt
und/oder b) ein Surface mit YUV erstellt (wenn du ein Surface erstellen kannst, kannst du eventuell das Overlay Zeugs in der TDDOverlay Klasse nachbilden)

Oder weiß hier irgendjemand eine Lösung? Vor allem dazu einen 32bit RGB DC schnell (wichtig!) in einen 32bit/16bit YUV umzuwandeln? Oder warum es Grafikkarten gibt, die auf YUV beharren? :gruebel:

Edit: Grammatikfehlerchen :?

hugo1990 28. Dez 2006 23:37

Re: Desktop-Overlay mit DirectX
 
Also ich hab jetzt mal ein bisschen an der CopyImagetoSurface Prozedur rum gebasstel. Sie sieht jetzt so aus:
Delphi-Quellcode:
procedure TDDOverlay.CopyImageToSurface(Dest: IDirectDrawSurface7; Src:PRGBTripleArray {Das geht noch nicht richtig});
var
  destDC:HDC;
  ddsd:DDSURFACEDESC2;
  destb:^Byte;
  bild:TCanvas;
  r,g,b,y,u,v:Byte;
  x1,y1:integer;
  w,h,pitch:integer;
begin
   ZeroMemory(@ddsd, sizeof(ddsd));
   ddsd.dwSize:=sizeof(ddsd);
  if FAILED(Dest.Lock(NIL, ddsd, DDLOCK_SURFACEMEMORYPTR or DDLOCK_WAIT, 0)) then
   begin
    exit;
   end;
 if ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC then
  begin
  w:=ddsd.dwWidth;
  h:=ddsd.dwHeight;
  pitch:=ddsd.lPitch;
  destb:=ddsd.lpSurface;
  Randomize;
  for y1:=0 to h-1 do
   begin
   for x1:=0 to w-1 do
    begin
    r:=random(255);
    g:=random(255);
    b:=random(255);


    y:=Trunc(0.299*r+0.587*g+0.114*b);
    u:=Trunc((b-y)*0.493);
    v:=Trunc((r-y)*0.877);
    inc(destb);
    if ddsd.ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y','U','Y','2') then
     begin
     destb^:=y;
     destb^:=u;
     destb^:=y;
     destb^:=v;
     end
    else
     begin
     destb^:=u;
     destb^:=y;
     destb^:=v;
     destb^:=y;
     end;
    end;
   end;
  destb^:=pitch-w*2;
  Dest.Unlock(NIL);
  end;
{  Dest.GetDC(destDC);

  if Src=0 then
    BitBlt(destDC,0,0,FWidth,FHeight,Src,0,0,BLACKNESS)
  else
    BitBlt(destDC,0,0,FWidth,FHeight,Src,0,0,SRCCOPY);

  Dest.ReleaseDC(destDC);}
end;
Damit habe ich es geschaft, das er wenigstens schonmal etwas zeichnet. Und zwar ein buntes gekrissele (ist ja logisch wegen random). Nur ist das nur auf der oberen Bildschirmhälfte, auf der unteren ist immer noch das selber geflimmere wie zuvor. Weiß jemand, woran das liegen könnte.

Edit: Mir ist aufgefallen, dass wenn ich bei der for-Schleife hinter dem h die -1 entferne, er auf den ganzen Bildschirm malt, aber man sieht in der Mitte sozusagen eine Grenze und das untere Bild bwegt sich nicht es flimmert nur ein wenig, während das obere krisselt.

hugo1990 29. Dez 2006 10:47

Re: Desktop-Overlay mit DirectX
 
Habe gerade festgestellt, das wenn ich für die YUV berechnung nur einen Farbton (z.B. r) nehmen, dann ist es immer noch ein buntes gekrissele, obwohl es dann Schwarz/Weiß sein müsste. Also hab ich ein bisschen rumgebasstelt und rausgefunden, das er statt Weiß immer einen Grünton anzeigt. Wo könnte der Fehler liegen. Ich hab jetzt für die Berechnung auch mal das genommen, wie es in der c++ Datei steht, also folgender Maßen:
Delphi-Quellcode:
y:=Trunc(0.29*r+0.59*r+0.14*r);
u:=Trunc(128-0.14*r-0.29*r+0.43*r);
v:=Trunc(128+0.36*r-0.29*r-0.07*r);

JamesTKirk 29. Dez 2006 12:44

Re: Desktop-Overlay mit DirectX
 
Jetzt wo ich bei mir zu Hause ebenfalls einen Rechner gefunden habe, der nur YUV unterstützt (meinen Win2000/98 Testrechner), werde ich mich mal daran machen das auszutesten. Melde mich dann wieder :zwinker: (Deinen Code teste ich auch mal aus...)

Edit: 0 bei Win2000 vergessen -.-

Phantom1 29. Dez 2006 16:10

Re: Desktop-Overlay mit DirectX
 
Liste der Anhänge anzeigen (Anzahl: 1)
Für die Umwandlungen in YUY2, UYVY und I420 hab ich vor einiger Zeit eine Unit geschrieben (siehe Anhang). Man braucht jedoch die GR32 Komponenten, da ich das TBitmap32 benutze. Mit ein paar änderungen an meinem Code würde auch ein normales TBitmap funktionieren.
Delphi-Quellcode:
function TForm1.CopyImageToSurface(Bmp32: TBitmap32; surface: IDirectDrawSurface7): Boolean;
var ddsd: TDDSURFACEDESC2; src, dest: Pointer;
begin
  Result:=False;
  FillChar(ddsd, SizeOf(ddsd), 0);
  ddsd.dwSize:=SizeOf(ddsd);
  if FAILED(surface.Lock(nil, ddsd, DDLOCK_SURFACEMEMORYPTR or DDLOCK_WAIT, 0)) then
    Exit;
  src:=Bmp32.PixelPtr[0, 0];
  dest:=ddsd.lpSurface;
  case ddsd.ddpfPixelFormat.dwFlags of
    DDPF_RGB:
      case ddsd.ddpfPixelFormat.dwRGBBitCount of
        32: Move(src^, dest^, ddsd.dwHeight*ddsd.dwWidth*4);
        24: Conv32to24(src, dest, ddsd.dwWidth, ddsd.dwHeight);
        16: if ddsd.ddpfPixelFormat.dwGBitMask=$03E0 then
              Conv32to15(src, dest, ddsd.dwWidth, ddsd.dwHeight)
            else
              Conv32to16(src, dest, ddsd.dwWidth, ddsd.dwHeight);
      end;
    DDPF_FOURCC:
      case ddsd.ddpfPixelFormat.dwFourCC of
        YUY2: ARGBtoYUY2(src, dest, ddsd.dwWidth, ddsd.dwHeight);
        UYVY: ARGBtoUYVY(src, dest, ddsd.dwWidth, ddsd.dwHeight);
        I420: ARGBtoI420(src, dest, ddsd.dwWidth, ddsd.dwHeight);
      end;
  end;
  surface.Unlock(nil);
  Result:=True;
end;

hugo1990 29. Dez 2006 19:29

Re: Desktop-Overlay mit DirectX
 
Cool vielen vielen Dank an Phantom1, jetzt geht es, nur irgendwie ist das weiß ein grau. Muss das so sein.
Edit: Das weiß ist doch nicht grau es ist nur dreckig. :lol:

Phantom1 29. Dez 2006 21:03

Re: Desktop-Overlay mit DirectX
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich seh grad, ich hab eine alte version hochgeladen, da waren noch 2 oder 3 fehler drinnen. Im Anhang findet ihr die neuere Version.

Delphi-Quellcode:
function TForm1.CopyImageToSurface(Bmp32: TBitmap32; surface: IDirectDrawSurface7): Boolean;
var ddsd: TDDSURFACEDESC2;
begin
  Result:=False;
  FillChar(ddsd, SizeOf(ddsd), 0);
  ddsd.dwSize:=SizeOf(ddsd);
  if FAILED(surface.Lock(nil, ddsd, DDLOCK_SURFACEMEMORYPTR or DDLOCK_WAIT, 0)) then
    Exit;

  with ddsd do
    ARGBToCodec(Bmp32.PixelPtr[0, 0], lpSurface, dwWidth, dwHeight, ddpfPixelFormat.dwRGBBitCount, ddpfPixelFormat.dwFourCC);

  surface.Unlock(nil);
  Result:=True;
end;

Leifcp 13. Feb 2007 15:21

Re: Desktop-Overlay mit DirectX
 
Hey,
ich kriege den Fehler "Undefinierter Bezechner 'DDCAPS_DX7'"...
Dabei habe ich alle schon gelinkten DirectX-Header drin -
kann mir jemand sagen, wie ich den Fehler beseitige?!


Vielen Dank,
Leif ;O)

Leifcp 14. Feb 2007 12:18

Re: Desktop-Overlay mit DirectX
 
Keine Antwort?
kann doch nicht so schwer sein, oder?

JamesTKirk 15. Feb 2007 19:36

Re: Desktop-Overlay mit DirectX
 
Sorry... ich hatte erst gestern Delphi wieder installiert, da ich meinen PC formatiert hatte :roll:

@Topic:

Welche Headers verwendest du denn?
Ich hab mir heut die neuesten Clooties runtergladen, den Ordner dem "jungfräulichem" Delphi bekannt gegeben und kompiliert... funzt wie beim letzten Mal als ich's verwendet hab :mrgreen:

JamesTKirk 17. Feb 2007 19:44

Re: Desktop-Overlay mit DirectX
 
Für die Leute die Vista benutzen eine kleine Anmerkung (hab ich gerade herausgefunden :mrgreen: ):

Beim verwenden von DirectDraw zum Zeichnen auf den Desktop wird von Aero auf Vista Basic umgeschalten! Liegt wohl daran, dass Aero DirectX verwendet und man mit DirectDraw auf eine etwas andere Art auf die Grafikkarte zugreift... Irgendwie so ^^

Btw:
Mal schauen, ob es durch die Verwendung von DirectX durch Aero nicht leichter für mich wird nen animierten Desktop unterzubringen (die Ultimate Extras könnens ja auch ;) ). Dann müsste ich nur noch eine Abfrage einbauen, ob Vista oder nicht :mrgreen:

JasonDX 17. Feb 2007 22:49

Re: Desktop-Overlay mit DirectX
 
Zitat:

Zitat von JamesTKirk
Beim verwenden von DirectDraw zum Zeichnen auf den Desktop wird von Aero auf Vista Basic umgeschalten! Liegt wohl daran, dass Aero DirectX verwendet und man mit DirectDraw auf eine etwas andere Art auf die Grafikkarte zugreift... Irgendwie so ^^

Verwendest du irgendwo GetSurfaceDesc()? Das vertraegt sich nicht mit dem DWM von Vista und schaltet den aus -> Aero is weg. Anscheinend soll GetDisplayMode das Problem beheben.

greetz
Mike

PS: Nur so nebenbei, DirectDraw ist depricated. Seit ca. 2003 :zwinker:

turboPASCAL 18. Feb 2007 13:22

Re: Desktop-Overlay mit DirectX
 
So, habe meine Umsetzung des C++ Beispiels zu 75% fertig. Nun die Frage, wo verflixt bekomm ich das
IDirectDraw - Dings her ? Direct3D9 und D3DX9 hab ich eingebunden....


Ah, hab was gefunden. ;)

turboPASCAL 18. Feb 2007 15:02

Re: Desktop-Overlay mit DirectX
 
Also ich bekomme die Umsetzung von CreateOverlay(); und CheckOverlaySupport(); nicht in den Griff. Da reichten meine C-Kentnisste nicht aus. :(

Code:
if( capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYDEST && 0 % capsDrv.dwAlignBoundaryDest != 0 )
:gruebel: Und andere Sachen...

Ich würde mich über Hilfe freuen. (Ich möcht ja nur 'n Bitmap als Overlay setzen...)

JasonDX 18. Feb 2007 15:22

Re: Desktop-Overlay mit DirectX
 
Zitat:

Zitat von turboPASCAL
Also ich bekomme die Umsetzung von CreateOverlay(); und CheckOverlaySupport(); nicht in den Griff. Da reichten meine C-Kentnisste nicht aus. :(

Code:
if( capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYDEST && 0 % capsDrv.dwAlignBoundaryDest != 0 )
:gruebel: Und andere Sachen...

Ich würde mich über Hilfe freuen. (Ich möcht ja nur 'n Bitmap als Overlay setzen...)

:gruebel: Dieses Codestueck scheint mir etwas sinnbefreit, in meinen augen gibt das immer false, da && und & eine hoehere Prioritaet haben als % :gruebel:
D.h. theoretisch muessts auch klappen, indem du die Abfrage weglaesst und evt. nur den else-Zweig hinschreibst.

greetz
Mike

turboPASCAL 18. Feb 2007 15:53

Re: Desktop-Overlay mit DirectX
 
:gruebel:
Delphi-Quellcode:
if (capsDrv.dwCaps = DDCAPS_ALIGNBOUNDARYDEST) and
  (capsDrv.dwAlignBoundaryDest <> 0 ) then ...
Oder wie ?

Neutral General 18. Feb 2007 15:58

Re: Desktop-Overlay mit DirectX
 
Kleine Frage:

Delphi-Quellcode:
0 % capsDrv.dwAlignBoundaryDest
bedeutet das nicht

Delphi-Quellcode:
0 mod capsDrv.dwAlignBoundaryDest
? o.O

Weil dann wär diese zweite Bedingung Schwachsinn...

JasonDX 18. Feb 2007 16:04

Re: Desktop-Overlay mit DirectX
 
Zitat:

Zitat von turboPASCAL
:gruebel:
Delphi-Quellcode:
if (capsDrv.dwCaps = DDCAPS_ALIGNBOUNDARYDEST) and
  (capsDrv.dwAlignBoundaryDest <> 0 ) then ...
Oder wie ?

Nein, die if komplett weglassen. IMHO korrekt weil:
Code:
capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYDEST && 0 % capsDrv.dwAlignBoundaryDest != 0
Mit Operatorprioritaeten von:
&&: 11
&: 8
!=: 7
%: 3
sieht mit klammern geschrieben ca. so aus:
Code:
if ((capsDrv.dwCaps & (DDCAPS_ALIGNBOUNDARYDEST && 0)) % (capsDrv.dwAlignBoundaryDest != 0))
DDCAPS_ALIGNBOUNDARYDEST && 0 = 0 -> capsDrv.dwCaps & 0 = 0 -> 0 % (capsDrv.dwAlignBoundaryDest != 0) = 0 (weil 0 mod x = 0) = false -> abfrage gibt immer in den else-zweig.

greetz
Mike

turboPASCAL 18. Feb 2007 16:39

Re: Desktop-Overlay mit DirectX
 
Ich weis warum ich C (nicht) mag. ;)

bubbik 7. Jun 2007 19:14

Re: Desktop-Overlay mit DirectX
 
Desktop overlay with sources

http://mhaggag.wordpress.com/
http://www.gamedev.net/community/for...opic_id=359319

Delphi-Fan-Friedrichsdorf 1. Jul 2007 12:27

Re: Desktop-Overlay mit DirectX
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo interessantes Thema,
ich hab die Unit von JamesTKirk ausprobiert und bei
mir WURDEN die Linken und die Oberen Ränder von allen Fenstern, Tablaschen und den Fensterleistenbuttons(Beenden Minimieren, Maximieren,...) bunt, egal welche Farbe ich einstellte.
Ist das bei euch auch mal passiert?

(Ich habe WinXP, benutze aber das Klassische Windows-Design, weil meine Sicherheitsoftware den Designmanager killt.)

Jetzt
hab ich auch die obere Hälfte des Bildschirms Farbig und die Untere ist irgendwie auch Farbig, aber mehr Streifen als Pixel.

Ist eigentlich noch keiner auf die Idee gekommen die Probleme einfach mal mit einem etwas anderen "Screenshot" zu dokumentieren?

Ich sage nur Kamera.



Edit:
@ JamesTKirk:
Könntest du nicht mal den Aktuellen, also mit allen Änderungen, Quellcode posten, ich finde es etwas hinderlich wenn man sich den Code erst zusammenbauen muss bevor man ihn verwenden kann.

Wer die header von delphidev.de verwendet mus vor alle typen ein T schreiben. z.b.:
Delphi-Quellcode:
...
function TDDOverlay.CheckOverlaySupport: Integer;
var
  capsDrv:DDCAPS_DX7;
...

// mus mit den headern von delphidev.de so aussehen:
...
function TDDOverlay.CheckOverlaySupport: Integer;
var      v
  capsDrv:TDDCAPS_DX7;
...      ^

"Screenshots":

JamesTKirk 8. Jul 2007 18:07

Re: Desktop-Overlay mit DirectX
 
Hi!

Das Problem an sich kommt mir äußerst bekannt vor... ich glaube darum ging es in den früheren Beiträgen hier auch schon :mrgreen:

Zu dem Quellcode: ich werd mal schauen, was sich machen lässt, da des Projekt momentan etwas auf Sparflamme läuft und ich mich eher auf anderes konzentriere...

Und das mit dem "T" vor den Typen: da TDDCaps_DX7 eigentlich sinngemäß definiert ist als

Delphi-Quellcode:
type
  DDCAPS_DX7 = blabla;

  TDDCaps_DX7 = DDCAPS_DX7;
is das egal, aber wenn man stilgerecht programmieren will, hast du natürlich Recht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 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