Delphi で Bricscad 画面キャプチャ
Delphi で Bricscad の画面をキャプチャし、EXE と同じフォルダにビットマップファイルを作成するサンプルです。
応用すれば、LayerView(画層一覧)とか、ドキュメント切り替えに使えます。

BricscadApp_TLB, BricscadDb_TLB は、タイプライブラリの取り込みが必要です。
メニューから「コンポーネント」-「コンポーネントのインポート」を選択します。

「タイプライブラリの取り込み」にチェックを付け、[ 次へ ]をクリック。

BricscadApp Type Library ... を選択し、[ 次へ ] ボタンをクリック。

そのままで、[ 次へ ] ボタンをクリック。

「ユニットの作成」にチェックを付け、[ 完了 ]をクリック。

同じように、BricscadDb Type Library ... も、取り込みを行います。
unit BcadCaptureUnit;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, BricscadApp_TLB, BricscadDb_TLB,
Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Grids, ComObj ;
type
TForm2 = class(TForm)
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
//****************************************
//画面の指定位置をBitmapに変換
//****************************************
procedure CaptureToBmp(Lf, Tp, W, H: Integer; bmp: TBitmap);
const
CAPTUREBLT = $40000000;
var
hdcScreen : HDC;
begin
bmp.Width := W;
bmp.Height := H;
hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
try
BitBlt( bmp.Canvas.Handle, 0, 0, W, H, hdcScreen, Lf, Tp, SRCCOPY or CAPTUREBLT);
finally
DeleteDC(hdcScreen);
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
app : IAcadApplication;
//docs : IAcadDocuments;
doc : IAcadDocument;
limmax, limmin : OleVariant;
scrsize : OleVariant;
scrH, scrW : integer;
bmp : TBitmap;
hnd : THandle;
ARect : TRect;
ALeft, ATop : integer;
gridMode : Integer;
ucsIcon : integer;
dwgName : TFileName;
begin
// Bricscad を見つける
try
if not Supports(GetActiveOleObject('BricscadApp.AcadApplication'), AcadApplication, app) then begin
ShowMessage('サポートされていません.');
exit;
end;
except
ShowMessage('有効な BricsCAD が見つかりません.');
Exit;
end;
// 自フォームを最小に
WindowState := wsMinimized;
try
//docs := app.Documents;
// アクティブドキュメントを取得
doc := app.ActiveDocument;
// ファイル名を表示
Caption := doc.Name;
dwgName := doc.Name;
// Bricscad をアクティブに
SetForegroundWindow(doc.HWND);
// 図面範囲を取得
limmax := doc.GetVariable('LIMMAX');
limmin := doc.GetVariable('LIMMIN');
// 図面範囲をズーム
app.ZoomWindow(limmin, limmax);
// グラフィック画面のサイズを取得
scrsize := doc.GetVariable('SCREENSIZE');
scrW := scrsize[0];
scrH := scrsize[1];
// グリッドの表示モードを取得
gridMode := doc.GetVariable('GRIDMODE');
// UCSアイコンの表示モードを取得
ucsICon := doc.GetVariable('UCSICON');
// グリッドを非表示に
if gridMode > 0 then
doc.SetVariable('GRIDMODE', 0);
// UCSアイコンを非表示に
if ucsIcon > 0 then
doc.SetVariable('UCSICON', 0);
// キャプチャするビットマップの大きさに縮小
app.ZoomScaled(168 / scrH, 0);
// グラフィックウィンドウのハンドルを取得
hnd := FindWindowEx(app.ActiveDocument.HWND, 0, 'AfxFrameOrView100u', nil);
// ウィンドウの位置と大きさを取得
GetWindowRect(hnd, ARect);
// グラフィックウィンドウの左上座標
ALeft := ARect.Left;
ATop := ARect.Top;
// キャプチャ用ビットマップを作成
bmp := TBitmap.Create;
try
bmp.PixelFormat := pf32bit;
// ビットマップの大きさ
bmp.Width := 240;
bmp.Height := 168;
// キャプチャ
CaptureToBmp(
ALeft + (scrW - 240) div 2,
ATop + (scrH - 168) div 2,
bmp.Width, bmp.Height, bmp);
// Image に表示
Image1.Picture.Bitmap.Assign(bmp);
// EXE と同じフォルダにビットマップを保存
bmp.SaveToFile(ExtractFilePath(ParamStr(0)) + ChangeFileExt(dwgName, '.bmp'));
finally
bmp.Free;
end;
// ズームを元に戻す
app.ZoomWindow(limmin, limmax);
// グリッドの表示を戻す
if gridMode > 0 then
doc.SetVariable('GRIDMODE', gridMode);
// UCSアイコンの表示を戻す
if ucsIcon > 0 then
doc.SetVariable('UCSICON', ucsIcon);
except
;
end;
// 自フォームを戻す
WindowState := wsNormal;
// 自フォームをアクティブに
SetForegroundWindow(Handle);
end;
end.