Delphi-PRAXiS
Seite 2 von 10     12 34     Letzte »    

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)

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 Uhr.
Seite 2 von 10     12 34     Letzte »    

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