Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas und der Desktop (https://www.delphipraxis.net/83414-canvas-und-der-desktop.html)

Neutral General 2. Jan 2007 13:28


Canvas und der Desktop
 
Hi,

Ja ich weiß das es da schon viele Threads zu gibt aber das ist alles so nicht das Wahre...
Wie kann ich denn auf den Desktop schreiben? Weil GetDC(0) ist irgendwie nicht wirklich der Desktop. Weil bei GetDC(0) schreibt man praktisch auf das ganze Bild drauf. Ich will aber nur auf den Desktop (Hintergrund) malen.
Das zweite Problem ist das ich den Text den ich schreibe jede Sekunde (mindestens) löschen und neu schreiben muss. Und wenn ich da jede Sekunde InvalidateRect benutze dann wird der Benutzer (= Ich!-.-^^) irgendwann verrückt vom Flimmern....

Achja.. Ich weiß nicht 100% ob GetDesktopWindow das Handle des Desktops zurückgeben soll aber bei mir hat das noch nie funktioniert... Also GetDC(GetDesktopWindow) hat keinen Sinn...

Gruß
Neutral General

xaromz 2. Jan 2007 13:35

Re: Canvas und der Desktop
 
Hallo,

an das Hintergrundbild kommst Du nicht ran. Die einzige mir bekannte Mögichkeit ist GetDC(0). Ab Vista ist davon aber abzuraten, da einige Funktionen nicht mehr unterstützt werden (z. B. XOR), und die Zugriffe wesentlich langsamer geworden sind.
Die beste Möglichkeit wäre wohl ein transparentes Fenster, mit MSDN-Library durchsuchenUpdateLayeredWindow kann man da schon was machen.

Gruß
xaromz

Neutral General 2. Jan 2007 13:37

Re: Canvas und der Desktop
 
Mh ok danke, aber welches Layered Window will ich denn Updaten? :|

xaromz 2. Jan 2007 13:40

Re: Canvas und der Desktop
 
Hallo,
Zitat:

Zitat von Neutral General
Mh ok danke, aber welches Layered Window will ich denn Updaten? :|

das, welches Du selbst erzeugst und auf dem Dein Text steht.

Gruß
xaromz

chaosben 2. Jan 2007 13:42

Re: Canvas und der Desktop
 
Quick and Dirty um auf den "Desktop" zu malen:
Delphi-Quellcode:
var
  h : HWND;
  c : TCanvas;
begin
  h:=FindWindow('Progman',nil);
  h:=FindWindowEx(h,0,'SHELLDLL_DefView',nil);
  h:=FindWindowEx(h,0,'SysListView32',nil);
  c:=TCanvas.Create;
  c.Handle:=GetDc(h);
  c.Pen.Color:=clRed;
  c.TextOut(10,10,'HehOsdffsdfsdsdf');
end;

xaromz 2. Jan 2007 13:48

Re: Canvas und der Desktop
 
Hallo,

auch damit malt man über alles drüber. (Edit: damit meine ich jetzt nur die Desktop-Icons.)

Gruß
xaromz

Neutral General 2. Jan 2007 13:51

Re: Canvas und der Desktop
 
Zitat:

Zitat von xaromz
Hallo,

auch damit malt man über alles drüber. (Edit: damit meine ich jetzt nur die Desktop-Icons.)

Gruß
xaromz

Das ist nicht schlimm...
Habs jetzt erst ma anders gelöst (Mit ner Form und Transparent-Color und nem Label) aber werd das auch mal ausprobieren.. thx.. :)

Gruß
Neutral General

JamesTKirk 3. Jan 2007 18:23

Re: Canvas und der Desktop
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!

Ich weiß ja nicht, ob du diese Diskussion mitverfolgt hast, aber hier habe ich eine Klasse gepostet, die das ganze mit DirectX, genauer DirectDraw7 erledigt. Die Klasse hat noch ein paar kleinere Problemchen (auf einigen Rechnern funzt sie nicht, da diese ein anderes Farbmodell (RGB <> YUV) verwenden und auch Screenshots wollen noch nicht), aber ich hoff einfach mal, dass sie bei dir funktioniert.
Und bevor du jetzt sagst "Och nee... kein DX...", kann ich dich trösten: Du übergibst der Klasse (insofern sie funzt -.-) einfach einen Device Context und lässt den Rest der Klasse erledigen. Falls du das ganze mit Hintergrundbild haben willst, musst du einfach (theoretisch) das Bild (verkleinert, da ich keine größere zu kopierende Auflösung als 800x600 empfehle ;) ) in den anzuzeigenden DC bringen, da temporär das Hintergrundbild deaktivert und die Hintergrundfarbe auf eine möglichst seltene Farbe gesetzt wird (werden sollte). :mrgreen:

Bei Problemen kannst dich an mich wenden... :zwinker:

(Ach ja: nicht getestet auf Vista :roll: )

Edit: Hab fast vergessen, dass ich mittlerweile eine leicht verbesserte Version der Klasse habe... :wall: Unten in der Unit ist ein kleines Beispiel zur Verwendung ;)


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