![]() |
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? |
AW: Auf Desktop zeichnen
Mit einem transparentem TBitmap dürfte es gehn.
|
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; |
AW: Auf Desktop zeichnen
Delphi-Quellcode:
:stupid: ;)
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. |
AW: Auf Desktop zeichnen
- TImage auf Form klatschen
- Folgendes im OI einstellen
Delphi-Quellcode:
- WS_EX_TRANSPARENT und WS_EX_LAYERED wird schon über TransparentColor=True als Style eingestellt.
TForm
BorderStyle = bsNone WindowState = wsMaximized TransparentColor = true TransparentColorValue = (Color) FormStyle = fsStayOnTop TImage Align = alClient - 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) |
AW: Auf Desktop zeichnen
Zitat:
|
AW: Auf Desktop zeichnen
Wie kann eine TColor true sein? :gruebel:
|
AW: Auf Desktop zeichnen
Zitat:
und TransparentColor (ein Boolean) sagt, ob diese Farbe verwendet und die Form transparent dargestellt werden soll. |
AW: Auf Desktop zeichnen
Hatte ich nicht mehr im Kopf, aber ein gutes Beispiel für verwirrende Bezeichner, oder?
|
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 05:59 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-2025 by Thomas Breitkreuz