色々参考にさせて頂き、デスクトップ全体やアクティブウインドウをキャプチャーすることは可能でした。
今回、自フォーム上のボタンをクリックしたら、自フォーム上のパネル(パネルの上にチャートを表示している)のみを、キャプチャーしたいのですが
特定の、コントロールのみキャプチャーする方法を教えてください。
よろしくお願いします。
https://www.petitmonte.com/bbs/answers?question_id=1863
のスレッドは参考になりませんか?
Mr.XRAYさん、ありがとうございました。
基本的には、Mr.XRAYさんの
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N009.html
が、とても参考になりました。
コントロール自体は、ClientOriginで座標が取れるとこまでたどり着けました。
後はご部分で修正して作成すればいいのですが,参考として,例えば
以下のコードのような感じでもいけますね.
//====================================================================
// 指定したコントロールをキャプチャーして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;
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を使って、計算してました。
ツイート | ![]() |