Metafiles laden in C#

JJB

Cogito ergo brumm
Hallo zusammen,

ich stehe vor dem Problem, dass ich (enhanced) Windows Metafiles laden oder erzeugen und darin Commentare lesen oder schreiben muss.
Laut MSDN werden WMF Daten jedoch als PNG Daten verwaltet, da .Net angeblich keinen WMF Encoder besitzt.

Kann mir jemand sagen, wie ich diese Files laden, erzeugen, kommentieren und auslesen kann ?

Hier mal ein Versuch zum Erzeugen von EMF Daten mit Kommentar.
Aus irgendeinem Grund kann ich die EMF/WMF Daten nicht lesen, sondern nur schreiben.

Code:
Graphics aGraphics = this.CreateGraphics();                             // Create temporary Graphics object for metafile
IntPtr aHandle = aGraphics.GetHdc();                                    // Creation and get handle to its device context.
Metafile aMetaFile = new Metafile(@"test_2.emf", aHandle);              // Create metafile object to record.
Graphics aMetaGraphics = Graphics.FromImage(aMetaFile);                 // Create graphics object to RECORD metaFile.

aMetaGraphics.DrawRectangle(new Pen(Color.Black, 5), 0, 0, 100, 100);   // Draw rectangle in metaFile.
byte[] aCommentBytes = { (byte)'T', (byte)'e', (byte)'s', (byte)'t' };  // Create comment and add to metaFile.
aMetaGraphics.AddMetafileComment(aCommentBytes);

aMetaGraphics.Dispose();                                                // Dispose of graphics object.
aMetaFile.Dispose();                                                    // Dispose of metafile.
aGraphics.ReleaseHdc(aHandle);                                          // Release handle to temporary device context.
aGraphics.Dispose();                                                    // Dispose of scratch graphics object.

Vielleicht hat jemand eine Idee, wie man darauf zugreifen kann.

Ich wäre für jede Hilfe dankbar.

MFG JJB
 

JJB

Cogito ergo brumm
Hallo zusammen,

den ersten Schritt hätte ich. Ein Metafile zu lesen ist kein Hexenwerk und schnell programmiert. Microsoft bietet dafür ein recht gutes Snippet:

Code:
    private Metafile metafile1;
    private Graphics.EnumerateMetafileProc metafileDelegate;

    // Der Aufrufe erfolgt über eine Enumeration, welche die RecordSets des Metafiles
    // einzeln abarbeitet und sie in einen Delegate zurückführt.
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.EnumerateMetafile(metafile1, new Point(20, 10), metafileDelegate);
    }

    // Der Delegate verweist auf ein Callback Objekt vom Typ EnumerateMetafileProc
    public Init()
    {
        metafile1 = new Metafile(@"C:\Test.wmf");
        metafileDelegate = new Graphics.EnumerateMetafileProc(MetafileCallback);
    }

    // Das einzelne Record kann nun hier unterschieden werden und einer PlayRoutine 
    // übergeben werden. So kann das Metafile Schrittweise "gemalt" werden.
    private bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
    {
        byte[] dataArray = null;
        if (data != IntPtr.Zero)
        {
            dataArray = new byte[dataSize];
            Marshal.Copy(data, dataArray, 0, dataSize);
        }

        metafile1.PlayRecord(recordType, flags, dataSize, dataArray);

        return true;
    }

Ich habe derzeit noch das Problem, dass ich die Records nicht einfach in ein anderes Metafile überführen kann, als würde ich eine flache Kopie erzeugen.

Sprich, ich kann mit diesen Records nicht wirklich was anfangen. Denn ich kann sie nicht in schreiben.

Hat jemand eine Idee, wie man Records aus einem Metafile extrahieren und in ein anderes einfügen kann ?

Besten Dank, JJB
 

Neue Beiträge