![]() |
Bildschirmlupe - Bereich unter Formular ermitteln
Hey,
ich habe vor, eine Bildschirmlupe zu programmieren. Ich weiß, man findet einige Codes, aber ich will mein Formular echt als Lupe benutzen: Alles, was unter dem Formular ist, soll auf dem Formular vergrößert gezeichnet werden. Alle Lösungen, die ich bisher gefunden habe, Können einen Abschnitt des Monitors vergrößern - nicht aber den Bereich unter dem Formular, ohne dieses zu berücksichtigen. Wie kann man das - erstmal rein theoretisch - angehen? |
Re: Bildschirmlupe programmieren - aber wie?
|
Re: Bildschirmlupe programmieren - aber wie?
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Meinst Du sowas?
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
So etwas wie das erste als Tut: ![]() |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Zitat:
Zitat:
Vllt baue ich per Gelegenheit die Festplaten des Oldies aus und guck da drauf nach dem Projekt, aber dieses Jahr komm ich wohl eher nicht mehr dazu :lol: |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Er will den Bereich, an dem sein Fenster auf dem Bildschirm ist, so (vergrößert) auf seinem Fenster zeichnen, als wäre sein Fenster gar nicht da, also das, was sich unterhalb von seinem Fenster befindet, sprich das, was man sehen würde wenn sein Fenster nicht da wäre.
In Delphi Spache etwa so:
Delphi-Quellcode:
Form1.Hide;
CaptureScreenRect(Bit, Form1.BoundsRect); Form1.Show; Canvas.Draw(0, 0, Bit); |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht so etwas wie im Anhang?
Delphi-Quellcode:
Funktioniert nicht ganz zuverlässig. Man kann das Formular transparent lassen, allerdings ist dann die Bildqualität deutlich schlechter.
procedure TForm1.ontmr(Sender: TObject);
var SrcRect : TRect; DestRect : TRect; tmpCanvas : TCanvas; hDesktop : Hwnd; begin if (frmTop <> Form1.Left) or (frmLeft <> Form1.Top) then begin frmTop := Form1.Left; frmLeft := Form1.Top; img.Visible := False; Form1.TransparentColor := True; hDesktop := GetDesktopWindow; DestRect := img.Canvas.ClipRect; SrcRect.Left := img.ClientOrigin.X + (img.Width div 4); SrcRect.Top := img.ClientOrigin.Y + (img.Height div 4); SrcRect.Right := SrcRect.Left + (img.Width div 2); SrcRect.Bottom := SrcRect.Top + (img.Height div 2); tmpCanvas := TCanvas.Create; try tmpCanvas.Handle := GetDC(GetDesktopWindow); img.Canvas.CopyRect(DestRect, tmpCanvas, SrcRect); finally ReleaseDC(hDesktop, tmpCanvas.Handle); tmpCanvas.Free; end; Application.ProcessMessages; img.Visible := True; Form1.TransparentColor := False; end; end; |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Damit sieht es besser aus:
Delphi-Quellcode:
procedure TForm1.ontmr(Sender: TObject);
const factor = 2; var SrcRect : TRect; DestRect : TRect; hDesktop : Hwnd; dcDesktop : HDC; begin if (frmTop <> Form1.Left) or (frmLeft <> Form1.Top) then try frmTop := Form1.Left; frmLeft := Form1.Top; img.Visible := False; Form1.TransparentColor := True; hDesktop := GetDesktopWindow; dcDesktop := GetWindowDC(hDesktop); SrcRect.Left := img.Width div (factor * 2); SrcRect.Top := img.Height div (factor * 2); SrcRect.Right := SrcRect.Left + (img.Width div factor); SrcRect.Bottom := SrcRect.Top + (img.Height div factor); DestRect := img.Canvas.ClipRect; bmp.Width := DestRect.Right - DestRect.Left; bmp.Height := DestRect.Bottom - DestRect.Top; BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, dcDesktop, img.ClientOrigin.X, img.ClientOrigin.Y, srcCopy); img.Canvas.CopyRect(DestRect, bmp.Canvas, SrcRect); finally ReleaseDC(dcDesktop, hDesktop); img.Visible := True; Form1.TransparentColor := False; end; end; Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Ich denke so geht's.
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Nun noch ein (rundes) Lupen-Formular, dann ist das schon gut zu verwenden!
:thumb: Wozu aber die Beschränkung der Fensterbewegung? Wenn schon, dann sollte die Lupe auch auf dem 2ten und 3ten Monitor funktionieren... |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Zitat:
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Ich melde mich eventuell nochmal wenn ich was draus gemacht habe :cyclops: |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Ja, dem DANKE schließe ich mich natürlich an!
@Garfield: Vielleicht kann ich es beim rzMagnifier noch einbauen, wenn du nichts dagegen hast? |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Bitte. Ich freue mich, dass ich helfen konnte. :thumb:
@ taaktaak, selbstverständlich kannst Du es nutzen. Dazu ist es doch da. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Prima, Danke :hi:
Bin gespannt, ob sich damit die Probleme, die mein Programm unter VISTA hat, beseitigen lassen. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Ooooohhhh, schiete!
// edit: ... und zeigt damit genau das gleiche (Fehl-)Verhalten wie mein "rzMagnifier" |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Das kann unter XP genauso passieren. Deswegen
Delphi-Quellcode:
Ich habe hier einen Athlon XP 2000+, GeForce 2 und 22" LCD. Wenn ich das Formulars des Programmes, so wie es oben zum Download steht, über das Antwortformular der Delphi-Praxis schiebe, captured es sich selbst. Ich muss den Timer-Intervall hochsetzen, damit es nicht passiert.
img.Visible := False;
Form1.TransparentColor := True; sleep(tmr.Interval div 2); |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Ahhh, interessant.
Na, das schaue ich mir morgen mal genauer unter XP und VISTA an |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Wenn ich das Formular transparent lasse, entfällt das Selbstcapture, aber die Bildqualität ist bescheiden.
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
@Garfield: Bei mir flackern in der Titelleiste deines Programmes die oberen 2-3 Pixel-Reihen sehr schnell (Augenkrebs!) .. habe XP Prof mit einem Nicht-Standardtheme, das sich aber nicht sonderlich von den Windows-Themes unterscheidet.
Grüßle |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hatte mir mal eine schöne Bildschirmlupe gebastelt, leider funktioniert diese nicht richtig unter Vista.
Das liegt das an dem Aero-Zeugs bzw. der DirectX-Umgebung. Das Programm arbeitet mit Regionen. Zum testen, Aero unter Vista ausschalten. (zB. in einer Verkn. die Desktopgestaltung deaktivieren) Auf der Lupe mit rechter Maus oder im Trayicon kann man das Menue aufrufen. Mausrad = Zoom |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Hallo Matti,
das ist tatsächlich auch eine schöne Lupe! :thumb: Es wäre sehr interessant zu erfahren, warum das Grundprinzip, egal ob das Bild direkt über der Capture-Position oder in einem separaten FENSTER dargestellt, unter VISTA (+Aero) nicht mehr einwandfrei funktioniert. Da ich meinen rzMagnifier regelmäßig selbst verwende, wäre es natürlich noch besser, eine alternative Vorgehensweise zu finden, die unter XP und VISTA (mit/ohne Aero) funktioniert - ich habe die Hoffnung noch nicht aufgegeben, vielleicht bringt das Neue Jahr ja neue Erkenntnisse. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Ich bin ja schon auf der Fehler suche. Eine Lösung werde ich aber erst nächtes Jahr haben... :mrgreen:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Jetzt bin ich da angekommen: |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Kannst ja mitmachen.
Hier zwei Open Source Delphi Projekte zum ansehen: ![]() ![]() Ansonsten einen guten Rutsch ins neue Jahr. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Autsch, ich merk grad, die scheinen eifnach nen Screenshot zu machen. Die animierten Gifs im Borwser halten nämlich bei der Benutzung an. Und das andere hat auch wieder "das Problem" |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
[Edit] Ich hab mich von der Idee mit dem einmaligen Screenshot inspirieren lassen, und mich auch mal an einer Lupe versucht. Beim Start wird ein Screenshot gemacht, der in einem Buffer gespeichert wird. Wenn die Lupe bewegt wird, wird ein neuer Screenshot in einen zweiten Buffer gespeichert. Dann wird der Teil, der von der Lupe selbst verdeckt wird, von dem alten Buffer auf den neuen Buffer kopiert. Dann wird der neue Bufefr auf den alten Buffer und auf das Formular kopiert. Der angezeigte Ausschnitt ist also einigermaßen aktuell, allerdings gibt es immer noch Probleme, wenn direkt unter der Lupe eine Animation ist... dann hat man eben wieder ein Standbild. Aber immer noch besser, als wenn der ganze Bildschirm stillsteht wie in dem verlinkten Programm. Source+Exe sind im Anhang. [/Edit] [Edit] Mit den Tasten + und - lässt sich der Zoomfaktor einstellen (von 1x bis 8x). [/Edit] |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
Nachtrag: Scheint auch nicht das wahre zu sein (siehe Anhang). |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Ein Java-Programm: ![]() Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
der Lupe ändern.
Delphi-Quellcode:
Sie funktioniert ja nur eben nicht zusammen mit Aero.
procedure TfrmMagnifier.Timer1Timer(Sender: TObject);
begin if Timer1.Tag < 0 then exit; // if Error then exit UpdateMagnifier; _Invalidate; end; Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 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