Ich möchte einen Picture-Picker bauen .
Urzustand ist ein normales Form mit einer Paintbox , die am Formrahmen verankert ist.
Auf Button-Klick soll an der Position der Paintbox ein Loch entstehen und bei erneutem Click alles in den Ursprung zurück versetzt werden.
Wichtig ist auch , das das Form-Resize sowohl mit Loch drinn , als auch im Orginalzustand funktionieren muss.
Das ganze Form muss sich auf dem Bildschirm verschieben lassen .
Das Form soll dann in der Application z.B. per Funktionstaste F-X aufpoppen und Stay-On-Top sein , also über der App schweben.
Das Form mit dem Loch darin sollte dann wie ein Bilderrahmen positioniert und vergrößert werden können , um einen bestimmten Bildausschnitt per Screenshot picken zu können .
Während der Screnn-Shot gemacht wird , sollte die Form kurz unsichtbar gemacht werden , damit man die Form selber nicht mit im Screenshot-Bild hat .
Ist das Screenshot-Bild gemacht , soll die Form auf Normalmodus schalten und das Pickbild in die Paintbox zeichnen .
Dann kann man dort noch was reinmalen und alles wegspeichern.
Bezüglich des Lochs im Form habe auch mal einen ersten Code geproggt , siehe unten .
Verwende dafür die Funktionen (CreateRectRgn , CombineRgn , SetWindowRgn) .
Es wird ein Loch gemacht und auf erneuten Button-Klick zurück in den Orginalzustand.
Problem:
Die Funktion SetWindowRgn erzeugt ein Aussehen wie zu Windows XP-Zeiten.
Positionen der Komponeneten werden verschoben , der Form-Rahmen wird rechts und unten abgeschnitten , so das man die Form nicht Resizen kann.
1) Kann man das ändern ?
2) Gibt es eine andere Möglichkeit ein Loch zu machen ?
3) Sollte unter WIN und Linux laufen
Gruß
Frank
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls ,
 LCLIntf,LCLType, ExtCtrls;
type
 { TForm1 }
 TForm1 = class(TForm)
  Button1: TButton;
  PaintBox1: TPaintBox;
  procedure Button1Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure PaintBox1Paint(Sender: TObject);
 private
 public
  loch:boolean;
 end;
var
 Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
  region1, region2: hrgn;
begin
 if loch
  then
   begin
    region1 := CreateRectRgn(0, 0, Width, Height);
    region2 := CreateRectRgn(paintbox1.Left,
                             paintbox1.top,
                             paintbox1.Width,
                             paintbox1.Height);
    CombineRgn(region1, region1, region2, RGN_DIFF);
    SetWindowRgn(Handle, region1, True);
   end
  else
   SetWindowRgn(Handle,0,True);
 loch:= not loch;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 loch:=true;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 paintbox1.Canvas.Brush.Color:=cllime;
 paintbox1.Canvas.FillRect(Rect(0,0,paintbox1.width,paintbox1.height));
end;
end.
 
 

 Verein
Verein 
 Links
Links Suche
Suche