0

メモリ内 (ファイルベースではない) のメタファイルをいくつか作成して表示する必要があります。フォームのパネルのOnPaintハンドラーで、次のコードを呼び出します。

Metafile metafile;
using( Graphics offScreenGraphics = Graphics.FromHwndInternal( IntPtr.Zero ) )
{
    IntPtr hDC = offScreenGraphics.GetHdc();
    metafile = new Metafile( hDC, EmfType.EmfPlusDual );
    offScreenGraphics.ReleaseHdc();
}

Graphics graphics = Graphics.FromImage( metafile );
graphics.FillRectangle( Brushes.LightYellow, 0, 0, 100, 100 );
graphics.DrawLine( Pens.Red, 50, 50, 100, 100 );

e.Graphics.DrawImage( metafile, 50, 50 );

ただし、何も表示されず、 で何を描画しようとしてもmetafilePhysicalDimension常に 35x35 のようなものになります。単位が 100 分の 1 ミリであることを考えると、これは小さすぎます。

注:もちろん、これは不自然な例です。同じ方法でグラフィックを描画するためだけにメタファイルを作成するつもりはありません。アプリケーションでメタファイルを渡す必要があります。DrawImageこれは、メソッドで描画できることを確認するための簡単なテストです。

4

1 に答える 1

0

わかりました、それは簡単でした。元の例から、使用した GDI オブジェクトの破棄など、不要と思われる詳細を省略しました。しかし、メタファイルの場合、描画しているオブジェクトを破棄することが重要なようです。Graphicsそれを行った後でのみ、メタファイルは「完成」し、それを描画できます(ちなみに、正しい も報告PhysicalDimensionされます)。

したがって、上記のコードは次のように調整する必要があります。

using( Graphics graphics = Graphics.FromImage( metafile ) )
{
    graphics.FillRectangle( Brushes.LightYellow, 0, 0, 100, 100 );
    graphics.DrawLine( Pens.Red, 50, 50, 100, 100 );
}
于 2012-11-01T14:23:24.420 に答える