VB.Net Tutorial/2D Graphics/MetaFile WMF

Материал из VB Эксперт
Перейти к: навигация, поиск

Create a Metafile

<source lang="vbnet">Imports System.Drawing.Imaging Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms public class MetafileHeaderInfo

  public Shared Sub Main
       Application.Run(New Form1)
  End Sub

End class public class Form1

 Inherits System.Windows.Forms.Form
 Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
       Dim g As Graphics = Me.CreateGraphics()
       Dim hdc As IntPtr = g.GetHdc()
       Dim rect As New Rectangle(20, 20, 200, 100)
       Dim curMetafile As New Metafile(hdc, EmfType.EmfPlusDual, "yourfile.emf")
       Dim g1 As Graphics = Graphics.FromImage(curMetafile) "
       g1.SmoothingMode = SmoothingMode.HighQuality
       g1.FillRectangle(Brushes.Red, rect)
       rect.Y += 110
       g1.DrawEllipse(New Pen(Brushes.Green, 3), rect)
       g1.DrawLine(Pens.Blue, New Point(20, 20), New Point(400, 200))
       "Release objects
       g.ReleaseHdc(hdc)
       g1.Dispose()
       g.Dispose()
 End Sub
 Public Sub New()
  
   MyBase.New()
   Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
   Me.ClientSize = New System.Drawing.Size(292, 273)
   Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
 End Sub

End Class</source>

Draw a meta wmf file

<source lang="vbnet">Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Drawing.Imaging Imports System.Windows.Forms public class MetafileDraw

  public Shared Sub Main
       Application.Run(New Form1)
  End Sub

End class public class Form1

 Inherits System.Windows.Forms.Form
 Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
       Dim g As Graphics = Me.CreateGraphics()
       g.Clear(Me.BackColor)
       Dim curMetafile As New Metafile("yourfile.wmf")
       g.DrawImage(curMetafile, 0, 0)
       g.Dispose()
 End Sub
 Public Sub New()
  
   MyBase.New()
   Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
   Me.ClientSize = New System.Drawing.Size(292, 273)
   Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
 End Sub

End Class</source>

Draw on a wmf file

<source lang="vbnet">Imports System.Drawing.Imaging Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms public class DrawOnWMFFile

  public Shared Sub Main
       Application.Run(New Form1)
  End Sub

End class public class Form1

 Inherits System.Windows.Forms.Form
 Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
       Dim curMetafile As Metafile = Nothing
       Dim g As Graphics = Me.CreateGraphics()
       Dim hdc As IntPtr = g.GetHdc()
       Dim rect As New Rectangle(0, 0, 200, 200)
       curMetafile = New Metafile("newFile.wmf", hdc)
       Dim g1 As Graphics = Graphics.FromImage(curMetafile)
       g1.SmoothingMode = SmoothingMode.HighQuality
       g1.FillRectangle(Brushes.Green, rect)
       rect.Y += 110
       Dim lgBrush As New LinearGradientBrush(rect, Color.Red, Color.Blue, 45.0F)
       g1.FillEllipse(lgBrush, rect)
       rect.Y += 110
       g1.DrawString("MetaFile Sample", New Font("Verdana", 20), lgBrush, 200, 200, StringFormat.GenericTypographic)
       g.ReleaseHdc(hdc)
       g1.Dispose()
       g.Dispose()
 End Sub
 Public Sub New()
  
   MyBase.New()
   Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
   Me.ClientSize = New System.Drawing.Size(292, 273)
   Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
 End Sub

End Class</source>

Make Metafile (WMF)

<source lang="vbnet">Imports System.Drawing.Imaging Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms Imports System.Math public class WMFFileCreate

  public Shared Sub Main
       Application.Run(New Form1)
  End Sub

End class

Public Class Form1

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Const WID As Integer = 200
       Dim file_name As String = "test.wmf"
       Dim me_gr As Graphics = Me.CreateGraphics
       Dim me_hdc As IntPtr = me_gr.GetHdc
       Dim bounds As New RectangleF(0, 0, WID, WID)
       Dim mf As New Metafile(file_name, me_hdc, bounds, MetafileFrameUnit.Pixel)
       me_gr.ReleaseHdc(me_hdc)
       Dim gr As Graphics = Graphics.FromImage(mf)
       gr.PageUnit = GraphicsUnit.Pixel
       gr.Clear(Color.White)
       gr.DrawEllipse(Pens.Red, bounds)
       gr.DrawLine(Pens.Blue, 0, 0, WID, WID)
       gr.DrawLine(Pens.Blue, WID, 0, 0, WID)
       gr.Dispose()
       mf.Dispose()
       mf = New Metafile(file_name)
       Dim bm As New Bitmap(WID, WID)
       gr = Graphics.FromImage(bm)
       Dim dest_bounds As New RectangleF(0, 0, WID, WID)
       Dim source_bounds As New RectangleF(0, 0, WID + 1, WID + 1)
       gr.DrawImage(mf, bounds, source_bounds, GraphicsUnit.Pixel)
       picOrig.SizeMode = PictureBoxSizeMode.AutoSize
       picOrig.Image = bm
       gr.Dispose()
       mf.Dispose()
       mf = New Metafile(file_name)
       picSmall.SetBounds(picOrig.Right + 10, picOrig.Top,picOrig.Width \ 2, picOrig.Height \ 2)
       bm = New Bitmap(picSmall.ClientSize.Width,picSmall.ClientSize.Height)
       gr = Graphics.FromImage(bm)
       gr.ScaleTransform(0.5, 0.5)
       gr.DrawImage(mf, bounds, source_bounds, GraphicsUnit.Pixel)
       picSmall.Image = bm
       gr.Dispose()
       mf.Dispose()
   End Sub

End Class <Global.Microsoft.VisualBasic.rupilerServices.DesignerGenerated()> _ Partial Public Class Form1

   Inherits System.Windows.Forms.Form
   "Form overrides dispose to clean up the component list.
   <System.Diagnostics.DebuggerNonUserCode()> _
   Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
       If disposing AndAlso components IsNot Nothing Then
           components.Dispose()
       End If
       MyBase.Dispose(disposing)
   End Sub
   "Required by the Windows Form Designer
   Private components As System.ruponentModel.IContainer
   "NOTE: The following procedure is required by the Windows Form Designer
   "It can be modified using the Windows Form Designer.  
   "Do not modify it using the code editor.
   <System.Diagnostics.DebuggerStepThrough()> _
   Private Sub InitializeComponent()
       Me.picSmall = New System.Windows.Forms.PictureBox
       Me.picOrig = New System.Windows.Forms.PictureBox
       CType(Me.picSmall, System.ruponentModel.ISupportInitialize).BeginInit()
       CType(Me.picOrig, System.ruponentModel.ISupportInitialize).BeginInit()
       Me.SuspendLayout()
       "
       "picSmall
       "
       Me.picSmall.Location = New System.Drawing.Point(64, 8)
       Me.picSmall.Name = "picSmall"
       Me.picSmall.Size = New System.Drawing.Size(32, 24)
       Me.picSmall.TabIndex = 3
       Me.picSmall.TabStop = False
       "
       "picOrig
       "
       Me.picOrig.Location = New System.Drawing.Point(8, 8)
       Me.picOrig.Name = "picOrig"
       Me.picOrig.Size = New System.Drawing.Size(48, 56)
       Me.picOrig.TabIndex = 2
       Me.picOrig.TabStop = False
       "
       "Form1
       "
       Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
       Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
       Me.ClientSize = New System.Drawing.Size(326, 215)
       Me.Controls.Add(Me.picSmall)
       Me.Controls.Add(Me.picOrig)
       Me.Name = "Form1"
       Me.Text = "MakeMetafile"
       CType(Me.picSmall, System.ruponentModel.ISupportInitialize).EndInit()
       CType(Me.picOrig, System.ruponentModel.ISupportInitialize).EndInit()
       Me.ResumeLayout(False)
   End Sub
   Friend WithEvents picSmall As System.Windows.Forms.PictureBox
   Friend WithEvents picOrig As System.Windows.Forms.PictureBox

End Class</source>

Set EnumerateMetafileProc property

<source lang="vbnet">Imports System.Drawing Imports System.Drawing.Imaging Imports System.Drawing.Drawing2D Imports System.Windows.Forms public class EnumerateMetafileProc

  public Shared Sub Main
       Application.Run(New Form1)
  End Sub

End class public class Form1

 Inherits System.Windows.Forms.Form
 Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
       Dim g As Graphics = Me.CreateGraphics()
       g.Clear(Me.BackColor)
       Dim curMetafile As New Metafile("mtfile.wmf")
       Dim enumMetaCB1 As New Graphics.EnumerateMetafileProc(AddressOf EnumMetaCB)
       g.EnumerateMetafile(curMetafile, New Point(0, 0), EnumMetaCB1)
       curMetafile.Dispose()
       g.Dispose()
 End Sub
   Private Function EnumMetaCB(ByVal recordType As EmfPlusRecordType, ByVal flags As Integer, ByVal dataSize As Integer, ByVal data As IntPtr, ByVal callbackData As PlayRecordCallback) As Boolean "
       Dim str As String = ""
       " Play only EmfPlusRecordType.FillEllipse records.
       If recordType = EmfPlusRecordType.FillEllipse Or recordType = EmfPlusRecordType.FillRects Or recordType = EmfPlusRecordType.DrawEllipse Or recordType = EmfPlusRecordType.DrawRects Then
           str = "Record type:" + recordType.ToString() + ", Flags:" + flags.ToString() + ", DataSize:" + dataSize.ToString() + ", Data:" + data.ToString()
           MessageBox.Show(str)
       End If
       Return True
   End Function "EnumMetaCB
 Public Sub New()
  
   MyBase.New()
   Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
   Me.ClientSize = New System.Drawing.Size(292, 273)
   Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
 End Sub

End Class</source>