Transparent auf Desktop zeichnen
spacer
Autor Nachricht
Stread
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mo 21.11.11 00:17 
Hi,
ich will eine Art Countdown auf den Desktop zeichnen.

Das Zeichnen auf den Desktop geht auch schon, ich sehe meine Schrift "transparent" auf dem Desktop, aaaber
nur beim allerersten mal wenn Windows 7 gestartet ist.

Wenn ich nun einen anderen Text auf die gleiche Stelle schreiben lassen will, wird der neue Text über den alten geschrieben. Beim dritten unterschiedlichen Wort habe ich dann 3 Texte gleichzeitig auf einer Stelle stehen. Wenn ich nun den Text nicht auf dem Desktop sondern auf dem Browser-Fenster ausgeben will, sehe ich das Bild mit meinem Desktophintergrund.
Auch wenn ich das Programm schließe und neustarte, das gleiche. Speichert Windows diese Bilder irgendwo und ruft sie immer wieder neu auf?

Beides mal das gleiche:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure DrawTextOnDesktop(TextToDraw: string) ;
var
Handle: HWND;
Dc: HDC;
ACanvas: TCanvas;
begin
Handle := GetDesktopWindow;
Dc := GetWindowDC(Handle) ;
ACanvas := TCanvas.Create;
try
ACanvas.Handle := DC;
BeginPath(ACanvas.Handle) ;
ACanvas.Font.Color := clRed;
ACanvas.Font.Name := 'Tahoma';
ACanvas.Font.Size := 30;
SetBkMode(ACanvas.Handle, TRANSPARENT) ;
EndPath(ACanvas.Handle) ;
ACanvas.TextOut(100, 500, TextToDraw) ;
finally
ReleaseDC(Handle, ACanvas.Handle) ;
ACanvas.Free;
end;
end;


ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TFormScreen.Button1Click(Sender: TObject);
var
DCanvas: TCanvas;
DHandle: HWND;
begin
DHandle:=GetDC(0);
if DHandle<>0 then
begin
try
DCanvas:=TCanvas.Create;
try
DCanvas.Handle:=DHandle;
DCanvas.Font.Color:=clRed;
DCanvas.Font.Size:=72;
DCanvas.Brush.Style:=bsClear;
DCanvas.TextOut(300, 100, 'Ein Schriftzug');
finally
DCanvas.Free;
end;
finally
if ReleaseDc(0, DHandle)<>1 then
RaiseLastOSError;
end;
end
else
RaiseLastOSError;
end;


Geht das nur mit Form in einer Farbe auffüllen in anderer Farbe das Label setzen und dann diese Form-Farbe transparent schalten?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mo 21.11.11 09:06 
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
Speichert Windows diese Bilder irgendwo und ruft sie immer wieder neu auf?
Nein, aber solange niemand den Fenstern darunter (z.B. dem Desktop) sagt, dass er sich neu zeichnen soll, kann das System ja nicht wissen, dass das nötig ist. Also bleibt die Schrift erhalten. Gib das einfach mal auf dem Canvas deines Formulars aus, dann siehst du das auch.
Du könntest das eventuell mit InvalidateRect lösen.

Oder du speicherst dir bei jedem Zeichnen den Bildschirmausschnitt und stellst ihn beim erneuten Zeichnen wieder her. Das birgt aber das Risiko, dass Zeichenfehler sichtbar werden, wenn der Benutzer Fenster verschiebt usw.

Die sinnvollere Lösung ist (auch aus Performancegründen) eher, ein transparentes Fenster zu benutzen.

// EDIT:
Nebenbei:
Wie selten willst du das denn zeichnen? Ich meine jedesmal den DC des Desktops holen, ein TCanvas erzeugen... :shock: Wie wäre es mit zwischenspeichern? Zum Beispiel in einer eigenen Klasse, die das Zeichnen handelt.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mo 21.11.11 18:21 
Refreshen würde ich es so
ausblenden Delphi-Quelltext markieren
1:
RedrawWindow(0, nil, 0, RDW_UPDATENOW or RDW_ALLCHILDREN or RDW_INVALIDATE or RDW_ERASE or RDW_INTERNALPAINT);


Ich versuche es gerade mit einem Transparenten Fenster.
Allerdings will ich die Main Form minimieren und die transparente Form mit der nicht-transparenten Schrift in den Vordergrund bringen.
Form2 (Transparent) ist auf WsMaximized und fsStayonTop
Egal ob ich bei Form1 Application.minimized oder wsminimized verwende. Ich sehe die Schrift auf Form 2 nur auf dem Desktop und nicht über einem anderen Fenster wie dem Browser.
Erst wenn ich Form 1 nicht minimiere sehe ich die Schrift wieder überall.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home