Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bildschirmlupe - Bereich unter Formular ermitteln (https://www.delphipraxis.net/126586-bildschirmlupe-bereich-unter-formular-ermitteln.html)

Fussball-Robby 28. Dez 2008 23:05


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?

lbccaleb 29. Dez 2008 00:26

Re: Bildschirmlupe programmieren - aber wie?
 
Hey, vllt hilft dir das hier ein wenig weiter:

Bilddschirm-Lupe

Fussball-Robby 29. Dez 2008 01:22

Re: Bildschirmlupe programmieren - aber wie?
 
Zitat:

Zitat von lbccaleb
Hey, vllt hilft dir das hier ein wenig weiter:

Bilddschirm-Lupe

Das ist ja leider nicht VCL und mit OpenGL. Um den Effekt geht es mir aber in erster Linie nicht. Ich will eigentlich nur den Bereich unter meinem Formular ermitteln und am Besten in eine Bitmap bekommen.

Sunlight7 29. Dez 2008 04:21

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Meinst Du sowas?

Fussball-Robby 29. Dez 2008 11:54

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Sunlight7
Meinst Du sowas?

Exakt, sowas meine ich. Ist das von dir? Wenn ja, kannst du den Quelltext veröffentlichen? Ansonsten: Gibt es dazu irgendwo den Quelltext? Oder nur die wichtigsten Funktionen?

Garfield 29. Dez 2008 14:27

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
http://www.unvrai.com/zoom2.php
http://stefan.huberdoc.at/comp/softw...mcontrols.html

Sunlight7 30. Dez 2008 00:41

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Garfield

Das ist nich das, wonach er sucht

Zitat:

Zitat von Fussball-Robby
Zitat:

Zitat von Sunlight7
Meinst Du sowas?

Exakt, sowas meine ich. Ist das von dir? Wenn ja, kannst du den Quelltext veröffentlichen? Ansonsten: Gibt es dazu irgendwo den Quelltext? Oder nur die wichtigsten Funktionen?

Ja, das ist ein sehr altes Spielerei von mir, den QC hab ich nicht zur Hand, der is wohl noch auf dem altem Recnhner mit der kaputten GraKa :pale:

Garfield 30. Dez 2008 08:13

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Sunlight7
Zitat:

Zitat von Garfield

Das ist nich das, wonach er sucht

Sicher?

So etwas wie das erste als Tut: http://delphi.about.com/od/graphics/l/aa120198.htm

Sunlight7 30. Dez 2008 08:43

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Garfield
Sicher?

Ich mir? Ja :mrgreen:

Zitat:

Zitat von Fussball-Robby
Alles, was unter dem Formular ist, soll auf dem Formular vergrößert gezeichnet werden.

Dein 1. Link macht genaus das:
Zitat:

Zitat von Fussball-Robby
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.

Der 2. Link vergrößert ein (von Datei geladenes) Bitmap, das auf dem Formular gezeichnet wird.


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:

Garfield 30. Dez 2008 10:01

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Sunlight7
Zitat:

Zitat von Garfield
Sicher?

Ich mir? Ja :mrgreen:

Das ist schön. Aber was ist denn so anders daran? Anstelle der Cursorposition müsste doch nur der Mittelpunkt des Formulars verwendet werden!?

Sunlight7 30. Dez 2008 10:30

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);

Garfield 30. Dez 2008 13:42

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht so etwas wie im Anhang?

Delphi-Quellcode:
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;
Funktioniert nicht ganz zuverlässig. Man kann das Formular transparent lassen, allerdings ist dann die Bildqualität deutlich schlechter.

Garfield 30. Dez 2008 14:23

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:

Zitat von Sunlight7
Der 2. Link vergrößert ein (von Datei geladenes) Bitmap, das auf dem Formular gezeichnet wird.

Wäre also doch passend, da der Desktop nun ebenfalls als Bitmap vorliegt.

Garfield 30. Dez 2008 16:43

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich denke so geht's.
  • Formularhintergrund wird transparent und Image unsichtbar geschaltet.
  • Kurz warten, damit der wieder sichtbare Hintergrund gezeichnet wird.
  • Ein Hintergrundbild vom Desktop machen.
  • Den zu vergrößernden Ausschnitt in ein Bitmap kopieren.
  • Das Bitmap vergrößert in das Image kopieren.
  • Beim Formularhintergrund die Transparenz ab- und das Image sichtbar schalten.
  • Wieder von vorn anfangen.

taaktaak 30. Dez 2008 19:00

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...

Garfield 30. Dez 2008 19:43

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von taaktaak
Nun noch ein (rundes) Lupen-Formular, dann ist das schon gut zu verwenden!
:thumb:

Könnte man machen.

Zitat:

Zitat von taaktaak
Wozu aber die Beschränkung der Fensterbewegung?

Das Formular fing bei mir am Bildschirmrand an zu "Blinken". Kannst ja testen, wie es bei Dir ohne die procedure WMMoving aussieht.

Zitat:

Zitat von taaktaak
Wenn schon, dann sollte die Lupe auch auf dem 2ten und 3ten Monitor funktionieren...

:lol: Das ist nur eine Demo für den Threadstarter und ich habe nur einen Monitor.

Fussball-Robby 30. Dez 2008 19:48

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Garfield
Das ist nur eine Demo für den Threadstarter und ich habe nur einen Monitor.

Echt ein großes DANKE :thumb: Da hast du mir aber einiges an Such- und Programmierarbeit abgenommen, super :)
Ich melde mich eventuell nochmal wenn ich was draus gemacht habe :cyclops:

taaktaak 30. Dez 2008 19:54

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?

Garfield 30. Dez 2008 20:53

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.

taaktaak 30. Dez 2008 20:56

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Prima, Danke :hi:
Bin gespannt, ob sich damit die Probleme, die mein Programm unter VISTA hat, beseitigen lassen.

Namenloser 30. Dez 2008 22:07

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von taaktaak
Prima, Danke :hi:
Bin gespannt, ob sich damit die Probleme, die mein Programm unter VISTA hat, beseitigen lassen.

Glaube ich kaum, denn das Programm von Garfield funktioniert unter meinem Vista nciht richtig. Das Programm captured sich selbst, statt dem darunter liegenden Inhalt.

taaktaak 30. Dez 2008 22:09

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Ooooohhhh, schiete!
// edit: ... und zeigt damit genau das gleiche (Fehl-)Verhalten wie mein "rzMagnifier"

Garfield 30. Dez 2008 22:40

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Das kann unter XP genauso passieren. Deswegen

Delphi-Quellcode:
    img.Visible := False;
    Form1.TransparentColor := True;
    sleep(tmr.Interval div 2);
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.

taaktaak 30. Dez 2008 22:46

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Ahhh, interessant.
Na, das schaue ich mir morgen mal genauer unter XP und VISTA an

Garfield 30. Dez 2008 23:00

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Wenn ich das Formular transparent lasse, entfällt das Selbstcapture, aber die Bildqualität ist bescheiden.

Florian H 31. Dez 2008 02:23

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

turboPASCAL 31. Dez 2008 10:04

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

taaktaak 31. Dez 2008 11:35

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.

turboPASCAL 31. Dez 2008 15:32

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:

Garfield 31. Dez 2008 15:34

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von turboPASCAL
Das Programm arbeitet mit Regionen.

Das hatte ich auch versucht, aber ich werde da wohl einen grundsätzlichen Fehler drin haben. Deine Lupe sieht jedenfalls super aus!

Jetzt bin ich da angekommen:

DeddyH 31. Dez 2008 15:36

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von turboPASCAL
Ich bin ja schon auf der Fehler suche. Eine Lösung werde ich aber erst nächtes Jahr haben... :mrgreen:

So lange können wir nicht warten :mrgreen:

Garfield 31. Dez 2008 16:27

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Kannst ja mitmachen.

Hier zwei Open Source Delphi Projekte zum ansehen:

http://onscrmagnifier.sourceforge.net/
http://www.come.to/magnifier

Ansonsten einen guten Rutsch ins neue Jahr.

Namenloser 31. Dez 2008 16:33

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Garfield
http://www.come.to/magnifier

Das ist ja cool. Arbeitet absolut flüssig und funzt auch unter Vista. Ich frag mich wie die das gemacht haben :gruebel:

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"

Garfield 31. Dez 2008 18:26

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von NamenLozer
Ich frag mich wie die das gemacht haben :gruebel:

Einfach mal nachschauen.

Namenloser 31. Dez 2008 20:59

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Garfield
Zitat:

Zitat von NamenLozer
Ich frag mich wie die das gemacht haben :gruebel:

Einfach mal nachschauen.

Nicht nötig. Die machen einfach einen Screenshot, den sie dann vergrößern, wie gesagt.

Garfield 31. Dez 2008 21:13

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von NamenLozer
Nicht nötig. Die machen einfach einen Screenshot, den sie dann vergrößern, wie gesagt.

Das macht mein Beispiel oben auch. Interessant ist die Aktualisierung des Bildes. turboPASCALs Magnifier wird nur aktualisiert, wenn das Formular bewegt wird. Mein Beispiel wird mittels Timer aktualisiert, was teilweise zum Selbstcapture oder zu leeren Bildern führt.

Namenloser 1. Jan 2009 00:12

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Garfield
Zitat:

Zitat von NamenLozer
Nicht nötig. Die machen einfach einen Screenshot, den sie dann vergrößern, wie gesagt.

Das macht mein Beispiel oben auch. Interessant ist die Aktualisierung des Bildes. turboPASCALs Magnifier wird nur aktualisiert, wenn das Formular bewegt wird. Mein Beispiel wird mittels Timer aktualisiert, was teilweise zum Selbstcapture oder zu leeren Bildern führt.

Nein. Dein Beispiel macht permanent einen Screenshot und vergrößert sich deshalb selbst. Das verlinkte Tool macht nur beim Aufrufen der Lupe einen Screenshot, genauergesagt vor dem Aufrufen. Danach wird einfach ein fenster mit dem Screenshot StayOnTop gesetzt und eine Lupe drauf gemalt.

[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]

Garfield 1. Jan 2009 08:32

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von NamenLozer
Nein. Dein Beispiel macht permanent einen Screenshot und vergrößert sich deshalb selbst.

Ganz so ist es nicht. Der Hintergrund des Formulars wird vor dem Screenshot transparent geschaltet und darin scheint das Problem zu bestehen.

Zitat:

Zitat von NamenLozer
Das verlinkte Tool macht nur beim Aufrufen der Lupe einen Screenshot, genauergesagt vor dem Aufrufen. Danach wird einfach ein fenster mit dem Screenshot StayOnTop gesetzt und eine Lupe drauf gemalt.

Solange sich nichts ändert ist das in Ordnung.

Zitat:

Zitat von NamenLozer
Ich hab mich von der Idee mit dem einmaligen Screenshot inspirieren lassen, ...

Mal anschauen.

Nachtrag: Scheint auch nicht das wahre zu sein (siehe Anhang).

Garfield 1. Jan 2009 09:08

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von NamenLozer
Autsch, ich merk grad, die scheinen eifnach nen Screenshot zu machen. Die animierten Gifs im Borwser halten nämlich bei der Benutzung an.

Es gibt auch einen dynamischen Modus mit DDraw Overlay. Allerdings fehlt in der Source das entsprechende Plugin.

Ein Java-Programm: http://www.planet-source-code.com/vb...=4153&lngWId=2 - Aktualisiert sich auch nicht selbstständig.

Zitat:

Zitat von NamenLozer
Und das andere hat auch wieder "das Problem"

Funktioniert bei mir unter XP tadellos.

turboPASCAL 1. Jan 2009 10:16

Re: Bildschirmlupe - Bereich unter Formular ermitteln
 
Zitat:

Zitat von Garfield
turboPASCALs Magnifier wird nur aktualisiert, wenn das Formular bewegt wird.

Nein, auch wenn wenn man die die Lupe nicht bewegt wird diese aktualisiert. Es hann sich ja in der Zwischenzeti etwas im Hintergrund, also unter
der Lupe ändern.

Delphi-Quellcode:
procedure TfrmMagnifier.Timer1Timer(Sender: TObject);
begin
  if Timer1.Tag < 0 then exit; // if Error then exit

  UpdateMagnifier;
  _Invalidate;
end;
Sie funktioniert ja nur eben nicht zusammen mit Aero.




Zitat:

ganz so ist es nicht. Der Hintergrund des Formulars wird vor dem Screenshot transparent geschaltet und darin scheint das Problem zu bestehen.
Hui, das flackert schön. ;)

Zitat:

dem Screenshot transparent geschaltet und darin scheint das Problem zu bestehen.
Aber nicht vom gesamten Screen oder ? Das ist/wäre Resourcenverschwendung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 Uhr.
Seite 1 von 3  1 23      

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