5

私のプログラムでは、Windows メタファイル (WMF および EMF) を「再生」または「解析」する必要があります。私は MSDN と Google を掘り下げましたが、最も近いのは Graphics です。EnumerateMetafile メソッド。EnumerateMetafileProc コールバックが呼び出されてから、PlayRecord を呼び出すことができるので、これを機能させることができます。欠けているのは、そのコールバックから有用なデータを取得する方法です。

私が見た例: http://msdn.microsoft.com/en-us/library/ms142060.aspx

コールバックには、ENUM である recordType パラメータがあります。データを有用な型にキャストする方法がないように見えることを除けば、これは便利に見えます。

私の目標は、WMF/EMF の作成を再生して、(DrawLine、DrawPoint、DrawArc) のようなメソッドを持つ特殊なグラフィックス クラスを関数呼び出しできるようにすることです。ある意味では、WMF/EMF 図面をまったく別の形式で再作成しています (変換)。

これに関するヘルプは非常に高く評価されています。

4

2 に答える 2

10

Graphics.EnumerateMetafileは、残念ながら Win32 API の周りの非常に薄いレイヤーです。EMF のレコードごとに、レコード固有の構造体のアンマネージ メモリ アドレスを取得します。含まれている可能性があるドキュメントはありませんが、Win32 の世界でもあまり進んでいません。

だからあなたは古代のテキストを調べる必要があります!

この本には、EMF 再生 API を使用するためのサンプル プログラムを含むコード サンプル CD-ROMが付属しています。

これにより、2 つの問題が残ります。

  1. この本は明らかに絶版になっているので、購入する中古本には必ず動作する CD-ROM が含まれていることを確認してください。

  2. サンプル コードはすべて C/C++ で記述されており、すべての EMF レコードを記述するために使用される 100 ほどの構造体に必要な相互運用機能を宣言するのは簡単ではありません。

したがって、別のアプローチとして、インターセプトする必要があるすべての GDI 呼び出しのメソッドを持つ巨大なインターフェイスを .NET で宣言し、C++/CLI を使用してサンプルの C++ コードを適合させ、レコードごとに巨大なインターフェイスを呼び出すようにすることもできます。

アップデート

EMF 再生に関する MSDN ドキュメントには特定の EMF レコードの詳細は含まれていませんが、Microsoft は 2006 年時点で完全な仕様を個別に公開しています。

MS-EMF: 拡張メタファイル形式

また、上記でリンクした本の著者は、CDROM サンプルのソース コードをダウンロードできるようにしています。

Windows グラフィックス プログラミングのソース コード

于 2010-02-02T12:42:05.573 に答える
3

このライブラリをチェックしてください: http://wmf.codeplex.com/

アイデアは、WMF レコードをループして、シェイプ、ブラシなどを他の形式に変換することです。

WmfDocument wmf = new WmfDocument();
wmf.Load(path);

foreach (var record in wmf.Records)
{
  if (record is WmfCreateBrushIndirectRecord)
  {
    var brush = record as WmfCreateBrushIndirectRecord;
    Console.WriteLine("Color: " + brush.Color);
    Console.WriteLine("Style: " + brush.Style);
    Console.WriteLine("Hatch: " + brush.Hatch);
    //Do something with brush here...
  }
  else if (record is WmfRectangleRecord)
  {
    var rectangle = record as WmfRectangleRecord;
    //Do something with rectangle...
  }
  else if ... //Other shapes to be implemented
}
于 2012-03-04T18:56:32.180 に答える