Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Auf Desktop zeichnen (https://www.delphipraxis.net/152582-auf-desktop-zeichnen.html)

KahPee 28. Jun 2010 11:42

Auf Desktop zeichnen
 
Hallo,

ich habe vor ein Programm zu programmieren was ermöglicht direkt auf dem Desktop zu zeichnen. "zu zeichnen" bedeutet ich möchte einfache Zeichenfunktionen wie Linien, Freihandzeichnungen, Ellipsen und Rechtecke zeichnen. Wie man dies auf einem TBitmap macht (Canvas) weiß ich auch schon und habe ich auf schon mehrfach angewendet. In meinem konkreten Fall geht es jetzt aber darum nicht auf eine vorbereitete Zeichenfläche zu zeichnen sondern direkt auf dem Desktop. Damit meine ich, dass ich wenn ein z.b.: Firefox-Fenster geöffnet habe ich direkt auf das Fenster zeichnen können möchte (Die Toolleiste bleibt im Vordergrund und Zeichenfunktion ist an-/ausschaltbar, damit auch noch die normale Bedienung des Programms möglich ist).
Hat jemand eine Idee wie man das "Globales" Zeichnen realisieren könnte?

Schon mal vielen Dank im Voraus

mfg KahPee

SirThornberry 28. Jun 2010 11:44

AW: Auf Desktop zeichnen
 
Kannst du bitte für deine zweite Frage ein neues Thema eröffnen und diese aus dem ersten Beitrag entfernen? (Bei uns gilt: Pro Thema nur eine Frage) Danke :)

Bummi 28. Jun 2010 12:02

AW: Auf Desktop zeichnen
 
Delphi-Quellcode:
var
  DC : HDC;
  Canvas : TCanvas;
begin

      DC := GetWindowDC(GetDesktopWindow());
      try
        Canvas := TCanvas.Create();
        try
          Canvas.Handle := DC;
          Canvas.Pen.Color := clLime;
          Canvas.Rectangle(1,1,100,100);
        finally
          Canvas.Free;
        end;
      finally
        ReleaseDC(0, DC);
      end;

end

KahPee 28. Jun 2010 12:36

AW: Auf Desktop zeichnen
 
Hey vielen Dank, das war ja gar nicht so schwer. Allerdings habe ich festgestellt, das das erzeugte rechteck sehr "flüchtig" ist. Wenn man die Maus über die Taskleiste oder aber über Minimieren/Maximieren und andere flächen bewegt verschwindet das rechteck gleich wieder. Kann man irgendwie erzwingen, dass das Rechteck nicht bei solchen Ereignissen verschwindet (denke mal es handelt sich um Prozeduren à la Repaint oder so)

blackfin 28. Jun 2010 12:59

AW: Auf Desktop zeichnen
 
Wernn das Fremd-Fenster sich neuzeichnet, sind deine schönen Rechtecke natürlich wieder weg.
Als Ausweg gibts dann nur, die Neuzeichnungs-Message des Fremd-Fensters zu hooken und deinen Zeichen-Code direkt danach auszuführen, immer dann, wenn sich das Fremd-Fensteer neu zeichnen will.

himitsu 28. Jun 2010 13:36

AW: Auf Desktop zeichnen
 
Oder man legt ein transparentes Fenster über alles und zeichnet darin "nichttransparent" das Gewünschte ein.

blackfin 28. Jun 2010 13:39

AW: Auf Desktop zeichnen
 
Dann muss man aber irgendwie noch das "Durchklicken" emulieren, oder nicht?
Und nicht nur das...Eingabefelder, Scrollleisten usw...

Naja, kommt drauf an, wofür das eigentlich gedacht ist. Wenns ein Bildschirmschoner sein soll, dann dürfte das ja keine Probleme machen, aber sonst sind die Fenster unter dem transparenten ja gesperrt.

DeddyH 28. Jun 2010 13:45

AW: Auf Desktop zeichnen
 
IIRC ist das aber mit WS_EX_LAYERED in den Griff zu bekommen.

blackfin 28. Jun 2010 13:54

AW: Auf Desktop zeichnen
 
Huh?...*googlegoogle*....wusste ich gar nicht, dass es sowas gibt :oops:

Wieder was gelernt :thumb:
Aber ist die Eigenschaft fürs Durchklicken dann nicht eher WS_EX_TRANSPARENT?

DeddyH 28. Jun 2010 14:00

AW: Auf Desktop zeichnen
 
Die Kombination von beiden macht' s ;) Hab da einen alten Thread wiedergefunden: http://www.delphipraxis.net/544575-post.html#633055

blackfin 28. Jun 2010 14:33

AW: Auf Desktop zeichnen
 
Edit: Ok, habs schon :D Hat sich damit also erledigt

Interessant... :)
Eigentlich ist das ja gar nicht mein Beitrag, aber das interessiert mich nun doch ein wenig.
Ich habe gerade festgestellt, dass ein Zeichnen auf den Canvas bei einem WS_EX_TRANSPARENT or WS_EX_LAYERED nicht mehr wirklich funktioniert.

Wie schafft man es denn jetzt, ein WS_EX_TRANSPARENT und WS_EX_LAYERED Fenster komplett transparent zu bekommen und dann nicht-transparent draufzuzeichnen?

himitsu 28. Jun 2010 14:45

AW: Auf Desktop zeichnen
 
Mit einem transparentem TBitmap dürfte es gehn.

blackfin 28. Jun 2010 15:28

AW: Auf Desktop zeichnen
 
Sooo, für den Thread-Ersteller nun auch mal die Quick and dirty Methode, die ich gerade ausprobiert habe, für sein Vorhaben:

Form1 ist die Form, auf die gezeichnet wird.
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
FCanvas : TCanvas ;
FHandle : THandle ;
begin

  // Eigene Form maximieren und transparent schalten
  // (geht irgendwie mit clBtnface nicht, deswegen habe ich erstmal die Form.Color auf clWhite gesetzt)
  self.BorderStyle := bsNone ;
  self.WindowState := wsMaximized ;
  self.TransparentColor := true ;
  self.Color := clWhite ;
  self.TransparentColorValue := clWhite ;
  self.FormStyle := fsStayOnTop ;

  FHandle := self.Handle ;

  // Canvas kreieren
  FCanvas := TCanvas.Create;
  FCanvas.Handle := GetWindowDC(FHandle) ;

  // Fenster als layered und Durchklickbar setzen
  SetWindowLong(FHandle, GWL_EXSTYLE, GetWindowLong(FHandle, GWL_EXSTYLE) or WS_EX_TRANSPARENT or WS_EX_LAYERED);

  // Desktop als Fenster-Parent zuweisen
  SetWindowLong(FHandle, GWL_HWNDPARENT, 0);

  // Rechteck zeichnen :D
  FCanvas.Pen.Color := clLime;
  FCanvas.Rectangle(1,1,100,100);
 
  // Canvas wieder freigeben
  FreeAndNil(FCanvas) ;
end;

turboPASCAL 28. Jun 2010 16:32

AW: Auf Desktop zeichnen
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, XPMan;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private-Deklarationen }
    Timetimer: TTimer;
    procedure OnTimeTimer(Sender: TObject);
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := WS_EX_TRANSPARENT or WS_EX_LAYERED or WS_EX_NOACTIVATE;
  Params.Style := WS_POPUP or WS_CLIPCHILDREN;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // the Form Style
  Self.BorderStyle := bsNone;
  Self.Color := clFuchsia;

  Self.AlphaBlend := True;
  Self.AlphaBlendValue := 220;

  Self.TransparentColor := True;
  Self.TransparentColorValue := clFuchsia;

  Self.Left := 0;
  Self.Top := 0;
  Self.Width := Screen.Monitors[0].Width;
  Self.Height := Screen.Monitors[0].Height;

  // set Form as Parent of Desktop
  Windows.SetParent(Self.Handle, Windows.GetDesktopWindow);

  // Setup the Canvas
  Self.Canvas.Font.Name := 'arial';
  Self.Canvas.Font.Style := [fsBold];
  Self.Canvas.Font.Size := 64;
  Self.Canvas.Font.Color := clWhite;

  // set the Z-Order
  Windows.SetWindowPos(Self.Handle, HWND_BOTTOM, 0,0,0,0,
    SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);

  // Timer setup
  Timetimer := TTimer.Create(Self);
  try
    Timetimer.Interval := 500;
    Timetimer.OnTimer := OnTimeTimer;
  except
    raise; // do to...
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(Timetimer) then
    Timetimer.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  s: string;
begin
  Self.Canvas.Brush.Color := clWhite;

  s := SysUtils.TimeToStr(now);

  Windows.BeginPath(Self.Canvas.Handle);

  Self.Canvas.Brush.Style := bsClear;

  Self.Canvas.TextOut((Self.ClientWidth div 2) - (Self.Canvas.TextWidth(s) div 2),
    (Self.ClientHeight div 2) - (Self.Canvas.TextHeight(s) div 2),
    SysUtils.TimeToStr(now));


  Windows.EndPath(Self.Canvas.Handle);
  Self.Canvas.Brush.Style := bsSolid;
  Windows.FillPath(Self.Canvas.Handle);
end;

procedure TForm1.OnTimeTimer(Sender: TObject);
begin
  Self.invalidate;
end;

end.
:stupid: ;)

himitsu 28. Jun 2010 16:55

AW: Auf Desktop zeichnen
 
- TImage auf Form klatschen
- Folgendes im OI einstellen
Delphi-Quellcode:
TForm
BorderStyle = bsNone
WindowState = wsMaximized
TransparentColor = true
TransparentColorValue = (Color)
FormStyle = fsStayOnTop

TImage
Align = alClient
- WS_EX_TRANSPARENT und WS_EX_LAYERED wird schon über TransparentColor=True als Style eingestellt.

- Image.Canvas zum Malen verwenden
- Color und TransparentColorValue auf eine Farbe (die Selbe) setzen, welche man für den transparenten Hintergrund verwenden will (selbst clBtnFace ist möglich)

turboPASCAL 28. Jun 2010 17:40

AW: Auf Desktop zeichnen
 
Zitat:

- WS_EX_TRANSPARENT und WS_EX_LAYERED wird schon über TransparentColor=True als Style eingestellt.
Copy & Paste ... ;)

DeddyH 28. Jun 2010 18:02

AW: Auf Desktop zeichnen
 
Wie kann eine TColor true sein? :gruebel:

himitsu 28. Jun 2010 18:09

AW: Auf Desktop zeichnen
 
Zitat:

Zitat von DeddyH (Beitrag 1032149)
Wie kann eine TColor true sein? :gruebel:

TransparentColorValue ist die Farbe
und TransparentColor (ein Boolean) sagt, ob diese Farbe verwendet und die Form transparent dargestellt werden soll.

DeddyH 28. Jun 2010 18:13

AW: Auf Desktop zeichnen
 
Hatte ich nicht mehr im Kopf, aber ein gutes Beispiel für verwirrende Bezeichner, oder?

KahPee 28. Jun 2010 21:54

AW: Auf Desktop zeichnen
 
So da sind doch schon mal viele Ideen dabei. Ich denke mal ich erkläre meine geplante Anwendung genauer, weil dann stellt sich vielleicht auch deutlicher klar welche der genannten Möglichkeiten die geeignetste ist. Ich möchte ermöglichen, dass der Anwender bei dem Anzeigen von z.B.: Bildern skizzen auf den Bildschirm zeichnen kann (Anwendung bei einem Smartboard/Medientafel wie sie in Schulen vorkommen). Wenn dann das Programm wechselt sollen die Zeichnungen wieder verschwinden bzw. das ganze in den Hintergrund sausen. Zum Speichern der Skizzen habe ich bei einem Timage schon Funktionen geschrieben, denke mal sowas könnte man problemlos bei tcanvas auch benutzen.

mfg KahPee


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