![]() |
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
![]() |
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: |
Re: Desktop-Overlay mit DirectX
Wäre echt nett, wenn du das machen würdest.
|
Re: Desktop-Overlay mit DirectX
Fände ich auch... :mrgreen:
|
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: |
Re: Desktop-Overlay mit DirectX
Zitat:
Danke :thumb: |
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: |
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
|
Re: Desktop-Overlay mit DirectX
Moin ...,
Zitat:
![]() [edit] Noch ein Link falls Dir langweilig werden sollte ![]() [/edit] |
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.
|
Re: Desktop-Overlay mit DirectX
Zitat:
Aber falls Dir hier niemand helfen kann dann geh doch einfach ins Forum von ![]() |
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: |
Re: Desktop-Overlay mit DirectX
Also ich hab das jetzt so gemacht, aber es passiert immer noch das selbe.
|
Re: Desktop-Overlay mit DirectX
Hmm... eins hab ich noch:
Mach mal bitte folgende Anpassungen in der TDDOverlay.CreateOverlay:
Delphi-Quellcode:
Vielleicht hilft das ja weiter... :gruebel:
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; 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... |
Re: Desktop-Overlay mit DirectX
Hab ich grad gemacht, jetzt gehts. Hatte mir einfach das C++Beispiel nochmal angeguckt und das auch gefunden.
|
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. |
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 -.- |
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).
|
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 ![]() 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 :? |
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:
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.
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; 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. |
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); |
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 -.- |
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; |
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: |
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; |
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) |
Re: Desktop-Overlay mit DirectX
Keine Antwort?
kann doch nicht so schwer sein, oder? |
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: |
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: |
Re: Desktop-Overlay mit DirectX
Zitat:
greetz Mike PS: Nur so nebenbei, DirectDraw ist depricated. Seit ca. 2003 :zwinker: |
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. ;) |
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:
:gruebel: Und andere Sachen...
if( capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYDEST && 0 % capsDrv.dwAlignBoundaryDest != 0 )
Ich würde mich über Hilfe freuen. (Ich möcht ja nur 'n Bitmap als Overlay setzen...) |
Re: Desktop-Overlay mit DirectX
Zitat:
D.h. theoretisch muessts auch klappen, indem du die Abfrage weglaesst und evt. nur den else-Zweig hinschreibst. greetz Mike |
Re: Desktop-Overlay mit DirectX
:gruebel:
Delphi-Quellcode:
Oder wie ?
if (capsDrv.dwCaps = DDCAPS_ALIGNBOUNDARYDEST) and
(capsDrv.dwAlignBoundaryDest <> 0 ) then ... |
Re: Desktop-Overlay mit DirectX
Kleine Frage:
Delphi-Quellcode:
bedeutet das nicht
0 % capsDrv.dwAlignBoundaryDest
Delphi-Quellcode:
? o.O
0 mod capsDrv.dwAlignBoundaryDest
Weil dann wär diese zweite Bedingung Schwachsinn... |
Re: Desktop-Overlay mit DirectX
Zitat:
Code:
Mit Operatorprioritaeten von:
capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYDEST && 0 % capsDrv.dwAlignBoundaryDest != 0
&&: 11 &: 8 !=: 7 %: 3 sieht mit klammern geschrieben ca. so aus:
Code:
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.
if ((capsDrv.dwCaps & (DDCAPS_ALIGNBOUNDARYDEST && 0)) % (capsDrv.dwAlignBoundaryDest != 0))
greetz Mike |
Re: Desktop-Overlay mit DirectX
Ich weis warum ich C (nicht) mag. ;)
|
Re: Desktop-Overlay mit DirectX
Desktop overlay with sources
![]() ![]() |
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": |
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:
is das egal, aber wenn man stilgerecht programmieren will, hast du natürlich Recht.
type
DDCAPS_DX7 = blabla; TDDCaps_DX7 = DDCAPS_DX7; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz