AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Auf Desktop zeichnen

Ein Thema von KahPee · begonnen am 28. Jun 2010 · letzter Beitrag vom 28. Jun 2010
Antwort Antwort
Seite 2 von 2     12   
blackfin
(Gast)

n/a Beiträge
 
#11

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 15:33
Edit: Ok, habs schon 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?

Geändert von blackfin (28. Jun 2010 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 15:45
Mit einem transparentem TBitmap dürfte es gehn.
$2B or not $2B
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#13

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 16:28
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;

Geändert von blackfin (28. Jun 2010 um 16:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#14

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 17:32
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#15

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 17:55
- 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)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#16

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 18:40
Zitat:
- WS_EX_TRANSPARENT und WS_EX_LAYERED wird schon über TransparentColor=True als Style eingestellt.
Copy & Paste ...
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.626 Beiträge
 
Delphi 12 Athens
 
#17

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 19:02
Wie kann eine TColor true sein?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#18

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 19:09
Wie kann eine TColor true sein?
TransparentColorValue ist die Farbe
und TransparentColor (ein Boolean) sagt, ob diese Farbe verwendet und die Form transparent dargestellt werden soll.
$2B or not $2B

Geändert von himitsu (28. Jun 2010 um 19:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.626 Beiträge
 
Delphi 12 Athens
 
#19

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 19:13
Hatte ich nicht mehr im Kopf, aber ein gutes Beispiel für verwirrende Bezeichner, oder?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#20

AW: Auf Desktop zeichnen

  Alt 28. Jun 2010, 22:54
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 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