Αυτό που θέλω να κάνω είναι να αναλύσω ένα .emf αρχείο.
Βρήκα ένα παράδειγμα κώδικα σε VB.NET εδώ .
http://www.vb-helper.com/howto_net_enumerate_metafile.html (
Enumerate
the records in a Windows metafile (WMF) or enhanced metafile (EMF) in VB .NET).
Μετέτρεψα τον κώδικα σε c# και τώρα η μέθοδος που κάνει την ανάλυση έχει αυτή τη μορφή
public bool ListRecords(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
{
listBox.Items.Add(recordType.ToString());
}
return true;
}
την καλώ μέσα από ένα κουμπί κάπως έτσι.
private void button1_Click(object sender, EventArgs e)
{
Metafile mf = new Metafile("test.emf");
this.CreateGraphics().EnumerateMetafile(mf, new PointF(0, 0), ListRecords);
mf.Dispose();
}
Η κλήση του "κιτρινισμένου" στον αυθεντικό κώδικα (VB.NET) είναι
Me.CreateGraphics.EnumerateMetafile( mf, New PointF(0, 0), AddressOf
ListRecords)
Όσες φορές και να πατήσω το κουμπί, ο κώδικας εκτελείται κανονικά, και μου παρουσιάζει την ανάλυση του emf.
Μεσα στον κώδικα που θέλω να το χρησιμοποιήσω, επειδή υπάρχει cross-threading πρόβλημα, έχω τον κώδικα
MethodInvoker invoker = () =>
{
button1.PerformClick(); //ektelei ton kodika tou koumpiou 1.
};
if (button1.InvokeRequired)
{
Invoke(invoker);
}
else
{
invoker();
}
Με αυτό τον κώδικα το " this.CreateGraphics().EnumerateMetafile(mf, new PointF(0, 0), ListRecords);" εκτείλεται είτε μια φορά είτε
καμία. Για πιο λόγο; Μήπως θα έπρεπε να βάλω κάτι αντίστοιχο του
AddressOf και στον κώδικα της c#; Σε 2-3 σαιτ που κοίταξα, έλεγαν ότι
δεν χρειάζεται να βάλουμε κάτι.
Ή μήπως είναι κάτι άλλο;