procedure TForm1.BitBtn1Click(Sender: TObject);
var
TheMetaFile: TMetaFile;
begin
TheMetaFile := TMetaFile.Create;
TheMetaFile.LoadFromFile( 'sample.emf' );
TheMetaFile.Enhanced := False;
TheMetaFile.SaveToFile( 'sample.wmf' );
end;
Windows GDIを使って同じことをやってみる.
まず,GetEnhMetaFileで拡張メタファイルのハンドルを作成する.
次に,GetWinMetaFileBitsを使って拡張メタファイル形式のレコードを旧メタファイル形式に変換する.
このAPIのプロトタイプは,
function GetWinMetaFileBits(p1: HENHMETAFILE; p2: UINT; p3: PByte; p4: Integer; p5: HDC): UINT;
p3がnilならばGetWinMetaFileBitsは変換後のレコードを格納するのに必要なバッファのサイズを返す. したがって,最初にp3をnilとしてGetWinMetaFileBitsを呼び出してバッファのサイズを取得し, そのサイズに応じたバッファを確保して再度GetWinMetaFileBitsを呼び出す. p4にはフォームのDCのハンドルを指定すればよいだろう.
以下にプログラム例を示す.
この例ではTMemoryStreamクラスを使った.
このクラスを使えば,簡単にメモリの内容をファイルに保存することができる.
procedure TForm1.Button2Click(Sender: TObject);
var
TheMetaFile: HMETAFILE;
TheSize: Integer;
MS: TMemoryStream;
begin
TheMetaFile := GetEnhMetaFile( 'sample.emf' ); // 拡張メタファイルのハンドルを取得
TheSize := GetWinMetaFileBits( TheMetafile, 0, nil, MM_ANISOTROPIC, Canvas.Handle ); // 変換後のレコードを格納するバッファのサイズを取得
try
MS := TMemoryStream.Create; // TMemoryStreamクラスのインスタンスを作成
MS.SetSize( TheSize ); // メモリサイズを設定
GetWinMetaFileBits( TheMetaFile, TheSize, // 変換後のレコードを取得
MS.Memory, MM_ANISOTROPIC, Canvas.Handle );
MS.SaveToFile( 'sample.wmf' ); // 拡張子を".wmf"としてメモリの内容を保存
finally
MS.Free; // TMemoryStreamクラスのインスタンスを破棄
DeleteEnhMetaFile( TheMetaFile ); // 拡張メタファイルのハンドルを解放
end;
end;
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||