/* GDI+ Programming in C# and VB .NET by Nick Symmonds Publisher: Apress ISBN: 159059035X */ using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; namespace MetaEnum_c { public class MetaEnum : System.Windows.Forms.Form { private System.ComponentModel.Container components = null; private System.Windows.Forms.ListBox LB; Metafile mf = new Metafile("mymeta.emf"); public MetaEnum() { InitializeComponent(); } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } mf.Dispose(); base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.LB = new System.Windows.Forms.ListBox(); this.SuspendLayout(); // // LB // this.LB.Location = new System.Drawing.Point(208, 232); this.LB.Name = "LB"; this.LB.Size = new System.Drawing.Size(168, 121); this.LB.TabIndex = 1; // // MetaEnum // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(392, 373); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.LB}); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "MetaEnum"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "MetaEnum"; this.Load += new System.EventHandler(this.MetaEnum_Load); this.ResumeLayout(false); } #endregion [STAThread] static void Main() { Application.Run(new MetaEnum()); } private void MetaEnum_Load(object sender, System.EventArgs e) { } protected override void OnPaint(PaintEventArgs e) { Graphics G = e.Graphics; G.EnumerateMetafile( mf, new Point( 50, 50 ), new Graphics.EnumerateMetafileProc(this.MetafileCallback) ); } // Define callback method. private bool MetafileCallback( EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData) { LB.Items.Add(recordType); if ( dataSize > 0 ) { byte[] D = new byte[dataSize]; Marshal.Copy(data, D, 0, dataSize); mf.PlayRecord(recordType, flags, dataSize, D); } return true; } } } MetaEnum-c.zip( 1 k)