フォーム全体ではなく、特定のコントロールをキャプチャーするには?

解決


AY  2004-09-16 19:45:13  No: 10930

色々参考にさせて頂き、デスクトップ全体やアクティブウインドウをキャプチャーすることは可能でした。
今回、自フォーム上のボタンをクリックしたら、自フォーム上のパネル(パネルの上にチャートを表示している)のみを、キャプチャーしたいのですが
特定の、コントロールのみキャプチャーする方法を教えてください。
よろしくお願いします。


Mr.XRAY  URL  2004-09-16 22:08:39  No: 10931

https://www.petitmonte.com/bbs/answers?question_id=1863

のスレッドは参考になりませんか?


AY  2004-09-16 23:33:54  No: 10932

Mr.XRAYさん、ありがとうございました。
基本的には、Mr.XRAYさんの
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N009.html
が、とても参考になりました。
コントロール自体は、ClientOriginで座標が取れるとこまでたどり着けました。


Mr.XRAY  URL  2004-09-17 06:16:57  No: 10933

後はご部分で修正して作成すればいいのですが,参考として,例えば
以下のコードのような感じでもいけますね.

//====================================================================
//  指定したコントロールをキャプチャーしてForm2のImageに表示するプロ
//  グラムのサンプル
//  ここてでは,このFormのPanel1をキャプチャー
//  Halbow資料館のコードを修正したもの
//====================================================================
unit Main;

interface

uses
  Windows, Messages, SysUtils, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls,Classes;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    procedure CaptureRect(r:TRect;BM:TBitmap);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  Unit2;

procedure TForm1.Button1Click(Sender: TObject);
var
    hTarget : HWND;
    r       : TRect;
begin
    //キャプチャーしたいコントロールのハンドル
    //ここをSelf.Handleにすればこの当然Form全体
    hTarget := Panel1.Handle;
    //そのTRect構造体を取得
    GetWindowRect(hTarget,r);
    //それをキャプチャーしてForm2のImageに表示
    Form2.Image1.Picture.Bitmap.PixelFormat := pf24bit;
    CaptureRect(r,Form2.Image1.Picture.Bitmap);
    Form2.Show;
    Form2.Image1.Refresh;
end;

procedure TForm1.CaptureRect(r:TRect;BM:TBitmap);
var
     DispDC : HDC;
     Width  : Integer;
     Height : Integer;
begin
     Width := r.Right-r.Left;
     Height := r.Bottom-r.Top;
     DispDC := CreateDC('DISPLAY',nil,nil,nil);
     try
       BM.Width := width;
       BM.Height := height;
       BitBlt(BM.Canvas.Handle,0,0,Width,Height,DispDC,
                                r.Left,r.Top,SRCCOPY);
     finally
       DeleteDC(DispDC);
     end;
end;

end.

キャプチャーしたコントロールを表示するForm2のコード例

procedure TForm2.FormCreate(Sender: TObject);
begin
     Image1.Left := 0;
     Image1.Top := 0;
     Image1.AutoSize := True;
end;


AY  2004-09-17 17:57:25  No: 10934

Mr.XRAYさん、参考コードありがとうございます。
今のソースより  断然、スマートです。
早速  参考にさせて頂きます。

ちなみに、今は
var
    Target_point : Tpoint;
    r:TRect;
    p_top,p_left : integer;
begin
    Target_point := Panel1.ClientOrigin;
    p_top := Target_point.y;
    p_left := Target_point.X;

    r := Rect(p_left,p_top,p_left + Panel1.Width ,p_top+Panel1.Height);

ClientOriginを使って、計算してました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加