Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Formular auf Desktop zeichnen... (https://www.delphipraxis.net/85995-formular-auf-desktop-zeichnen.html)

E307 7. Feb 2007 16:12


Formular auf Desktop zeichnen...
 
Hallo! Dieses Thema wurde schon oft und viel in diversen Foren und auch hier behandelt, aber eine richtige Lösung für Delphi habe ich noch nicht gefunden.
Ich möchte mein Formular oder ein Bitmap auf den Desktop zeichnen und zwar hinter die Icons. Gibt es da eine gute Lösung? (Es darf auch was mit DirectX sein) Das sowas möglich ist beweist dieses C- Programm: http://www.angelcode.com/dev/overlay/ , sowie das DSPack, was sein Video auch auf den Desktop hinter die Icons zeichnen kann.

megaGOLDdeluxe 7. Feb 2007 23:53

Re: Formular auf Desktop zeichnen...
 
Reicht es nicht, wenn Du Dir das Handle des Desktops ermittelst, und dieses dann Deinem Form als Parent zuweist?

MfG
Pierre

Luckie 7. Feb 2007 23:59

Re: Formular auf Desktop zeichnen...
 
Der Desktop ist ein Listview. Und "hinter den Icons" ist nur noch das Hintergrundbild. Entweder tauscht du das Hintergrundbild aus oder du zeichnest auf das Hintergrundbild und aktualisierst es. Ein Programmfenster wirst du nicht dahinterbekommen. Wäre genauso, als wenn du ein Fenster zwischen einer Schaltfläche und dessen Parentfenster bekommen wolltest.

E307 8. Feb 2007 11:51

Re: Formular auf Desktop zeichnen...
 
Wie ermittle ich das Handle des Hintergrunds, um irgendetwas darauf zu zeichnen?

dominikkv 8. Feb 2007 12:29

Re: Formular auf Desktop zeichnen...
 
bei dem link den du gepostet hast ist doch auch ein source dabei... vllt kannst du den ja nach delphi porten :cyclops:

bitsetter 8. Feb 2007 12:34

Re: Formular auf Desktop zeichnen...
 
Hier ist noch ein Link dazu, oder kanntest du den schon? Desktop-Overlay mit DirectX

E307 8. Feb 2007 14:18

Re: Formular auf Desktop zeichnen...
 
Ja, das kenne ich schon. Bei mir kommt die Meldung: "Creation of flippable overlay Surface failed", wenn ich das Objekt erstelle:
Delphi-Quellcode:
XD:=TDDOverlay.Create(1024,768,clBlack);

E307 8. Feb 2007 17:17

Re: Formular auf Desktop zeichnen...
 
Wenn ich das Objekt so erstelle:
Delphi-Quellcode:
XD:=TDDOverlay.Create(1,1,clBlack);
Kommt die Meldung: "Your hardware doesn't support the surface we're trying to create" oderso. Das kann aber eigentlich nicht sein. Meine Grafikkarte: NVIDIA GeForce 7600 GS

E307 10. Feb 2007 18:29

Re: Formular auf Desktop zeichnen...
 
Delphi-Quellcode:
unit test;

interface

uses
  Windows, Classes, SysUtils, Messages, Graphics, Forms, Controls, ActiveX, DirectShow9,
  DirectDraw, DSUtil, ComCtrls, MMSystem, OverlayUnit, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    D3DWidth, D3DHeight: Integer;
    FOldColor, OverlayColor: COLORREF;
   // Löschen und Wiederherstellen der Desktopfarbe und des Hintergrundbildes
    procedure SetDesktopColor(clr:DWord);
    procedure RestoreDesktop;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  XD: TDDOverlay;

implementation

{$R *.dfm}
{$R vres.res}

// Diese beiden Proceduren sind nahezu 1zu1 aus dem Beispiel übersetzt
procedure TForm1.RestoreDesktop;
var
  colorID:Integer;
begin
   // Restore the original desktop wallpaper
   SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NIL, 0);

   if FOldColor<>CLR_INVALID then begin
      colorID:=COLOR_BACKGROUND;
      SetSysColors(1,colorID,FOldColor);
  end;
end;

procedure TForm1.SetDesktopColor(clr:DWord);
var
  colorID:Integer;
  color:COLORREF;
begin
   // Remember current background color
  if FOldColor=CLR_INVALID then
    FOldColor:=GetSysColor(COLOR_BACKGROUND);

   // Set the desktop background color to the wanted one
  colorID:=COLOR_BACKGROUND;
  color:=clr;
  SetSysColors(1,colorID,color);

   // Remove the desktop wallpaper, without updating the registry
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(''), 0);
end;

procedure TForm1.FormCreate(Sender:TObject);
begin
  // Brauch mer nachher beim Timer (für dieses Beispiel)
  Randomize;

  D3DWidth:=640;
  D3DHeight:=480;

  FOldColor:=CLR_INVALID;

  // Die Overlayfarbe setzen
  OverlayColor:=RGB(8,0,16);

   // Set the desktop background to the color of the dest color key
   SetDesktopColor(OverlayColor);


  // Die TDDOverlay Klasse erstllen
   // Initialize the overlay surface
  try
    XD:=TDDOverlay.Create(D3DWidth,D3DHeight,OverlayColor);
  except
    Application.Terminate;
    Exit;
  end;

  // Stell beim Timer im ObjektInspektor am besten Enabled auf False
  Timer1.Enabled := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Timer1.Enabled := False;

   // Restore the desktop background
    RestoreDesktop;

   // Remove the overlay
  FreeAndNIL(XD);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width := D3DWidth;
    Bitmap.Height := D3DHeight;

    // Da der Hintergrund des Bitmaps weiß ist...
    Bitmap.Canvas.Pen.Color := clBlack;

    Bitmap.Canvas.MoveTo(Random(D3DWidth), Random(D3DHeight));
    Bitmap.Canvas.LineTo(Random(D3DWidth), Random(D3DHeight));

    // Overlay aktualisieren
    XD.Update(Bitmap.Canvas.Handle);
  finally
    FreeAndNIL(Bitmap);
  end;
end;
Code:
Creation of flippable overlay surface failed
Code:
Failed to create overlay surface
Das ist der Code und die (leider) zugehörigen Fehlermeldungen. Hat jemand eine Idee woran das liegt? Ich habe die OverlayUnit schon tausendmal überprüft, aber absolut nichts gefunden!

E307 17. Feb 2007 10:00

Re: Formular auf Desktop zeichnen...
 
*schieb* Weis keiner, wo der Fehler liegen könnte?

E307 18. Feb 2007 16:14

Re: Formular auf Desktop zeichnen...
 
So ein Monolog ist nicht schön! :-D Hat keiner eine Idee :shock:

turboPASCAL 18. Feb 2007 16:37

Re: Formular auf Desktop zeichnen...
 
Nö, ich kenne ja deine Kompo. TDDOverlay nicht. Vill liegt der Fehler dort. :gruebel:

E307 18. Feb 2007 17:05

Re: Formular auf Desktop zeichnen...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist ja auch nicht meine Komponente, sondern die aus dem oben genannten Thread. Die unit ist angehängt.

E307 21. Feb 2007 17:30

Re: Formular auf Desktop zeichnen...
 
:drunken: *push* :duck:

argonix 15. Mär 2007 14:21

Re: Formular auf Desktop zeichnen...
 
Ich habe mir den Code mal angesehen. Diese Zeile ist mir nicht ganz klar:
Delphi-Quellcode:
   for n:=0 to 0 do begin
      ddsdOverlay.ddpfPixelFormat:=formats[n];
      hr:=DDraw.CreateSurface(ddsdOverlay, Overlay, NIL);
      if SUCCEEDED(hr) then
         Break;
  end;
(In TDDOverlay.CreateOverlay)
Was soll das bringen, for n:=0 to 0 ???

E307 15. Mär 2007 15:26

Re: Formular auf Desktop zeichnen...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal das komplette Projekt mit allen Dateien angehängt. Vielleicht liegt es garnicht an der Overlay-Unit!?

turboPASCAL 15. Mär 2007 15:51

Re: Formular auf Desktop zeichnen...
 
:shock: 2,44 MB :gruebel:

Nun wenn du ein Formular hinter die Icons haben willst würde ich das nicht mit Overlay machen.
Der Grund ist bei dem Overlayverfahren wird eine Farbe genutzt auf die dann das Overlaybild
gezeichnet wird.
Nachteil ist wenn dann zB. ein Bild in einem Bildbetrachter angez. wird was die selbe Farbe wie das
Overlayverfahren nutzt "scheint" der vHintergrund hindurch.

Bau dir ein Bitmap, kopiere das Desktopbild drauf und auf dieses dein Formular.

E307 15. Mär 2007 16:00

Re: Formular auf Desktop zeichnen...
 
Zitat:

Zitat von turboPASCAL
Bau dir ein Bitmap, kopiere das Desktopbild drauf und auf dieses dein Formular.

Aber dann liegt das Bitmap doch wieder über den Desktop-Icons! Oder habe ich das falsch verstanden?

E307 16. Mär 2007 15:58

Re: Formular auf Desktop zeichnen...
 
Kann man vielleicht das Desktop-Bild auch aus dem Arbeitsspeicher laden lassen? Dann könnte man einfach in ein Bitmap zeichnen und dieses dann als Wallpaper darstellen!

turboPASCAL 16. Mär 2007 18:05

Re: Formular auf Desktop zeichnen...
 
Zitat:

Zitat von E307
Kann man vielleicht das Desktop-Bild auch aus dem Arbeitsspeicher laden lassen? Dann könnte man einfach in ein Bitmap zeichnen und dieses dann als Wallpaper darstellen!

Das war meine Überlegung, so das man nicht mit dem Wallpaperfile arbeiten muss welches auf der HD liegt.
An sonsten Bleibt nur noch der Active-Desktop übrig.

Bedenke aber das du deine Form nicht wie bisher bedienen kannst, zB. einfach eine Button drücken etc.

E307 17. Mär 2007 10:12

Re: Formular auf Desktop zeichnen...
 
Delphi-Quellcode:
procedure TForm1.ChangeWallpaper;
var s : String;
    a : Array[0..1024] of Char;
begin
  s := 'C:\Test.bmp';
    if FileExists(s) then begin
      StrPCopy(a, s);
      SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, @a, SPIF_UPDATEINIFILE);
    end;
end;
So. Wie kann ich jetzt s aus dem Arbeitsspeicher laden? Ich habe sowas bis jetzt erste einmal gemacht (für Genesis3D), aber da sah der Befehl anders aus. Der versuch, einfach ein TBitmap- Objekt zu erstellen und es dann mit
Delphi-Quellcode:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, @bmp, SPIF_UPDATEINIFILE);
als wallpaper zu setzten hat nicht funktioniert.

bitsetter 17. Mär 2007 10:29

Re: Formular auf Desktop zeichnen...
 
Moin,

hier ist ein Link mit Code um das Hintergrundbild zu ändern.

das Hintergrundbild ändern

E307 18. Mär 2007 11:26

Re: Formular auf Desktop zeichnen...
 
So müsste ich das Bild immer auf der Fesplatte vorher speichern, was warscheinlich sehr langsam ist. Geht das vielleicht anders?

E307 19. Mär 2007 19:28

Re: Formular auf Desktop zeichnen...
 
Hallo!? Geht das überhaupt?
__________________________________________________ __________________________________________________ __
James and John wake up. They look out of the window and see a lion. The lion is coming nearer. James puts his trainers on. John asks: Why are you doing that? You are not faster than the lion! James: I don't have to be faster than the lion. I must only be faster than you!

EWeiss 25. Feb 2011 01:00

AW: Formular auf Desktop zeichnen...
 
Jo ist ein altes Thema aber es geht!
Man sollte nur die richtigen Filter implementieren ;)

YUV und YUV2
Suche auch etwas in der art deshalb bin ich auf das Thema gestoßen.

Unter Win7 deaktiviert er mir aber mein Aero bin noch nicht dahinter gekommen warum.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.

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