GetDC, Canvas, bsclear
Hi,
ich sende per
Code:
und
Canvas.Handle := GetDC(FremdesFenster.Handle);
Code:
einen String Str an ein FemdesFenster. Den Hintergrund des Canvas mache ich mit
Canvas.TextRect(TheRect,x,y,Str);
Code:
transparent. Nun wird alle paar Sekunden was Neues auf das fremde Fenster geschrieben.
C.brush.style:=bsclear;
Nun würde ich gerne den vorher geschriebenen Text löschen, weil der sonst immer auf dem fremden Fenster bleibt und nur vom neuen Text überschrieben wird, der Hintergrund wird ja nicht neu gezeichnet. Ne Idee, wie man sowas machen kann? Schanke Dön!! |
Re: GetDC, Canvas, bsclear
Hi,
du kannst ja mal versuchen ob ein RedrawWindow() hilft. Mit InvalidateRect könntest du es ansonsten auch noch versuchen. |
Re: GetDC, Canvas, bsclear
oder du speicherst dir den Hintergrund und malst ihn auch immer mit zurück.
|
Re: GetDC, Canvas, bsclear
Hm, beides klingt gut, ich hab aber keine Ahnung, wie ich das umsetzen soll. :oops:
|
Re: GetDC, Canvas, bsclear
Für InvalidateRect():
Delphi-Quellcode:
Die Größe des Bildausschnitts welcher aktualisiert werden soll, kannst du selber noch verkleinern.
var
Rect: TRect; begin GetWindowRect(FremdesFenster.Handle, Rect); Rect.Bottom:= Rect.Bottom- Rect.Top; Rect.Right:= Rect.Right- Rect.Left; Rect.Top:= 0; Rect.Left:= 0; invalidateRect(FremdesFenster.Handle, @Rect,true); Für RedrawWindow():
Delphi-Quellcode:
Da wird gleich das gesamte Fenster sowie allen WinControls darauf neugezeichnet.
RedrawWindow(FremdesFenster.Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN);
|
Re: GetDC, Canvas, bsclear
kleine Bemerkung am Rande...
Zitat:
ich habe das gebaucht, um ein gitter, welches über ein form inkl. aller darauf befindlichen Controls gemalt (konnte also das form.canvas nicht verwenden) wurde, wieder zu löschen. in dem Fall gings nur mit RedrawWindow sauber...invalidaterect auf das form-Handle angewand, hat nur das form, aber nicht die Controls darauf neu gezeichnet... hing da auch ne Weile dran :) Gruß Frank |
Re: GetDC, Canvas, bsclear
Hi,
danke für die Tipps, aber beim Test gerade flackert bei beiden Versionen der Bildschirm, weil offensichtlich ständig das gesamte Fenster refresht wird. Bei
Delphi-Quellcode:
wie wird denn da das refreshen auf das Rect beschränkt? Oder is das ne dumme Frage?
RedrawWindow(FremdesFenster.Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN);
Gruß |
Re: GetDC, Canvas, bsclear
Hi,
Delphi-Quellcode:
Den Bildausschnitt müsstest du dann noch anpassen;
var
Rect: TRect; begin GetWindowRect(Handle, Rect); Rect.Bottom:= Rect.Bottom- Rect.Top; Rect.Right:= Rect.Right- Rect.Left; Rect.Top:= 0; Rect.Left:= 0; RedrawWindow(FremdesFenster.Handle, @Rect, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN); Du sagst das flackert, hast du etwa versucht den Desktop neu zu zeichnen oder etwa ein anderes Fenster? Wenn der ganze Bildschirm flackert wird meistens der Desktop neugezeichnet. Normalerweise wird aber nur ein Ausschnitt vom fremden Fenster aktualisiert. Zitat:
|
Re: GetDC, Canvas, bsclear
wie ich schon sagte, ich hab das Screen-Canvas (getDC(0)) verwendet und InvalidateRect mit der Position meines zu refreshenden Fensters gefüttert...
mit RedrawWindow hats dann super funktioniert... pseudocode (wo die Symbole geflackert haben):
Delphi-Quellcode:
gruß Frank
GetWindowRect(Handle, Rect);
invalidateRect(GetDC(0), @Rect,true); |
Re: GetDC, Canvas, bsclear
Hi,
bei deinem Code passiert bei mir gar nichts. Müsste es nicht eher so gehen
Delphi-Quellcode:
dann flackert jedoch garantiert der ganze Bildschirm kurz auf.
invalidateRect(WindowFromDC(0), @Rect, true);
|
Re: GetDC, Canvas, bsclear
Hi
geht leider immer noch nicht. Immer flackert der ganze Bildschirm. Hab keine Idee mehr, wer hat noch eine?? Danke. |
Re: GetDC, Canvas, bsclear
Hi,
wie ermittelst du denn das Handle des fremden Fensters? Edit: Der Code aus Beitrag #8 sollte nämlich ohne flackern funktionieren. |
Re: GetDC, Canvas, bsclear
Hi, sorry, bin gestern gleich offline gegangen, hätt ich gewusst, dass ich noch ne Antwort bekomme, wäre ich noch wach geblieben. Das Handle ermittle ich im Prinzip so:
Delphi-Quellcode:
Gruß
//fill in the listview with all the information
procedure TMainForm.WriteText(Wnd: HWnd); var pcWinText : PChar; NewItem : TListItem; aProcessEntry32 : TProcessEntry32; aSnapshotHandle : THandle; WinVersion : DWord; ProcessID : longint; ContinueLoop : boolean; begin NewItem:=ListView.Items.Add; {Is Window Visible?} NewItem.Checked:=IsWindowVisible(wnd); {WindowCaption} pcWinText:= StrAlloc(102); GetWindowText(Wnd, pcWinText, 100); NewItem.Caption:=StrPas(pcWinText); StrDispose(pcWinText); {WindowClassName} pcWinText:= StrAlloc(102); GetClassName(Wnd, pcWinText, 100); NewItem.SubItems.Add(StrPas(pcWinText)); StrDispose(pcWinText); {WindowHandle} NewItem.SubItems.Add(IntToHex(wnd, 8)); {WindowThreadProcessID} GetWindowThreadProcessID(wnd,@ProcessID); NewItem.SubItems.Add(IntToHex(ProcessID, 8)); {WindowsVersion} WinVersion:=GetProcessVersion(ProcessID); NewItem.SubItems.Add(IntToStr(WinVersion shr 16)+'.'+IntToStr(WinVersion mod $1000)); {CommandLine} {According to Christian Kästner:} aSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); aProcessEntry32.dwSize := Sizeof(aProcessEntry32); ContinueLoop := Process32First(aSnapshotHandle, aProcessEntry32); while integer(ContinueLoop) <> 0 do begin if aProcessEntry32.th32ProcessID = ProcessID then NewItem.SubItems.Add(ExtractFileName(aProcessEntry32.szExeFile)); ContinueLoop := Process32Next(aSnapshotHandle,aProcessEntry32); end; CloseHandle(aSnapshotHandle); {end of Chrstian's stuff} end; |
Re: GetDC, Canvas, bsclear
Fuuuuuuuuuuuunzt!!
Ohne wackeln und zappeln des fremden Fensters. Geht tatsächlich mit
Delphi-Quellcode:
Man muss bei GetWindowRect auch das Handle des fremden Fensters angeben!!
var
Rect: TRect; begin GetWindowRect(FremdesFenster.Handle, Rect); Rect.Bottom:= Rect.Bottom- Rect.Top; Rect.Right:= Rect.Right- Rect.Left; Rect.Top:= 0; Rect.Left:= 0; RedrawWindow(FremdesFenster.Handle, @Rect, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN); Danke bitsetter!! Liebe Grüße |
Re: GetDC, Canvas, bsclear
Hi,
in der Form wie du den Code jetzt hast, könntest du die Variable Rect gleich ganz weglassen und stattdessen nil nehmen. Die brauchst du eigentlich nur, wenn du innerhalb des fremden Fensters nur einen bestimmten Bereich neuzeichnen möchtest. Zum Beispiel wenn du auf einem fremden Fenster einen Text zeichnest und du nur den Bereich auf dem sich der Text befindet neuzeichnen möchtest. Dazu müsstest du Rect allerdings dementsprechend neu berechnen, da jetzt das ganze Fenster neugezeichnet wird. RDW_FRAME kann man wohl auch noch weglassen wenn man die Funktion mit der Variable Rect aufruft. Edit: das hätte auch gereicht:
Delphi-Quellcode:
var
Rect: TRect; begin Windows.GetClientRect(FremdesFenster, Rect); ... RedrawWindow(FremdesFenster, @Rect, 0, RDW_ERASE or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN); |
Re: GetDC, Canvas, bsclear
Äh, nochmal ne Frage.
Ich zeichne mit
Delphi-Quellcode:
den Text Str im Rechteck Rect in ein fremdes Fenster. C ist ein TCanvas. Genau diesen Text im will ich nun wieder löschen. Wie muss ich das den anstellen? Wenn ich das Rect an deine Proc übergebe, wird der Text nicht überschreiben, is wahrscheinlich an der falschen Stelle, das Rechteck.
C.Handle := GetDC(FremdesFenster.Handle);
C.TextRect(Rect,PointX,PointY,Str); |
Re: GetDC, Canvas, bsclear
Komisch bei mir geht es:
Delphi-Quellcode:
Nach 2 sec wurde der Text wieder gelöscht.
C.Handle := GetDC(FremdesFenster);
C.TextRect(Rect,PointX,PointY,Str); sleep(2000); RedrawWindow(FremdesFenster, @Rect, 0, RDW_ERASE or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 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