Autor Beitrag
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
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(100500, TextToDraw) ;
    finally
      ReleaseDC(Handle, ACanvas.Handle) ;
      ACanvas.Free;
    end;
 end;


ausblenden Delphi-Quelltext
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(300100'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?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), 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.
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
1:
RedrawWindow(0nil0, 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.