Let's create a project for example with the name dzoDraw !
We insert the first form that contains the three menus and the space for drawing and other tabulated windows.
In this form we insert the four panels
Menu Panel
ToolBar Panel
Draw Panel
Properties Panel
Let we start with Draw Panel
We need the most important structure in the project that allows you to create the various drawing objects DZODraw
using the class DZODraw
Public Structure ptObject
Public name As String - name of the drawn object
Public X1 As Point - the left corner position
Public X2 As Point - the right corner position
Public XORIG1 As Point - the original position of left corner position
Public XORIG2 As Point - the original position of right corner position
Public penLine As Pen - the Pen using for the drawing of the object
Public draw As Integer
The variable draw can be one of the following value:
Public Const CLEAR = 0 - to clear the drawing area
Public Const LINE = 1 - to draw line
Public Const LINEARROW = 2 - to draw line with one arrow
Public Const LINEARROWSE = 3 - to draw line with two arrows
Public Const PEN = 4 - to draw with the pen
Public Const RECTANGLE = 5 - to draw rectangle
Public Const CUBE = 6 - to draw cube
Public Const ELLIPSE = 7 - to drwa ellipse
Public Const CURVE = 8 - to draw curve
Public Const BOLT = 9 - to draw bolt
Public Const FILL = 10 - to fill area with color
Public Const SELECTION = 11 - to select object
Public Const COPY = 12 - to copy the selected object
Public Const PASTE = 13 - to past the selected object
Public Const DELETE = 14 - to delete the selected object
Public Const IIMAGE = 15 - to insert image from disk
Public Const LABEL = 16 - to insert text
Public Const GRID = 17 - to view the grid in the drawing area
Public Const ZOOM_M = 18 - to zoom -
Public Const ZOOM_P = 19 - to zoom +
Public Const EXIT_APP = 20 - to exit from the application
Public bitmap As Bitmap - the bitmap if the object need
Public text As String - the text if the object is a text
Public directionText As String - the direction of the text horizontal or vertical
Public lstPtCurve As ArrayList - the list of points that form the curved object
Public font As Font - the font used when the object is a text
Public rotation As Integer - the rotation angle of the object
Public penSize As Single - the size of the drawing pen
Public penStyle As String - the style of the drawing pen
Public FillColor As Color - the first fill color
Public FillColor2 As Color - the second fill color to combine with the first
Public ForeColor As Color - the color of the drawing pen
Public bringToFront As Boolean - to bring the object to back or to front.
Public brightness As Double - the brightness of the image if the object is a bitmap.
Public contrast As Double - the contrast of the image if the object is a bitmap.
Public gamma As Double - the gamma of the image if the object is a bitmap.
Public orderDesign As Integer - the order of drawing of the object
Public brushBitmap As String - the brushBitmap of the image if the object is a bitmap.
Public dCube As Integer - the depth of the cube object.
End Structure
Public Class DZODraw
...
these the most important lists used:
Public lstDrawOject As New List(Of ptObject) - List of all drawn objects
Public lstRedoDrawOject As New List(Of ptObject) - List of deleted objects witch can be recovered with Ctrl+Z
Public lstSelDrawOject As New List(Of ptObject) - List of all selected objects
Public lstCopiedSelDrawOject As New ArrayList() - List of all copied objects
.....
....
End class
Therefore we have an object that is manipulated through lists
let's start by explaining the various methods (DZODraw class)
' Draw Line with the selected style from properties
Private Sub DrawLine(pt As ptObject)
Dim brushFore As New SolidBrush(pt.ForeColor)
Dim penDraw As New Pen(brushFore, pt.penSize)
Select Case pt.penStyle
Case Principal.SOLID_STYLE
penDraw.DashStyle = DashStyle.Solid
Case Principal.DASH_STYLE
penDraw.DashStyle = DashStyle.Dash
Case Principal.DOT_STYLE
penDraw.DashStyle = DashStyle.Dot
Case Principal.DASDOT_STYLE
penDraw.DashStyle = DashStyle.DashDot
End Select
g.DrawLine(penDraw, pt.X1, pt.X2)
End Sub
Private Sub DrawArrow(pt As ptObject, arrowStart As Boolean)
Dim brushFore As New SolidBrush(pt.ForeColor)
Dim penDraw As New Pen(brushFore, pt.penSize)
Select Case pt.penStyle
Case Principal.SOLID_STYLE
penDraw.DashStyle = DashStyle.Solid
Case Principal.DASH_STYLE
penDraw.DashStyle = DashStyle.Dash
Case Principal.DOT_STYLE
penDraw.DashStyle = DashStyle.Dot
Case Principal.DASDOT_STYLE
penDraw.DashStyle = DashStyle.DashDot
End Select
If arrowStart Then
drawLineArrow.ArrowEnd(g, pt, penDraw.DashStyle)
Else
drawLineArrow.ArrowStartEnd(g, pt, penDraw.DashStyle)
End If
End Sub
Where drawLineArrow is a Type of Arrow ( see class Arrow)
We do the same thing to draw an ellipse, rectangle , bolt, text, cube usign the selected style
of the pen and the selected brush for the colors filling.
Private Sub DrawEllipse(pt As ptObject)
Dim oBmp As Bitmap
Dim oBrushTexture As TextureBrush
Dim brushFore As New SolidBrush(pt.ForeColor)
Dim penDraw As New Pen(brushFore, pt.penSize)
Dim brushFill As New LinearGradientBrush(pt.X1, pt.X2, pt.FillColor, pt.FillColor2)
Select Case pt.penStyle
Case Principal.SOLID_STYLE
penDraw.DashStyle = DashStyle.Solid
Case Principal.DASH_STYLE
penDraw.DashStyle = DashStyle.Dash
Case Principal.DOT_STYLE
penDraw.DashStyle = DashStyle.Dot
Case Principal.DASDOT_STYLE
penDraw.DashStyle = DashStyle.DashDot
End Select
g.DrawEllipse(penDraw, New Rectangle(pt.X1, New Size(pt.X2.X - pt.X1.X, pt.X2.Y - pt.X1.Y)))
If pt.brushBitmap <> Nothing Then
oBmp = New Bitmap(CStr(pt.brushBitmap))
oBrushTexture = New TextureBrush(oBmp)
g.FillEllipse(oBrushTexture, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y) - 1)
Else
g.FillEllipse(brushFill, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y) - 1)
End If
End Sub
Private Sub DrawRectangle(pt As ptObject)
Dim oBmp As Bitmap
Dim oBrushTexture As TextureBrush
Dim brushFore As New SolidBrush(pt.ForeColor)
Dim penDraw As New Pen(brushFore, pt.penSize)
Dim brushFill As New LinearGradientBrush(pt.X1, pt.X2, pt.FillColor, pt.FillColor2)
Select Case pt.penStyle
Case Principal.SOLID_STYLE
penDraw.DashStyle = DashStyle.Solid
Case Principal.DASH_STYLE
penDraw.DashStyle = DashStyle.Dash
Case Principal.DOT_STYLE
penDraw.DashStyle = DashStyle.Dot
Case Principal.DASDOT_STYLE
penDraw.DashStyle = DashStyle.DashDot
End Select
g.DrawRectangle(penDraw, New Rectangle(pt.X1, New Size(pt.X2.X - pt.X1.X, pt.X2.Y - pt.X1.Y)))
If pt.brushBitmap <> Nothing Then
oBmp = New Bitmap(pt.brushBitmap)
oBrushTexture = New TextureBrush(oBmp)
g.FillRectangle(oBrushTexture, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y) - 1)
Else
g.FillRectangle(brushFill, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y) - 1)
End If
End Sub
Private Sub DrawBOLT(pt As ptObject)
If pt.brushBitmap Is Nothing Then
DrawBOLTWithoutTexture(pt)
Else
DrawBOLTWithTexture(pt)
End If
End Sub
Private Sub DrawBOLTWithTexture(pt As ptObject)
Dim oBmp As Bitmap
Dim oBrushTexture As TextureBrush
Dim brushFore As New SolidBrush(pt.ForeColor)
Dim penDraw As New Pen(brushFore, pt.penSize)
Dim brushFill As New LinearGradientBrush(pt.X1, pt.X2, pt.FillColor, pt.FillColor2)
If pt.brushBitmap = "" Then
DrawBOLTWithoutTexture(pt)
Return
End If
oBmp = New Bitmap(pt.brushBitmap)
oBrushTexture = New TextureBrush(oBmp)
Select Case pt.penStyle
Case Principal.SOLID_STYLE
penDraw.DashStyle = DashStyle.Solid
Case Principal.DASH_STYLE
penDraw.DashStyle = DashStyle.Dash
Case Principal.DOT_STYLE
penDraw.DashStyle = DashStyle.Dot
Case Principal.DASDOT_STYLE
penDraw.DashStyle = DashStyle.DashDot
End Select
Dim d As Integer = CInt((pt.X2.X - pt.X1.X) / 3)
Dim bl As New GraphicsPath()
bl.AddEllipse(pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2) - CInt(d / 2), pt.X1.Y +
CInt((pt.X2.Y - pt.X1.Y) / 2) - CInt(d / 2), d, d)
bl.StartFigure()
bl.AddLine(pt.X1.X, pt.X1.Y, pt.X1.X, pt.X2.Y)
bl.AddLine(pt.X2.X, pt.X1.Y, pt.X2.X, pt.X2.Y)
bl.AddLine(pt.X1.X, pt.X1.Y, pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2), pt.X1.Y -
CInt((pt.X2.Y - pt.X1.Y) / 2))
bl.AddLine(pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2), pt.X1.Y - CInt((pt.X2.Y -
pt.X1.Y) / 2), pt.X2.X, pt.X1.Y)
bl.AddLine(pt.X1.X, pt.X2.Y, pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2), pt.X2.Y
+ CInt((pt.X2.Y - pt.X1.Y) / 2))
bl.AddLine(pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2), pt.X2.Y + CInt((pt.X2.Y - pt.X1.Y) / 2),
pt.X2.X, pt.X2.Y)
g.DrawPath(penDraw, bl)
g.FillPath(oBrushTexture, bl)
bl.Reset()
bl.AddEllipse(pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2) - CInt(d / 2), pt.X1.Y +
CInt((pt.X2.Y - pt.X1.Y) / 2) - CInt(d / 2), d, d)
g.DrawPath(penDraw, bl)
g.FillPath(brushFill, bl)
End Sub
Private Sub DrawBOLTWithoutTexture(pt As ptObject)
Dim brushFore As New SolidBrush(pt.ForeColor)
Dim penDraw As New Pen(brushFore, pt.penSize)
Dim brushFill As New LinearGradientBrush(pt.X1, pt.X2, pt.FillColor, pt.FillColor2)
Select Case pt.penStyle
Case Principal.SOLID_STYLE
penDraw.DashStyle = DashStyle.Solid
Case Principal.DASH_STYLE
penDraw.DashStyle = DashStyle.Dash
Case Principal.DOT_STYLE
penDraw.DashStyle = DashStyle.Dot
Case Principal.DASDOT_STYLE
penDraw.DashStyle = DashStyle.DashDot
End Select
Dim d As Integer = CInt((pt.X2.X - pt.X1.X) / 3)
Dim bl As New GraphicsPath()
bl.AddEllipse(pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2) - CInt(d / 2), pt.X1.Y +
CInt((pt.X2.Y - pt.X1.Y) / 2) - CInt(d / 2), d, d)
bl.StartFigure()
bl.AddLine(pt.X1.X, pt.X1.Y, pt.X1.X, pt.X2.Y)
bl.StartFigure()
bl.AddLine(pt.X2.X, pt.X1.Y, pt.X2.X, pt.X2.Y)
bl.StartFigure()
bl.AddLine(pt.X1.X, pt.X1.Y, pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2), pt.X1.Y -
CInt((pt.X2.Y - pt.X1.Y) / 2))
bl.StartFigure()
bl.AddLine(pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2), pt.X1.Y -
CInt((pt.X2.Y - pt.X1.Y) / 2), pt.X2.X, pt.X1.Y)
bl.StartFigure()
bl.AddLine(pt.X1.X, pt.X2.Y, pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2), pt.X2.Y +
CInt((pt.X2.Y - pt.X1.Y) / 2))
bl.StartFigure()
bl.AddLine(pt.X1.X + CInt((pt.X2.X - pt.X1.X) / 2), pt.X2.Y + CInt((pt.X2.Y - pt.X1.Y) / 2),
pt.X2.X, pt.X2.Y)
g.DrawPath(penDraw, bl)
g.FillPath(brushFill, bl)
g.ResetTransform()
End Sub
Private Sub DrawLabel(pt As ptObject)
Dim oBmp As Bitmap
Dim brush As LinearGradientBrush
Dim oBrusht As TextureBrush
If pt.brushBitmap <> Nothing Then
oBmp = New Bitmap(CStr(pt.brushBitmap))
oBrusht = New TextureBrush(oBmp)
If (pt.directionText = "Vertical") Then
Dim strf As StringFormat = New StringFormat(StringFormatFlags.DirectionVertical)
g.DrawString(pt.text, pt.font, oBrusht, pt.X1.X, pt.X1.Y, strf)
Else
g.DrawString(pt.text, pt.font, oBrusht, pt.X1.X, pt.X1.Y)
End If
Else
brush = New LinearGradientBrush(pt.X1, pt.X2, pt.FillColor, pt.FillColor2)
If (pt.directionText = "Vertical") Then
Dim strf As StringFormat = New StringFormat(StringFormatFlags.DirectionVertical)
g.DrawString(pt.text, pt.font, brush, pt.X1.X, pt.X1.Y, strf)
Else
g.DrawString(pt.text, pt.font, brush, pt.X1.X, pt.X1.Y)
End If
End If
End Sub
Private Sub DrawCUBE(pt As ptObject)
Dim oBmp As Bitmap
Dim oBrushTexture As TextureBrush
Dim brushFore As New SolidBrush(pt.ForeColor)
Dim penDraw As New Pen(brushFore, pt.penSize)
Dim brushFill As New LinearGradientBrush(pt.X1, pt.X2, pt.FillColor, pt.FillColor2)
Select Case pt.penStyle
Case Principal.SOLID_STYLE
penDraw.DashStyle = DashStyle.Solid
Case Principal.DASH_STYLE
penDraw.DashStyle = DashStyle.Dash
Case Principal.DOT_STYLE
penDraw.DashStyle = DashStyle.Dot
Case Principal.DASDOT_STYLE
penDraw.DashStyle = DashStyle.DashDot
End Select
g.DrawRectangle(penDraw, New Rectangle(pt.X1, New Size(pt.X2.X - pt.X1.X, pt.X2.Y - pt.X1.Y)))
g.DrawRectangle(penDraw, New Rectangle(New Point(pt.X1.X + pt.dCube, pt.X1.Y - pt.dCube),
New Size((pt.X2.X + pt.dCube) -
(pt.X1.X + pt.dCube), ((pt.X2.Y - pt.dCube) - (pt.X1.Y - pt.dCube)))))
g.DrawLine(penDraw, pt.X1.X, pt.X1.Y, pt.X1.X + pt.dCube, pt.X1.Y - pt.dCube)
g.DrawLine(penDraw, pt.X1.X, pt.X2.Y, pt.X1.X + pt.dCube, pt.X2.Y - pt.dCube)
g.DrawLine(penDraw, pt.X2.X, pt.X2.Y, pt.X2.X + pt.dCube, pt.X2.Y - pt.dCube)
g.DrawLine(penDraw, pt.X2.X, pt.X1.Y, pt.X2.X + pt.dCube, pt.X1.Y - pt.dCube)
If pt.brushBitmap <> Nothing Then
oBmp = New Bitmap(pt.brushBitmap)
oBrushTexture = New TextureBrush(oBmp)
g.FillRectangle(oBrushTexture, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y) - 1)
Else
g.FillRectangle(brushFill, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y) - 1)
End If
End Sub
In order to show the position of the mouse cursor ( currentMouseX and currentMouseY) , we need a function like this
Private Sub drawPosition()
Dim penPosition As New Pen(Principal._designSettings.DesignForeColor)
Dim brsFill As New SolidBrush(Principal._designSettings.DesignForeColor)
Dim brsString As New SolidBrush(source._designSettings.DesignBackColor)
Dim fnt As New Font("Arial", 8)
g.DrawRectangle(penPosition, CurrentMouseX - 1, CurrentMouseY + 20, 50, 20)
g.FillRectangle(brsFill, New Rectangle(CurrentMouseX, CurrentMouseY + 21, 49, 19))
g.DrawString(Str(CurrentMouseX) & "," & CStr(CurrentMouseY), fnt, brsString,
New PointF(CurrentMouseX, CurrentMouseY + 23))
End Sub
The Principal._designSettings.DesignForeColor is the color used to draw the string and saved
before by yhe user in the application setting ( properties menu)
instead source._designSettings.DesignBackColor is the background color of the drawing area
( drawPan see the first figure )
The following function allows you to insert an image with the selected brightness, contrast and gamma .
Public Function AdjustImage(original As Bitmap, Optional brightness As Double = 1.0F,
Optional contrast As Double = 1.0F, Optional gamma As Double = 1.0F) As Bitmap
Dim adjustedImage = New Bitmap(original.Width, original.Height)
Dim adjustedBrightness As Double = brightness - 1.0F
Dim cMatrix As New ColorMatrix(New Single()() _
{
New Single() {contrast, 0, 0, 0, 0},
New Single() {0, contrast, 0, 0, 0},
New Single() {0, 0, contrast, 0, 0},
New Single() {0, 0, 0, 1.0F, 0},
New Single() {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1}})
Dim ia As New ImageAttributes()
ia.ClearColorMatrix()
ia.SetColorMatrix(cMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)
ia.SetGamma(gamma, ColorAdjustType.Bitmap)
Dim g As Graphics = Graphics.FromImage(adjustedImage)
g.DrawImage(original, New Rectangle(Point.Empty, adjustedImage.Size), 0, 0, original.Width,
original.Height, GraphicsUnit.Pixel, ia)
Return adjustedImage
End Function
Private Sub DDrawImage(ByRef pt As ptObject)
pt.bitmap = AdjustImage(pt.bitmap, pt.brightness, pt.contrast, pt.gamma)
g.DrawImage(pt.bitmap, pt.X1.X, pt.X1.Y, pt.X2.X - pt.X1.X, pt.X2.Y - pt.X1.Y)
End Sub
Now I try to explain the general function which calls all the above sub-functions and this function
is called when mouse events are raised like the event mouse_move , mouse_up, ....
Public Sub Draw()
On Error Go to log
Dim oBmp As Bitmap
Dim oBrushTexture As TextureBrush
g = Graphics.FromImage(bm)
g.Transform = gmatrix
g.Clear(source._designSettings.DesignBackColor)
lstDrawOject = lstDrawOject.Cast(Of ptObject)() _
.OrderBy(Function(i As ptObject) Convert.ToBoolean(i.bringToFront)) _
.ToList()
lstSelDrawOject = lstSelDrawOject.Cast(Of ptObject)() _
.OrderBy(Function(i As ptObject) Convert.ToBoolean(i.bringToFront)) _
.ToList()
If source.nMode = Principal.DELETE Then ' If the user want remove object ,
I switch to selection mode and
I remove the selected object
from the list of the drawn objetcs
source.nMode = Principal.SELECTION ' and I put them in the list of deleted
objects because the objects can be
recovered with Ctrl+Z
For Each ptSel In lstSelDrawOject
For Each ptO In lstDrawOject
If (ptO.name = ptSel.name) Then
lstDrawOject.Remove(ptO)
lstRedoDrawOject.Add(ptO)
Exit For
End If
Next
Next
lstSelDrawOject.Clear()
End If
For Each pt In lstDrawOject
If (pt.rotation <> 0 And pt.draw <> Principal.IIMAGE) Then ' If the property rotation have
'a value I apply the rotation of the object
g.RotateTransform(pt.rotation)
End If
Select Case pt.draw ' Now we call the specific drawing function switch the
selected function in the tool bar
Case Principal.LINE
DrawLine(pt)
Case Principal.LINEARROW
DrawArrow(pt, True)
Case Principal.LINEARROWSE
DrawArrow(pt, False)
Case Principal.PEN
DrawPen(pt)
Case Principal.RECTANGLE
DrawRectangle(pt)
Case Principal.CUBE
DrawCUBE(pt)
Case Principal.CURVE
DrawCurve(pt)
Case Principal.ELLIPSE
DrawEllipse(pt)
Case Principal.BOLT
DrawBOLT(pt)
Case Principal.IIMAGE
If (pt.rotation = 0) Then
DDrawImage(pt)
Else
drawImageRot(pt)
End If
Case Principal.LABEL ' Draw the string written in the object property.
DrawLabel(pt)
End Select
If (pt.rotation <> 0) Then
g.ResetTransform()
End If
Next
For Each pt In lstTempDrawOject ' This list is temporary and allows you to draw objects
' when we are still drawing or
' moving the objects.
If (pt.rotation <> 0 And pt.draw <> Principal.IIMAGE) Then
g.RotateTransform(pt.rotation)
End If
Select Case pt.draw
Case Principal.LINE
DrawLine(pt)
Case Principal.LINEARROW
DrawArrow(pt, True)
Case Principal.LINEARROWSE
DrawArrow(pt, False)
Case Principal.RECTANGLE
DrawRectangle(pt)
Case Principal.CUBE
DrawCUBE(pt)
Case Principal.ELLIPSE
DrawEllipse(pt)
Case Principal.BOLT
DrawBOLT(pt)
Case Principal.IIMAGE
If (pt.rotation = 0) Then
DDrawImage(pt)
Else
drawImageRot(pt)
End If
End Select
If (pt.rotation <> 0) Then
g.ResetTransform()
End If
Next
For Each pt In lstSelDrawOject ' Here I draw the selected objects.
If (pt.rotation <> 0 And pt.draw <> Principal.IIMAGE) Then
g.RotateTransform(pt.rotation)
End If
Select Case pt.draw
Case Principal.LINE
DrawLine(pt)
Case Principal.LINEARROW
DrawArrow(pt, True)
Case Principal.LINEARROWSE
DrawArrow(pt, False)
Case Principal.PEN
DrawPen(pt)
Case Principal.RECTANGLE
DrawRectangle(pt)
Case Principal.CUBE
DrawCUBE(pt)
Case Principal.CURVE
DrawCurve(pt)
calcolaMinMaxCurve(pt)
Case Principal.ELLIPSE
DrawEllipse(pt)
Case Principal.BOLT
DrawBOLT(pt)
Case Principal.IIMAGE
If (pt.rotation = 0) Then
DDrawImage(pt)
Else
drawImageRot(pt)
End If
Case Principal.LABEL
DrawLabel(pt)
End Select
If (pt.rotation <> 0) Then
g.ResetTransform()
End If
DrawCursor(g, pt)
Next
If (lstCurveDrawOject.Count <> 0) Then ' In this case I draw all the lines for each
' curve object in the list.
Dim penLine As New Pen(source._designSettings.DesignForeColor)
penLine.MiterLimit = 0
Dim ptCurve As New List(Of Drawing.PointF)
Dim fd As Boolean
For Each ptC In lstCurveDrawOject
fd = False
For Each p In ptCurve
If p.X = ptC.X And p.Y = ptC.Y Then
fd = True
End If
Next
If Not fd Then
ptCurve.Add(ptC)
End If
Next
If (ptCurve.Count > 1) Then
g.DrawLines(penLine, ptCurve.ToArray())
Dim PC(ptCurve.Count) As PointF
For i = 0 To ptCurve.Count - 1
PC(i) = ptCurve(i)
Next
If source._designSettings.DesignBitmap <> Nothing Then
oBmp = New Bitmap(CStr(source._designSettings.DesignBitmap))
oBrushTexture = New TextureBrush(oBmp)
g.FillPolygon(oBrushTexture, PC)
Else
Dim brushFill As New LinearGradientBrush(PC(0), PC(ptCurve.Count - 1),
source._designSettings.DesignFillColor,
source._designSettings.DesignFillColor2)
g.FillPolygon(brushFill, PC)
End If
End If
ptCurve = Nothing
penLine = Nothing
End If
lstTempDrawOject.Clear()
If source.nMode = Principal.FILL And ptFill <> Nothing Then
Dim pt As ptObject
pt = GetObjPointToFill(ptFill) ' When I'm in the fill mode I search the object
' where I apply the fill color.
Dim brsFill As New LinearGradientBrush(pt.X1, pt.X2, source._designSettings.DesignFillColor,
source._designSettings.DesignFillColor2)
If (pt.name <> Nothing) Then
Select Case pt.draw
Case Principal.RECTANGLE
g.FillRectangle(brsFill, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y - 1))
Case Principal.CUBE
g.FillRectangle(brsFill, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y - 1))
g.FillRectangle(brsFill, New Rectangle(New Point(pt.X1.X + pt.dCube + 1,
pt.X1.Y - (pt.dCube - 1)),
New Size((pt.X2.X + pt.dCube + 1) - (pt.X1.X + pt.dCube + 1),
((pt.X2.Y - (pt.dCube - 1)) -
(pt.X1.Y - (pt.dCube - 1))))))
Case Principal.ELLIPSE
g.FillEllipse(brsFill, pt.X1.X + 1, pt.X1.Y + 1, (pt.X2.X - pt.X1.X) - 1,
(pt.X2.Y - pt.X1.Y - 1))
Case Principal.CURVE
Dim P(pt.lstPtCurve.Count) As PointF
For i = 0 To pt.lstPtCurve.Count - 1
P(i) = pt.lstPtCurve(i)
Next
g.FillPolygon(brsFill, P)
End Select
lstDrawOject.Remove(pt)
pt.FillColor = source._designSettings.DesignFillColor
pt.FillColor2 = source._designSettings.DesignFillColor2
pt.brushBitmap = source._designSettings.DesignBitmap
lstDrawOject.Add(pt)
End If
ptFill = Nothing
End If
If Principal.SELECTION And bMouseDown And ptSelAll <> Nothing Then
DrawCursorAll(g)
End If
If (source.bGrid) Then
DrawGrid(g)
End If
If bMouseDown Then
drawPosition()
End If
source.DrawPan.CreateGraphics().DrawImage(bm, New Point(source.DrawPan.AutoScrollPosition.X,
source.DrawPan.AutoScrollPosition.Y))
' Draw the objects in the draw panel.
exit sub
log:
Debug.Print(err.Description)
End Sub
Now let's see how the function draw is called.
Event MouseDown
Public Sub MouseDown(sender As Object, e As MouseEventArgs)
If (e.Button = MouseButtons.Left) Then
If (poMenu.isVisible) Then
Dim op As ptObject = poMenu.DestroyPopupMenu()
If (op.name IsNot Nothing) Then
lstSelDrawOject.Clear()
If op.draw = Principal.LABEL Then
If op.directionText = "Vertical" Then
op.X2.X = op.X1.X + op.font.GetHeight() * 3 / 2
Else
op.X2.X = op.X1.X + MeasureDisplayStringWidth(op.text, op.font) + 10
End If
End If
lstSelDrawOject.Add(op)
Draw()
End If
End If
bMouseDown = True
If (source.nMode = Principal.ZOOM_M Or source.nMode = Principal.ZOOM_P) Then
ctrlKey = True
End If
HscrollX = source.DrawPan.HorizontalScroll.Value
VscrollY = source.DrawPan.VerticalScroll.Value
oldLocation.Y = 0
oldLocation.X = 0
lstDrawOject = lstDrawOject.Cast(Of ptObject)().OrderBy(Function(i As ptObject)
Convert.ToBoolean(Not i.bringToFront)).ToList()
If (source.nMode = Principal.SELECTION) Then
If (lstSelDrawOject.Count = 1) Then
Dim p As ptObject = lstSelDrawOject(0)
If (e.Location.X + HscrollX) > p.X1.X - (p.rotation * 10) And
(e.Location.X + HscrollX) < p.X1.X + 25 -
(p.rotation * 10) And
((e.Location.Y + VscrollY) > p.X1.Y + (p.rotation * 10)) And
(e.Location.Y + VscrollY < p.X1.Y + 25 +
(p.rotation * 10))
And p.draw <> Principal.BOLT And p.draw <> Principal.ELLIPSE
And p.draw <> Principal.LABEL Then
If p.rotation < 180 Then
p.rotation += 5
For Each py In lstDrawOject
If py.name = p.name Then
lstDrawOject.Remove(py)
lstSelDrawOject.Clear()
lstDrawOject.Add(p)
lstSelDrawOject.Add(p)
Draw()
Exit Sub
End If
Next
End If
Exit Sub
End If
If (e.Location.X + HscrollX) > p.X2.X - (p.rotation * 10) And
(e.Location.X + HscrollX) < p.X2.X + 25 And
(e.Location.Y + VscrollY > p.X2.Y - 10 + (p.rotation * 10))
And (e.Location.Y + VscrollY < p.X2.Y + 21 +
(p.rotation * 10)) _
And p.draw <> Principal.BOLT And p.draw <> Principal.ELLIPSE
And p.draw <> Principal.LABEL Then
If p.rotation > 0 Then
p.rotation -= 5
If p.rotation < 0 Then p.rotation = 0
For Each py In lstDrawOject
If py.name = p.name Then
lstDrawOject.Remove(py)
lstSelDrawOject.Clear()
lstDrawOject.Add(p)
lstSelDrawOject.Add(p)
Draw()
Exit Sub
End If
Next
End If
Exit Sub
End If
End If
For Each pt In lstDrawOject
If InRegion(e, pt) Then
AddSelectionObject(pt)
Draw()
Exit Sub
End If
Next
If (lstSelDrawOject.Count = 0) Then
bInSelect = True
ptSelAll = New Point(e.Location.X + HscrollX, (e.Location.Y + VscrollY))
oldLocation.X = 0
For Each pt In lstDrawOject
If InRegion(e, pt) Then
AddSelectionObject(pt)
End If
Next
Draw()
Else
bInSelect = False
End If
Exit Sub
End If
ptObjectC = New ptObject
ptObjectC.X1.X = e.Location.X + HscrollX
ptObjectC.X1.Y = (e.Location.Y + VscrollY)
ptObjectC.name = "obj" & lstDrawOject.Count + 1
ptObjectC.orderDesign = lstDrawOject.Count + 1
ptObjectC.dCube = 50
If source.nMode = Principal.LABEL Then
If Not editText.Visible Then
editText.Location = New Point(e.Location.X + HscrollX, (e.Location.Y + VscrollY))
editText.Visible = True
editText.ForeColor = source._designSettings.DesignForeColor
editText.BackColor = source._designSettings.DesignBackColor
editText.Font = New Font(source._designSettings.DesignFont.Name, source._designSettings.DesignFont.Size)
ptObjectC.directionText = source._designSettings.DesignDirectionText
editText.Select()
Exit Sub
Else
editTextLeave(sender, e)
Exit Sub
End If
End If
If (source.nMode = Principal.FILL) Then
ptFill.X = e.Location.X + HscrollX
ptFill.Y = (e.Location.Y + VscrollY)
End If
If (source.nMode = Principal.CURVE) Then
Dim pt As New PointF(e.Location.X + HscrollX, (e.Location.Y + VscrollY))
lstCurveDrawOject.Add(pt)
End If
Draw()
Else
FinalizeCurveDraw()
End If
End Sub
Event MouseMove
Public Sub MouseMove(sender As Object, e As MouseEventArgs)
HscrollX = source.DrawPan.HorizontalScroll.Value
VscrollY = source.DrawPan.VerticalScroll.Value
CurrentMouseX = e.Location.X + HscrollX
CurrentMouseY = e.Location.Y + VscrollY
If (editText.Visible) Then Exit Sub
If Principal.SELECTION Then
If bMouseDown And ptSelAll <> Nothing And bInSelect Then
ptSelAllF = New Point(e.Location.X + HscrollX, (e.Location.Y + VscrollY))
For Each pt In lstDrawOject
If pt.draw = Principal.CURVE Then
calcolaMinMaxCurve(pt)
If (ptSelAll.X < pt.X1.X And ptSelAllF.X > pt.X2.X) And
(ptSelAll.Y < pt.X1.Y And ptSelAllF.Y > pt.X2.Y) Then
AddSelectionObject(pt)
End If
Else
If (pt.X1.X > ptSelAll.X And pt.X1.Y > ptSelAll.Y And _
pt.X2.X < ptSelAllF.X And pt.X2.Y < ptSelAllF.Y) Then
AddSelectionObject(pt)
End If
End If
Next
Draw()
Exit Sub
Else
If lstSelDrawOject.Count = 1 And source.nMode = Principal.SELECTION And Not bMouseDown Then
source.ResetResize()
Dim o As ptObject = lstSelDrawOject(0)
calcolaMinMaxCurve(o)
If ((e.Location.X + HscrollX) > o.X2.X - 10) And ((e.Location.X + HscrollX) < o.X2.X) And
(((e.Location.Y + VscrollY)) > o.X1.Y - 10 + (o.rotation * 10)) And
(((e.Location.Y + VscrollY)) < o.X1.Y + 10 + (o.rotation * 10)) Then
source.Cursor = Cursors.Hand
If (Not poMenu.isVisible) Then
poMenu.GetPopupMenuStyleLines(o, source.DrawPan, o.X2.X - HscrollX,
o.X1.Y - VscrollY + (o.rotation * 10),
source._objSettings)
End If
Exit Sub
End If
If (o.draw <> Principal.LABEL) Then
If ((e.Location.X + HscrollX) > ((o.X1.X - (o.rotation * 10)) +
((o.X2.X - (o.X1.X - (o.rotation * 10))) / 2)) And
((e.Location.X + HscrollX) < ((o.X1.X - (o.rotation * 10)) +
((o.X2.X - (o.X1.X - (o.rotation * 10))) / 2) + 10) And
(((e.Location.Y + VscrollY)) > o.X1.Y - 10 + (o.rotation * 10))
And (((e.Location.Y + VscrollY)) < o.X1.Y + 10 +
(o.rotation * 10)))) Then
source.Cursor = Cursors.SizeNS
source.nResizeUp = True
objResize = o
Exit Sub
End If
If ((e.Location.X + HscrollX) > ((o.X1.X - (o.rotation * 10)) +
((o.X2.X - (o.X1.X - (o.rotation * 10))) / 2)) And
((e.Location.X + HscrollX) < ((o.X1.X - (o.rotation * 10)) +
((o.X2.X - (o.X1.X - (o.rotation * 10))) / 2) + 10) And
(((e.Location.Y + VscrollY)) > o.X2.Y - 10 + (o.rotation * 10))
And (((e.Location.Y + VscrollY)) < o.X2.Y + 10 + (o.rotation * 10)))) Then
source.Cursor = Cursors.SizeNS
source.nResizeDown = True
objResize = o
Exit Sub
End If
If ((e.Location.X + HscrollX) > o.X1.X - 5 - (o.rotation * 10)
And ((e.Location.X + HscrollX) < o.X1.X + 10 - (o.rotation * 10)) And
(((e.Location.Y + VscrollY)) > o.X1.Y + ((o.X2.Y - o.X1.Y) / 2)) +
(o.rotation * 10)
And (((e.Location.Y +
VscrollY)) < o.X1.Y + ((o.X2.Y - o.X1.Y) / 2)) + 10 +
(o.rotation * 10)) Then
source.Cursor = Cursors.SizeWE
source.nResizeLeft = True
objResize = o
Exit Sub
End If
If ((e.Location.X + HscrollX) > o.X2.X And
((e.Location.X + HscrollX) < o.X2.X + 10) And
(((e.Location.Y + VscrollY)) > o.X1.Y + ((o.X2.Y - o.X1.Y) / 2))
+ (o.rotation * 10) And
(((e.Location.Y + VscrollY)) < o.X1.Y + ((o.X2.Y - o.X1.Y) / 2))
+ 10 + (o.rotation * 10)) Then
source.Cursor = Cursors.SizeWE
source.nResizeRight = True
objResize = o
Exit Sub
End If
End If
End If
End If
End If
If source.nMode = Principal.FILL And source.Cursor <> cursorFill Then
source.Cursor = cursorFill
End If
If bMouseDown Then
If source.IsInResize And Not objResize.name Is Nothing Then
If (source.nResizeLeft) Then
objResize.X1.X = e.Location.X + HscrollX
UpdateLstCurveXLeft(objResize)
End If
If (source.nResizeRight) Then
objResize.X2.X = e.Location.X + HscrollX
End If
If (source.nResizeUp) Then
objResize.X1.Y = (e.Location.Y + VscrollY)
End If
If (source.nResizeDown) Then
objResize.X2.Y = (e.Location.Y + VscrollY)
End If
For Each pt In lstDrawOject
If (pt.name = objResize.name) Then
lstDrawOject.Remove(pt)
Exit For
End If
Next
If (Not objResize.name Is Nothing) Then
lstSelDrawOject.Clear()
lstSelDrawOject.Add(objResize)
lstTempDrawOject.Add(objResize)
End If
Draw()
Exit Sub
End If
diffX = 0
If (oldLocation.X <> 0) Then
diffX = (e.Location.X + HscrollX) - oldLocation.X
End If
diffY = 0
If (oldLocation.Y <> 0) Then
diffY = ((e.Location.Y + VscrollY)) - oldLocation.Y
End If
oldLocation.Y = (e.Location.Y + VscrollY)
oldLocation.X = e.Location.X + HscrollX
If source.nMode = Principal.SELECTION Then
source.Cursor = Cursors.SizeAll
UpdateDesign(New Point(e.Location.X + HscrollX, (e.Location.Y + VscrollY)))
End If
If source.nMode = Principal.PEN Then
ptObjectC = New ptObject
source.Cursor = New Cursor("Pen.cur")
ptObjectC.name = "obj" & lstDrawOject.Count + 1
ptObjectC.orderDesign = lstDrawOject.Count + 1
ptObjectC.X1.X = e.Location.X + HscrollX
ptObjectC.X1.Y = (e.Location.Y + VscrollY)
ptObjectC.X2.X = e.Location.X + HscrollX
ptObjectC.X2.Y = (e.Location.Y + VscrollY)
ptObjectC.penLine = New Pen(source._designSettings.DesignForeColor, 1)
ptObjectC.penSize = 1
ptObjectC.bringToFront = True
ptObjectC.ForeColor = source._designSettings.DesignForeColor
ptObjectC.FillColor = source._designSettings.DesignFillColor
ptObjectC.FillColor2 = source._designSettings.DesignFillColor2
ptObjectC.penStyle = Principal.SOLID_STYLE
ptObjectC.draw = source.nMode
lstDrawOject.Add(ptObjectC)
Else
If (source.nMode > 0 And source.nMode < 10) And Not ptObjectC.name Is Nothing Then
source.Cursor = New Cursor("Pen.cur")
ptObjectC.X2.X = e.Location.X + HscrollX
ptObjectC.X2.Y = (e.Location.Y + VscrollY)
ptObjectC.penLine = New Pen(source._designSettings.DesignForeColor, 1)
ptObjectC.penSize = 1
ptObjectC.bringToFront = True
ptObjectC.ForeColor = source._designSettings.DesignForeColor
ptObjectC.FillColor = source._designSettings.DesignFillColor
ptObjectC.FillColor2 = source._designSettings.DesignFillColor2
ptObjectC.penStyle = Principal.SOLID_STYLE
ptObjectC.brushBitmap = source._designSettings.DesignBitmap
ptObjectC.draw = source.nMode
lstTempDrawOject.Add(ptObjectC)
End If
End If
Draw()
End If
End Sub
Event MouseUp
Public Sub MouseUp(sender As Object, e As MouseEventArgs)
source.Cursor = Nothing
ptSelAll = Nothing
ptSelAllF = Nothing
ctrlKey = False
HscrollX = source.DrawPan.HorizontalScroll.Value
VscrollY = source.DrawPan.VerticalScroll.Value
If (source.nMode <> Principal.FILL) Then
source.Cursor = Cursors.Default
End If
bMouseDown = False
If (source.nMode > 0 And source.nMode < 10) And Not source.IsInResize
And source.nMode <> Principal.CURVE
And source.nMode <> Principal.PEN Then
ptObjectC.X2.X = e.Location.X + HscrollX
ptObjectC.X2.Y = (e.Location.Y + VscrollY)
ptObjectC.brushBitmap = ""
ptObjectC.XORIG1.X = ptObjectC.X1.X
ptObjectC.XORIG2.X = ptObjectC.X2.X
ptObjectC.XORIG1.Y = ptObjectC.X1.Y
ptObjectC.XORIG2.Y = ptObjectC.X2.Y
ptObjectC.rotation = 0
ptObjectC.penLine = New Pen(source._designSettings.DesignForeColor, 1)
ptObjectC.brushBitmap = source._designSettings.DesignBitmap
ptObjectC.penStyle = Principal.SOLID_STYLE
ptObjectC.penSize = 1
ptObjectC.dCube = 50
ptObjectC.draw = source.nMode
ptObjectC.brightness = 1.2F
ptObjectC.contrast = 1.0F
ptObjectC.gamma = 1.0F
ptObjectC.bitmap = source.imageBitmap
ptObjectC.bringToFront = True
ptObjectC.name = "obj" & lstDrawOject.Count + 1
ptObjectC.orderDesign = lstDrawOject.Count + 1
lstDrawOject.Add(ptObjectC)
ptObjectC = Nothing
Else
If source.IsInResize Then
For Each ptO In lstDrawOject
If (ptO.name = objResize.name) Then
lstDrawOject.Remove(ptO)
Exit For
End If
Next
If (Not objResize.name Is Nothing) Then
lstDrawOject.Add(objResize)
End If
objResize.name = Nothing
End If
End If
Draw()
End Sub
Event Resize
Private Sub Resize(sender As Object, e As EventArgs)
Draw()
End Sub
Now let's see some menu function
Public Sub CopySelectedObject() ' This function allows us to copy the selected objects.
lstCopiedSelDrawOject.Clear()
For Each p In lstSelDrawOject
lstCopiedSelDrawOject.Add(p)
Next
End Sub
Instead with this one, paste the selected objects
Public Sub PasteCopiedObject()
lstSelDrawOject.Clear()
For Each p In lstCopiedSelDrawOject
Dim pn As New ptObject
pn = p
pn.name = "obj" & CStr(lstDrawOject.Count + 1)
pn.X1.X = pn.X1.X - 50
pn.X2.X = pn.X2.X - 50
lstSelDrawOject.Add(pn)
lstDrawOject.Add(pn)
Next
lstCopiedSelDrawOject.Clear()
source.setButtonSelectiobSelected()
source.nMode = Principal.SELECTION
Draw()
End Sub
AddSelectionObject allows us to add an object to the selection
Public Sub AddSelectionObject(obj As ptObject)
Dim b As Boolean = False
For Each o In lstSelDrawOject
If o.name = obj.name Then
b = True
Exit For
End If
Next
If (Not b) Then
lstSelDrawOject.Add(obj)
End If
End Sub
The AppSettings class
This class implement the iterface ISettings and allows the application properties to be saved
Public Interface ISettings
Sub SaveSetting(_xmlAppSetting As String)
Sub Load()
Sub SaveSetting(ByRef obj As ptObject)
Sub Load(obj As ptObject)
Function getCountProperties()
End Interface
Public Class AppSettings : Implements ISettings
Protected _size As System.Drawing.Size
Dim _ApplicationFont As Font
Dim _ApplicationBackColor As Color = New Color()
Dim _ApplicationForeColor As Color = New Color()
Dim _MenuBackColor As Color = New Color()
Dim _MenuForeColor As Color = New Color()
Dim _title As String
Dim _show As Boolean
Dim _number As Short
Public Property Title() As String
Get
Return _title
End Get
Set(ByVal value As String)
_title = value
End Set
End Property
Public Property Show() As Boolean
Get
Return _show
End Get
Set(value As Boolean)
_show = value
End Set
End Property
Public Property ApplicationFont() As System.Drawing.Font
Get
Return _ApplicationFont
End Get
Set(ByVal Value As System.Drawing.Font)
_ApplicationFont = Value
End Set
End Property
Public Property WindowSize() As System.Drawing.Size
Get
Return _size
End Get
Set(ByVal value As System.Drawing.Size)
_size = value
End Set
End Property
Public Property ApplicationBackColor() As Color
Get
Return _ApplicationBackColor
End Get
Set(ByVal Value As Color)
_ApplicationBackColor = Value
End Set
End Property
Public Property ApplicationForeColor() As Color
Get
Return _ApplicationForeColor
End Get
Set(ByVal Value As Color)
_ApplicationForeColor = Value
End Set
End Property
Public Property MenuBackColor() As Color
Get
Return _MenuBackColor
End Get
Set(ByVal Value As Color)
_MenuBackColor = Value
End Set
End Property
Public Property MenuForeColor() As Color
Get
Return _MenuForeColor
End Get
Set(ByVal Value As Color)
_MenuForeColor = Value
End Set
End Property
Public Sub Load() Implements ISettings.Load
Dim reader As TextReader
Dim fileNotFound As Boolean
Dim fontName As String = ""
Try
reader = New StreamReader(Principal.xmlAppSetting)
Catch ex As FileNotFoundException
' Take the defaults
fileNotFound = True
End Try
If fileNotFound Then
WindowSize = New System.Drawing.Size(308, 774)
_ApplicationBackColor = Color.CadetBlue
_ApplicationForeColor = Color.Black
_MenuBackColor = Color.Black
_MenuForeColor = Color.White
_ApplicationFont = New Font("Arial", 8)
Else
Dim xr As XmlReader = XmlReader.Create(Principal.xmlAppSetting)
Do While xr.Read()
Dim read As Boolean = False
If (xr.NodeType = XmlNodeType.Element) Then
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "Title" Then
Title = xr.ReadElementString()
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "Show" Then
Show = xr.ReadElementString()
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "Size" Then
Dim s() As String
Dim s1 As Integer
Dim s2 As Integer
Dim svalue = xr.ReadElementString()
svalue = svalue.Replace("{", "")
svalue = svalue.Replace("}", "")
s = svalue.Split(",")
s1 = CInt(s(0).Substring(s(0).IndexOf("=") + 1))
s2 = CInt(s(1).Substring(s(1).IndexOf("=") + 1))
WindowSize = New Size(s1, s2)
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "FontName" Then
fontName = xr.ReadElementString()
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "FontSize" Then
If (fontName <> "") Then
ApplicationFont = New Font(fontName, CInt(xr.ReadElementString()))
End If
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "BackColor" Then
Dim svalue = xr.ReadElementString()
ApplicationBackColor = Color.FromArgb(CInt(svalue))
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "ForeColor" Then
Dim svalue = xr.ReadElementString()
ApplicationForeColor = Color.FromArgb(CInt(svalue))
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "MenuBackColor" Then
Dim svalue = xr.ReadElementString()
MenuBackColor = Color.FromArgb(CInt(svalue))
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "MenuForeColor" Then
Dim svalue = xr.ReadElementString()
MenuForeColor = Color.FromArgb(CInt(svalue))
read = True
End If
If (Not read) Then
xr.Read()
End If
Else
xr.Read()
End If
Loop
xr.Close()
reader.Close()
End If
End Sub
Public Sub SaveSetting(_xmlAppSetting As String) Implements ISettings.SaveSetting
Dim xws As XmlWriterSettings = New XmlWriterSettings()
xws.Indent = True
xws.NewLineOnAttributes = True
Dim xw As XmlWriter = XmlWriter.Create(_xmlAppSetting, xws)
xw.WriteStartDocument()
xw.WriteStartElement("Settings")
xw.WriteElementString("Title", Title)
xw.WriteElementString("Show", Show)
xw.WriteElementString("Size", WindowSize.ToString)
If Not ApplicationFont Is Nothing Then
xw.WriteElementString("FontName", ApplicationFont.Name)
xw.WriteElementString("FontSize", ApplicationFont.Size)
End If
xw.WriteElementString("BackColor", ApplicationBackColor.ToArgb().ToString())
xw.WriteElementString("ForeColor", ApplicationForeColor.ToArgb().ToString())
xw.WriteElementString("MenuBackColor", MenuBackColor.ToArgb().ToString())
xw.WriteElementString("MenuForeColor", MenuForeColor.ToArgb().ToString())
xw.WriteEndElement()
xw.WriteEndDocument()
xw.Flush()
xw.Close()
End Sub
Public Sub SaveSetting(ByRef obj As ptObject) Implements ISettings.SaveSetting
End Sub
Public Sub Load(obj As ptObject) Implements ISettings.Load
End Sub
Public Function getCountProperties() Implements ISettings.getCountProperties
Return 8
End Function
End Class
DesignSettings class
This class implement the iterface ISettings and allows the draw properties to be saved
public Class DesignSettings : Implements ISettings
Protected _size As System.Drawing.Size
Const HORIZONTAL = "Horizonal"
Private _DesignFont As Font
Private _DesignBackColor As Color = New Color()
Private _DesignForeColor As Color = New Color()
Private _DesignDirectionText As String = HORIZONTAL
Private _DesignFillColor As Color = New Color()
Private _DesignFillColor2 As Color = New Color()
Private _PenStyle As String = Principal.SOLID_STYLE
Private _PenSize As String = "1"
Private _Text As String
Private _bringToFront As Boolean = False
Private colorCombination As String
Private _DesignBitmap As String
Private princ As Principal
Public Sub setPrincipal(ByRef _princ As Principal)
princ = _princ
End Sub
Private Sub draw()
If princ IsNot Nothing Then
princ.UpdateColors()
End If
End Sub
Public Property WindowSize() As System.Drawing.Size
Get
Return _size
End Get
Set(ByVal value As System.Drawing.Size)
_size = value
End Set
End Property
Public Property DesignFont() As System.Drawing.Font
Get
Return _DesignFont
End Get
Set(ByVal Value As System.Drawing.Font)
_DesignFont = Value
If princ IsNot Nothing Then
princ._designSettings._DesignFont = Value
draw()
End If
End Set
End Property
Public Property DesignBackColor() As Color
Get
Return _DesignBackColor
End Get
Set(ByVal Value As Color)
_DesignBackColor = Value
If princ IsNot Nothing Then
princ._designSettings._DesignBackColor = Value
draw()
End If
End Set
End Property
Public Property DesignForeColor() As Color
Get
Return _DesignForeColor
End Get
Set(ByVal Value As Color)
_DesignForeColor = Value
If princ IsNot Nothing Then
princ._designSettings._DesignForeColor = Value
draw()
End If
End Set
End Property
Public Property DesignFillColor() As Color
Get
Return _DesignFillColor
End Get
Set(ByVal Value As Color)
_DesignFillColor = Value
If princ IsNot Nothing Then
princ._designSettings._DesignFillColor = Value
draw()
End If
End Set
End Property
Public Property DesignFillColor2() As Color
Get
Return _DesignFillColor2
End Get
Set(ByVal Value As Color)
_DesignFillColor2 = Value
If princ IsNot Nothing Then
princ._designSettings._DesignFillColor2 = Value
draw()
End If
End Set
End Property
Public Property DesignDirectionText() As String
Get
Return _DesignDirectionText
End Get
Set(ByVal Value As String)
_DesignDirectionText = Value
If princ IsNot Nothing Then
princ._designSettings._DesignDirectionText = Value
draw()
End If
End Set
End Property
Public Property DesignBitmap() As String
Get
Return _DesignBitmap
End Get
Set(ByVal Value As String)
_DesignBitmap = Value
If princ IsNot Nothing Then
princ._designSettings._DesignBitmap = Value
draw()
End If
End Set
End Property
Public Sub Load() Implements ISettings.Load
Dim reader As TextReader
Dim fileNotFound As Boolean
Dim fontName As String = ""
Try
reader = New StreamReader(Principal.xmlDesignSetting)
Catch ex As FileNotFoundException
' Take the defaults
fileNotFound = True
End Try
If fileNotFound Then
WindowSize = New System.Drawing.Size(308, 774)
_DesignBackColor = Color.White
_DesignForeColor = Color.Black
_DesignFont = New Font("Arial", 8)
_DesignFillColor = Color.White
_DesignFillColor2 = Color.White
_DesignDirectionText = HORIZONTAL
Else
Dim xr As XmlReader = XmlReader.Create(Principal.xmlDesignSetting)
Do While xr.Read()
Dim read As Boolean = False
If (xr.NodeType = XmlNodeType.Element) Then
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "Size" Then
Dim s() As String
Dim s1 As Integer
Dim s2 As Integer
Dim svalue = xr.ReadElementString()
svalue = svalue.Replace("{", "")
svalue = svalue.Replace("}", "")
s = svalue.Split(",")
s1 = CInt(s(0).Substring(s(0).IndexOf("=") + 1))
s2 = CInt(s(1).Substring(s(1).IndexOf("=") + 1))
WindowSize = New Size(s1, s2)
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "FontName" Then
fontName = xr.ReadElementString()
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "FontSize" Then
If (fontName <> "") Then
DesignFont = New Font(fontName, CInt(xr.ReadElementString()))
End If
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "BackColor" Then
Dim svalue = xr.ReadElementString()
DesignBackColor = Color.FromArgb(CInt(svalue))
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "ForeColor" Then
Dim svalue = xr.ReadElementString()
DesignForeColor = Color.FromArgb(CInt(svalue))
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "DirectionText" Then
DesignDirectionText = xr.ReadElementString()
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "FillColor" Then
Dim svalue = xr.ReadElementString()
DesignFillColor = Color.FromArgb(CInt(svalue))
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "FillColor2" Then
Dim svalue = xr.ReadElementString()
DesignFillColor2 = Color.FromArgb(CInt(svalue))
read = True
End If
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "BrushBitmap" Then
DesignBitmap = xr.ReadElementString()
read = True
End If
If (Not read) Then
xr.Read()
End If
Else
xr.Read()
End If
Loop
xr.Close()
reader.Close()
End If
End Sub
Public Sub SaveSetting(_xmlDesignSetting As String) Implements ISettings.SaveSetting
Dim xws As XmlWriterSettings = New XmlWriterSettings()
xws.Indent = True
xws.NewLineOnAttributes = True
Dim xw As XmlWriter = XmlWriter.Create(_xmlDesignSetting, xws)
xw.WriteStartDocument()
xw.WriteStartElement("Settings")
xw.WriteElementString("Size", WindowSize.ToString)
If Not DesignFont Is Nothing Then
xw.WriteElementString("FontName", DesignFont.Name)
xw.WriteElementString("FontSize", DesignFont.Size)
End If
xw.WriteElementString("BackColor", DesignBackColor.ToArgb().ToString())
xw.WriteElementString("ForeColor", DesignForeColor.ToArgb().ToString())
xw.WriteElementString("DirectionText", DesignDirectionText)
xw.WriteElementString("FillColor", DesignFillColor.ToArgb().ToString())
xw.WriteElementString("FillColor2", DesignFillColor2.ToArgb().ToString())
xw.WriteElementString("BrushBitmap", DesignBitmap)
xw.WriteEndElement()
xw.WriteEndDocument()
xw.Flush()
xw.Close()
End Sub
Public Sub SaveSetting(ByRef obj As ptObject) Implements ISettings.SaveSetting
End Sub
Public Sub Load(obj As ptObject) Implements ISettings.Load
End Sub
Public Function getCountProperties() Implements ISettings.getCountProperties
Return 5
End Function
End Class
The class PopupMenu show menu when right mouse click
Public Class PopupMenu
Private clrBack As Color
Private clrForColor As Color
Private panMenu As Panel
Private par As Panel
Private propertyGrid As PPropertyGrid
Private objDzoDraw As DZODraw
Public isVisible As Boolean = False
Public Sub New(_designer As DZODraw, _clrBack As Color, _clrForeColor As Color)
clrBack = _clrBack
clrForColor = _clrForeColor
objDzoDraw = _designer
End Sub
Public Function DestroyPopupMenu() As ptObject
isVisible = False
Dim o As ptObject = propertyGrid.getPtObj()
If (panMenu IsNot Nothing) Then
propertyGrid = Nothing
par.Controls.Remove(panMenu)
panMenu = Nothing
End If
Return o
End Function
Public Function GetPopupMenuStyleLines(ByRef pt As ptObject, p As Panel, x As Integer, y As Integer,
objSetting As ISettings) As Panel
panMenu = New Panel
panMenu.BorderStyle = BorderStyle.FixedSingle
panMenu.Width = 200
panMenu.BackColor = clrBack
panMenu.ForeColor = clrForColor
panMenu.Height = objSetting.getCountProperties() * 40 + 100
propertyGrid = New PPropertyGrid(objDzoDraw, panMenu, objSetting, "")
propertyGrid.setPtObject(pt)
propertyGrid.Create(p)
panMenu.Visible = True
panMenu.Location = New Point(x, y)
propertyGrid.Width = panMenu.Width
propertyGrid.Height = panMenu.Height
propertyGrid.Left = 0
propertyGrid.Top = 0
propertyGrid.Select()
par = p
isVisible = True
Return panMenu
End Function
End Class
Like most websites, we use data file small
dimensions that are saved on your computer, tablet, mobile phone or other device
Mobile (collectively referred to as 'device') to record certain data whenever
login or interact with our sites, services, apps, messaging systems
and strumenti.I names and specific types of cookies used can change over time.
To help you better understand the rules and \ 'use of such technology, the following are
some terms and their definitions:
Cookies: small text files (usually formed by letters and numbers) that are saved
in memory of the browser or the device when you visit a website or display a message.
Cookies enable a website to recognize a particular device or browser. There
different types of cookies:
Session cookies expire at the end of the browser session and allow us to
connect your actions during that specific session.
Persistent cookies are instead stored in your device even after the end
the browser session and let you remember your preferences or actions at multiple sites.
First-party cookies are set by the site you're visiting.
The third-party cookies are set by a third party site than the site you are visiting.
Cookies can be disabled or removed using the tools available in most
browsers. The cookie preferences must be set separately
for each browser used, because each offers features and specific options.