Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms Imports Pilz.Drawing ''' ''' Contains static methods that are used for the standart PaintingObject Types. ''' Public Class DefaultDrawMethodes Public Shared Sub DrawText(e As PaintingObjectPaintEventArgs) Dim obj As PaintingObject = e.PaintingObject Dim b As New SolidBrush(obj.TextColor) Dim p As New PointF Dim rect As New Rectangle(e.X, e.Y, obj.Width, obj.Height) Dim f As StringFormat = StringFormat.GenericDefault f.Alignment = obj.HorizontalTextAlignment f.LineAlignment = obj.VerticalTextAlignment Dim zoomFactor As Single If obj.Parent Is Nothing Then zoomFactor = 1.0! Else zoomFactor = obj.Parent.ZoomFactor.Width End If e.Graphics.DrawString(obj.Text, New Font(obj.TextFont.FontFamily, obj.TextFont.Size * zoomFactor, obj.TextFont.Style), b, rect, f) End Sub Public Shared Sub DrawPicture(e As PaintingObjectPaintEventArgs) Dim obj As PaintingObject = e.PaintingObject Dim objImg As Image Dim objImgSize As Size Dim result As RectangleF Dim image As Bitmap Dim zoomf As SizeF Dim hasNoParent As Boolean = e.PaintingObject.Parent Is Nothing Dim syncObj As Object If hasNoParent Then zoomf = New SizeF(1, 1) Static newSyncObj As New Object syncObj = newSyncObj Else zoomf = e.PaintingObject.Parent.ZoomFactor syncObj = e.PaintingObject.Parent End If SyncLock syncObj If obj?.Image Is Nothing Then Return objImg = obj.Image objImgSize = objImg.Size End SyncLock image = obj.BufferedImage result = CalculateImageResolution(obj, objImgSize, zoomf) If obj.ImageProperties.Rotate = 90 OrElse obj.ImageProperties.Rotate = 270 Then result = CalculateImageResolution(obj, New SizeF(objImgSize.Height, objImgSize.Width), zoomf) End If If image Is Nothing Then Dim needRescaleImageBecauseRot As Boolean = False image = DrawToNewImage(objImg, result.Size) Select Case obj.ImageProperties.Rotate Case 90 image.RotateFlip(RotateFlipType.Rotate90FlipNone) needRescaleImageBecauseRot = True Case 180 image.RotateFlip(RotateFlipType.Rotate180FlipNone) Case 270 image.RotateFlip(RotateFlipType.Rotate270FlipNone) needRescaleImageBecauseRot = True End Select If obj.ImageProperties.FlipX Then image.RotateFlip(RotateFlipType.RotateNoneFlipX) End If If obj.ImageProperties.FlipY Then image.RotateFlip(RotateFlipType.RotateNoneFlipY) End If If needRescaleImageBecauseRot Then result = CalculateImageResolution(obj, New SizeF(objImgSize.Height, objImgSize.Width), zoomf) image = DrawToNewImage(image, result.Size) End If obj.BufferedImage = image End If If image IsNot Nothing Then SyncLock syncObj e.Graphics.DrawImageUnscaled(image, New Rectangle(New Point(obj.Location.X + result.Location.X - e.Offset.X, obj.Location.Y + result.Location.Y - e.Offset.Y), result.Size.ToSize)) End SyncLock End If End Sub Private Shared Function DrawToNewImage(image As Bitmap, newSize As SizeF) As Bitmap Dim bmp As New Bitmap(CInt(If(newSize.Width < 0, newSize.Width * -1, newSize.Width)), CInt(If(newSize.Height < 0, newSize.Height * -1, newSize.Height))) Dim gimage As Graphics = Graphics.FromImage(bmp) gimage.SmoothingMode = SmoothingMode.HighQuality gimage.PixelOffsetMode = PixelOffsetMode.HighQuality gimage.PageUnit = GraphicsUnit.Pixel gimage.InterpolationMode = InterpolationMode.HighQualityBicubic gimage.DrawImage(image, New RectangleF(PointF.Empty, newSize)) gimage.Dispose() Return bmp End Function Public Shared Sub DrawLine(e As PaintingObjectPaintEventArgs) Dim obj As PaintingObject = e.PaintingObject Dim p2 As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle} p2.Alignment = PenAlignment.Center Dim no As PointF = New PointF(e.X, e.Y) e.Graphics.DrawLine(p2, no, no + obj.Size) End Sub Private Shared Function CalculateImageResolution(obj As PaintingObject, imageSize As SizeF, zoom As SizeF) As RectangleF Dim result As New RectangleF Dim objrect As New RectangleF(obj.Location, obj.Size) Dim size As SizeF = New SizeF(imageSize.Width * zoom.Width, imageSize.Height * zoom.Height) Dim clientRectangle As RectangleF = objrect Dim val As Single = clientRectangle.Width / size.Width clientRectangle = objrect Dim num As Single = Math.Min(val, clientRectangle.Height / size.Height) result.Width = CInt(Math.Truncate(size.Width * num)) result.Height = CInt(Math.Truncate(size.Height * num)) clientRectangle = objrect result.X = (clientRectangle.Width - result.Width) \ 2 clientRectangle = objrect result.Y = (clientRectangle.Height - result.Height) \ 2 Return result End Function Public Shared Sub DrawTriangle(e As PaintingObjectPaintEventArgs) Dim obj As PaintingObject = e.PaintingObject Dim p1 As New Point(obj.Size.Width / 2 + e.X, e.Y) Dim p2 As New Point(e.X, e.Y + obj.Size.Height) Dim p3 As New Point(e.X + obj.Size.Width, e.Y + obj.Size.Height) If obj.EnableFill Then Dim b As New SolidBrush(obj.FillColor) e.Graphics.FillPolygon(b, {p1, p2, p3}) End If If obj.EnableOutline Then Dim lw As Single = obj.OutlineThicknes Dim p As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle, .Alignment = PenAlignment.Inset} e.Graphics.DrawPolygon(p, {p1, p2, p3}) End If End Sub Public Shared Sub DrawRectangle(e As PaintingObjectPaintEventArgs) Dim obj As PaintingObject = e.PaintingObject Dim hol As Single = obj.OutlineThicknes / 2 If obj.EnableFill Then Dim b As New SolidBrush(obj.FillColor) Dim rect As Rectangle = If(obj.EnableOutline, New Rectangle(e.X + hol, e.Y + hol, obj.Size.Width - hol * 2, obj.Size.Height - hol * 2), New Rectangle(e.X, e.Y, obj.Size.Width, obj.Size.Height)) e.Graphics.FillRectangle(b, rect) End If If obj.EnableOutline Then Dim p As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle, .Alignment = PenAlignment.Inset} Dim rect As New Rectangle(e.X, e.Y, obj.Size.Width, obj.Size.Height) e.Graphics.DrawRectangle(p, rect) End If End Sub Public Shared Sub DrawEllipse(e As PaintingObjectPaintEventArgs) Dim obj As PaintingObject = e.PaintingObject If obj.EnableFill Then Dim b As New SolidBrush(obj.FillColor) Dim rect As Rectangle = New Rectangle(e.X, e.Y, obj.Size.Width, obj.Size.Height) e.Graphics.FillEllipse(b, rect) End If If obj.EnableOutline Then Dim p As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle, .Alignment = PenAlignment.Inset} Dim rect As New Rectangle(e.X, e.Y, obj.Size.Width, obj.Size.Height) e.Graphics.DrawEllipse(p, rect) End If End Sub Public Shared Sub DrawSelection(e As PaintingObjectPaintEventArgs) Dim obj As PaintingObject = e.PaintingObject Dim lw As Single = 2.5! Dim hlw As Single = lw / 2 Dim hlwphol As Single = hlw '+ hol Dim hlwpholm2 As Single = hlwphol * 2 Dim p As New Pen(Color.CornflowerBlue, lw) With {.DashStyle = obj.SelectionDashStyle, .Alignment = PenAlignment.Outset} Dim rect As New Rectangle(e.X - hlwphol, e.Y - hlwphol, obj.Size.Width + hlwpholm2, obj.Size.Height + hlwpholm2) e.Graphics.DrawRectangle(p, rect) End Sub Public Shared Sub DrawGrid(e As PaintEventArgs, pc As PaintingControl, offset As PointF) Dim p As New Pen(pc.GridColor, 0.5) Dim curX As Integer = pc.GridChunkSize.Width * pc.ZoomFactor.Width - offset.X Do While curX < pc.Width e.Graphics.DrawLine(p, curX, -offset.Y, curX, pc.Height) curX += (pc.GridChunkSize.Width * pc.ZoomFactor.Width) Loop Dim curY As Integer = pc.GridChunkSize.Height * pc.ZoomFactor.Height - offset.Y Do While curY < pc.Height e.Graphics.DrawLine(p, -offset.X, curY, pc.Width, curY) curY += (pc.GridChunkSize.Height * pc.ZoomFactor.Height) Loop End Sub Public Shared Sub DrawAreaSelection(e As PaintEventArgs, pc As PaintingControl, startMousePos As PointF, lastMousePos As PointF) Dim rectToDraw As RectangleF = HelpfulDrawingFunctions.GetRectangle(startMousePos, lastMousePos) Dim p As New Pen(pc.AreaSelectionColor) p.DashStyle = If(startMousePos.X >= lastMousePos.X, DashStyle.DashDot, DashStyle.Solid) p.Width = 3 e.Graphics.DrawRectangle(p, rectToDraw.X, rectToDraw.Y, rectToDraw.Width, rectToDraw.Height) End Sub End Class