2016-07-08 18 views
8

Ich habe Code, der einen bestimmten Bereich empfängt, der bereits zuvor auf der Serverseite definiert wurde, und erstellt ein Loch in Form auf der Clientseite. Stattdessen möchte ich eine Bildschirmaufnahme von diesem Bereich erhalten, aber ohne erscheint meine Form im Endergebnis, wie eine normale Desktop-Aufnahme, aber in diesem Fall wird nur dieser kleine Bereich erfasst.Wie erstellt man einen Screenshot eines bestimmten Bereichs?

Also, wie kann ich dies meinen Code unten dafür anpassen?

procedure TForm1.CS1Read(Sender: TObject; Socket: TCustomWinSocket); 
var 
    X1, X2, Y1, Y2: Integer; 
    List: TStrings; 
    FormRegion, HoleRegion: HRGN; 
    StrCommand: String; 
begin 
    StrCommand := Socket.ReceiveText; 

    if Pos('§', StrCommand) > 0 then 
    begin 
    List := TStringList.Create; 
    try 
     FormRegion := CreateRectRgn(0, 0, Form12.Width, Form12.Height); 
     ExtractStrings(['§'], [], PChar(StrCommand), List); 

     X1 := StrToIntDef(List[0], 0) - Form12.Left - 2; 
     Y1 := StrToIntDef(List[1], 0) - Form12.Top - 2; 
     X2 := StrToIntDef(List[2], 0) - Form12.Left - 2; 
     Y2 := StrToIntDef(List[3], 0) - Form12.Top - 2; 

     HoleRegion := CreateRectRgn(X1, Y1, X2, Y2); 
     CombineRgn(FormRegion, FormRegion, HoleRegion, RGN_DIFF); 
     SetWindowRgn(Form12.Handle, FormRegion, True); 
    finally 
     List.Free; 
    end; 
    end; 
end; 

Antwort

6

Ich habe nicht alle Ihre fremden Informationen, aber ich kann Ihnen zeigen, wie Sie den Inhalt einer Region in eine Bitmap zu erfassen. Sie müssen die Koordinaten natürlich entsprechend Ihren Bedürfnissen anpassen. Möglicherweise möchten Sie unter GetRgnBox sehen, wie Sie das Begrenzungsrechteck der gesamten Region erhalten, nachdem Sie sie kombiniert haben. Mein Beispiel tut dies nicht, weil ich eine einzelne Region habe.

Das Beispiel erfordert zwei TButtons und eine TImage in einem Formular. Ich habe das Formular angepasst und die drei Komponenten im Code gefunden, sodass ein DFM nicht erforderlich ist. Sie müssen die Komponenten in einem Formular löschen und die Ereignishandler jedoch verbinden. :-)

Wenn Sie auf Button1 klicken, wird ein rechteckiger Bereich auf dem Formular erstellt und mit einem Gittermuster aus roten Linien und ein wenig Text gefüllt, um festzulegen, wo sich die Region befindet. Durch Klicken auf die zweite Schaltfläche wird eine Kopie des Inhalts dieser Region in einer Bitmap erstellt und diese Bitmap dem Bildsteuerelement zugewiesen.

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Button2: TButton; 
    Image1: TImage; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    private 
    { Private declarations } 
    // Region coords 
    R: TRect; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

// Create the region (hole) 
procedure TForm1.Button1Click(Sender: TObject); 
var 
    Region: HRGN; 
begin 
    Canvas.TextOut(R.Left + 60, R.Top + 60, 'Test text'); 
    Canvas.Brush.Style := bsCross; 
    Canvas.Brush.Color := clRed; 
    Region := CreateRectRgn(R.Left, R.Top, R.Right, R.Bottom); 
    { 
    Note: Normally you'd want to check the result of the above API call 
    and only proceed if it's not NULL (0). You'd also want to use a 
    try..finally to make sure that the region was deleted properly. 
    Omitted here because 
     a) This code was tested to work properly, and 
     b) It's a demo app for doing something with the region and 
     nothing else. If the call to create the region fails, the 
     app is useless, and you'll close it anyway, which means 
     the region will be automatically destroyed. 
    } 
    FillRgn(Canvas.Handle, Region, Canvas.Brush.Handle); 
    DeleteObject(Region); 
    Button2.Enabled := True; 
end; 

// Capture the region (hole) and display in the TImage. 
procedure TForm1.Button2Click(Sender: TObject); 
var 
    Bmp: TBitmap; 
begin 
    Bmp := TBitmap.Create; 
    try 
    Bmp.SetSize(R.Right - R.Left, r.Bottom - R.Top); 
    Bmp.Canvas.CopyRect(Rect(0, 0, Bmp.Width, Bmp.Height), Canvas, R); 
    Image1.Picture.Assign(Bmp); 
    finally 
    Bmp.Free; 
    end; 
end; 

// Set up the coordinates for the region (hole) in the form 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
    R := Rect(10, 40, 175, 175); 
    // Size the image we'll use later to fit the rectangle. We set 
    // the position below. 
    Image1.Width := R.Right - R.Left; 
    Image1.Height := R.Bottom - R.Top; 

    Self.Height := 375; 
    Self.Width := 350; 
    Button1.Left := 238; 
    Button1.Top := 16; 
    Button2.Left := 238; 
    Button2.Top := 48; 
    Image1.Left := 160; 
    Image1.Top := 190; 
    // Disable the second button until the first has been clicked 
    Button2.Enabled := False; 
end; 

end. 
+0

vielen dank freund. –