Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Desktop Canvas Clear ? (https://www.delphipraxis.net/89975-desktop-canvas-clear.html)

ebber 9. Apr 2007 20:15


Desktop Canvas Clear ?
 
Hallo

ich habe so was auf den Desktop gezeichnet

Delphi-Quellcode:

var
DP: TCanvas;
begin
  DP := TCanvas.Create;
  DP.Handle := GetDC(0);
  DP.font.Height:=(40);
  DP.font.Name:=('Verdana');
  DP.font.Color:=(cllime);
  DP.font.Style:=[fsBold];
  DP.TextOut(round(Screen.width/2-150),round(Screen.height/2+Screen.height/4),'Laustärke :'+inttostr(100-round(100/72*Form2.Trackbar1.position))+' %');
  ReleaseDC(0, DP.Handle);
  DP.Handle := 0;
  DP.Free;
end;

wie bekomme ich das wieder weg ?

MfG

bitsetter 9. Apr 2007 21:00

Re: Desktop Canvas Clear ?
 
Hallo,

versuche es doch mal hiermit:
Der Desktop wird neu gezeichnet

ebber 9. Apr 2007 21:09

Re: Desktop Canvas Clear ?
 
Mit

Delphi-Quellcode:
invalidaterect(windowfromdc(0), nil, false);
würde es gehen aber der ganze Desktop flimmert dann immer kurz auf.

Könnte man es vielleicht mit transparenter Farbe übermalen ? Ich hab das mit clnone probiert aber dann wird es schwarz.

MfG

ebber 20. Apr 2007 13:49

Re: Desktop Canvas Clear ?
 
Das muss doch irgendwie gehen oder ? Vielleicht wenn man das anders draufzeichnet ?

Oder kann man wenigstens nur einen Teil des Desktops neuzeichen ?

MfG

Robert Marquardt 20. Apr 2007 13:55

Re: Desktop Canvas Clear ?
 
Denken hilft. Ich wuerde mal InvalidateRect in der Win32-Hilfe nachschlagen. Fuer irgendwas muss der Namensbestandteil "Rect" doch gut sein.

ebber 20. Apr 2007 14:43

Re: Desktop Canvas Clear ?
 
Gibt es keine andere möglichkeit ? Wer eine Logitech Tastatur hat, die hat ja auch so eine Anzeige auf dem Desktop und da geht das auch gut ?

---

Ich habe das jetzt gemacht aber irgendwie wills nicht gehen.

Delphi-Quellcode:

var rectnz:PRect;

begin

rectnz.Top:=5;
rectnz.Bottom:=10;
rectnz.Left:=5;
rectnz.Right:=20;

invalidaterect(windowfromdc(0), rectnz, false);
Was habe ich falsch gemacht ?

MfG

SirThornberry 20. Apr 2007 14:47

Re: Desktop Canvas Clear ?
 
wenn ich es mit den obirgen koordinaten für die Textausgabe vergleiche würde ich sagen es liegt an dem bereich den du neu zeichnen lässt.

Robert Marquardt 20. Apr 2007 14:50

Re: Desktop Canvas Clear ?
 
Der Code ist ja auch falsch.
Delphi-Quellcode:
var
  rectnz: TRect;
begin
  rectnz.Top:=5;
  rectnz.Bottom:=10;
  rectnz.Left:=5;
  rectnz.Right:=20;
  InvalidateRect(WindowFromDC(0), @rectnz, false);

ebber 20. Apr 2007 15:01

Re: Desktop Canvas Clear ?
 
Es ging nicht weil ein Fehler kam nicht weil es da nicht neugezeichnet wurde.
So geht es zwar ohne Fehler, aber irgendwie wird immer noch der ganze Desktop neugezeichnet und es flimmert weiterhin kurz auf.


Zitat:


msdn:

Parameters

hWnd
[in] Handle to the window whose update region has changed. If this parameter is NULL, the system invalidates and redraws all windows, and sends the WM_ERASEBKGND and WM_NCPAINT messages to the window procedure before the function returns.

Hat es vielleicht was damit zu tun ?


MfG

SirThornberry 20. Apr 2007 15:22

Re: Desktop Canvas Clear ?
 
Zitat:

...Wer eine Logitech Tastatur hat, die hat ja auch so eine Anzeige...
da ist es auch viel einfacher. Man nimmt einfach ein Form, setzt die TransparentColor auf die Farbe des Forms und setzt Alphablend auf True.
Somit wird alles Transparent/durchklickbar was die Farbe TransparentColor hat.

ebber 20. Apr 2007 21:28

Re: Desktop Canvas Clear ?
 
Ich habe nun so eine Form gemacht. Ich habe aber noch 1 Problem.

Wenn ich Form.Show mache dann drängt sich die Form immer in den Fordergrund. Also es geht der Focus drauf. Kann man das irgenwie unterbinden ?

MfG

bitsetter 20. Apr 2007 22:22

Re: Desktop Canvas Clear ?
 
Hi,

es mag ja noch was besseres geben, aber so müsste es auch gehen:
Delphi-Quellcode:
  private
    OldWindowProc: TWndMethod;
    procedure SubClassWndProc(var Message: TMessage);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SubClassWndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_WINDOWPOSCHANGED:
    begin
      SetWindowPos(Form1.Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE);
      Form1.WindowProc:= OldWindowProc;
    end;
  end;
  OldWindowProc(Message);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldWindowProc:= Form1.WindowProc;
  Form1.WindowProc:= SubClassWndProc;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Form1.WindowProc:= OldWindowProc;
end;


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