1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
| Public Class PPlan
'definition
Public SelectedTerm As System.Int32 = -1 'Bterm qui est selectionné ou qui vient d'etre créé
Public TabBTerm As New ArrayList() 'liste de tous les BTerm affichés
Public CreationEnCours As System.Boolean = False 'creation de BTerm en cours
' AVANT ^^
' var de config graphique
Private BackImgWidth As System.Int32 = 50 'largeur du rectangle de capture du background
Private BackImgHeight As System.Int32 = 60 'hauteur du rectangle de capture du background
Private BackImgOriginale As System.Drawing.Image 'rectangle de capture originel du fond (sans BTerm)
Private BackImgPosX As System.Int32 'position x du rectangle de capture originel
Private BackImgPosY As System.Int32 'position y du rectangle de capture originel
Private EntreePosX As System.Int32 'position x du rectangle de capture originel a son entree dans UCPlan
Private EntreePosY As System.Int32 'position y du rectangle de capture originel a son entree dans UCPlan
Private BackImgWithBTerm As System.Drawing.Image 'rectangle de capture originel + dessin de BTerm (non-selectionne)
Private InBTposXDebDraw As System.Int32 = 5 'Position X a l'interieur de la capture pour commencer a dessiner le BTerm
Private InBTposYDebDraw As System.Int32 = 5 'Position Y a l'interieur de la capture pour commencer a dessiner le BTerm
' var Terminaux
Private CurrentBT As LBTerm 'Objet LBTerm en cours d'utilisation (selectionne)
' Enum
Public Enum TernaryRasterOperations As Integer
SRCCOPY = 13369376 'dest = source
SRCPAINT = 15597702 'dest = source OR dest
SRCAND = 8913094 'dest = source AND dest
SRCINVERT = 6684742 'dest = source XOR dest
SRCERASE = 4457256 'dest = source AND (NOT dest )
NOTSRCCOPY = 3342344 'dest = (NOT source)
NOTSRCERASE = 1114278 'dest = (NOT src) AND (NOT dest)
MERGECOPY = 12583114 'dest = (source AND pattern)
MERGEPAINT = 12255782 'dest = (NOT source) OR dest
PATCOPY = 15728673 'dest = pattern
PATPAINT = 16452105 'dest = DPSnoo
PATINVERT = 5898313 'dest = pattern XOR dest
DSTINVERT = 5570569 'dest = (NOT dest)
BLACKNESS = 66 'dest = BLACK
WHITENESS = 16711778 'dest = WHITE
End Enum
' Declarations
Public Declare Function BitBlt Lib "gdi32.dll" (ByVal hdc As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As TernaryRasterOperations) As Boolean
'@name: Plan_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
'@action: chargement de la Form PPlan
Private Sub Plan_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'qq definition rien de dessinne
End Sub
'### Evenements Buttons ###
'@name: PB_BTermPC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
'@action: pour ajouter un BTerm de type PC(3)
Private Sub PB_BTermPC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PB_BTermPC.Click
'test etat du bouton
If PB_BTermPC.BorderStyle = BorderStyle.None Then
'enfonce le button
PB_BTermPC.BorderStyle = BorderStyle.Fixed3D
CreationEnCours = True
Dim NextId As System.Int32 = L.BTermFindNextId()
'recuperer la localisation de la souris sur ecran
Dim locXm As System.Int32 = MousePosition.X
Dim locYm As System.Int32 = MousePosition.Y
'creation du BTerm
Dim BT As New LBTerm(NextId, LBTerm.TypeEnum.Poste, 0, 0)
'recuperation du Point Mouse et conversion en Point Mouse equivalent sur UCPlan
BT.pointBT = UcPlan1.PointToClient(New Point(locXm, locYm))
BT.LocX = BT.pointBT.X
BT.LocY = BT.pointBT.Y
'Bterm selectionne
BT.Selected_() = False 'pas de surbrillance a la creation
'stock BTerm selectionne
Me.CurrentBT = BT
'TabBTerm.Add(BT)
'SelectedTerm = TabBTerm.Count() - 1 'le dernier est selectionne car min Index = 0
Else
'button normal
PB_BTermPC.BorderStyle = BorderStyle.None
CreationEnCours = False
'annuler creation
' ...
End If
End Sub
'### Evenements Souris ###
'@name: UcPlan1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
'@action: UcPlan1.MouseMove -> Drag and drop
Private Sub UcPlan1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles UcPlan1.MouseMove
'test que drag and drop en cours (currentBT definit)
If Not CurrentBT Is Nothing Then
'definition
Me.BackImgPosX = e.X
Me.BackImgPosY = e.Y
Dim TempBackImg As System.Drawing.Image
'debug
'replacer BackImgOriginale a sa place (position avant le deplacement)
'Me.ReplaceImage(Me.BackImgOriginale, Me.EntreePosX, Me.EntreePosY)
'stock nouvelle image de fond (sans BTerm) apres OnMove
TempBackImg = Me.BackImgOriginale
Me.BackImgOriginale = Me.GetBackgroundImage(Me.BackImgPosX, Me.BackImgPosY, BackImgWidth, BackImgHeight)
'liberation memoire pour BackImgWithBTerm
Me.BackImgWithBTerm.Dispose()
'faire une copie de BackImgOriginale pour y ajouter le BTerm
Me.BackImgWithBTerm = Me.CloneImage(Me.BackImgOriginale)
'recuperer le graphics de la nouvelle image pour pouvoir la modifier
Dim graphBTerm As Graphics = Graphics.FromImage(Me.BackImgWithBTerm)
'dessin de BTerm = PC
Me.PaintTermPoste(graphBTerm)
'replacer BackImgOriginale a sa place (position avant le deplacement)
'Me.ReplaceImage(TempBackImg, Me.EntreePosX, Me.EntreePosY)
'remplacer BackImgOriginale par BackImgWithBTerm (BTerm non-selectionne dessine)
Me.ReplaceImage(Me.BackImgWithBTerm, Me.BackImgPosX, Me.BackImgPosY)
End If
End Sub
'@name: UcPlan1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
'@action: UcPlan1.MouseEnter -> 1ere phase du drag and drop: memoriser une partie de l image autour de la souris pour pouvoir la redessiner ensuite
Private Sub UcPlan1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles UcPlan1.MouseEnter
Dim locXm As System.Int32 = MousePosition.X
Dim locYm As System.Int32 = MousePosition.Y
'test si user vient de cliquer sur PB_BTermPC (creation de BTerm)
If Me.CreationEnCours Then
'definition du point d'affichage du BTerm
Me.CurrentBT.pointBT = UcPlan1.PointToClient(New Point(locXm, locYm))
'recuperer le fond autour de la souris et le stocker dans Me.BackImgOriginale
Me.BackImgOriginale = Me.GetBackgroundImage(Me.CurrentBT.pointBT.X, Me.CurrentBT.pointBT.Y, Me.BackImgWidth, Me.BackImgHeight)
Me.BackImgPosX = Me.CurrentBT.pointBT.X
Me.BackImgPosY = Me.CurrentBT.pointBT.Y
'point entree dans le control UCPlan
Me.EntreePosX = Me.CurrentBT.pointBT.X
Me.EntreePosY = Me.CurrentBT.pointBT.Y
'faire une copie de BackImgOriginale pour y ajouter le BTerm
Me.BackImgWithBTerm = Me.CloneImage(Me.BackImgOriginale)
'recuperer le graphics de la nouvelle image pour pouvoir la modifier
Dim graphBTerm As Graphics = Graphics.FromImage(Me.BackImgWithBTerm)
'dessin de BTerm = PC
Me.PaintTermPoste(graphBTerm)
'remplacer BackImgOriginale par BackImgWithBTerm (BTerm non-selectionne dessine)
Me.ReplaceImage(Me.BackImgWithBTerm, Me.BackImgPosX, Me.BackImgPosY)
End If
End Sub
'### Methodes Graphiques ###
'@name: GetBackgroundImage(ByVal MPx As System.Int32, ByVal MPy As System.Int32)
'@action: Recupere et stock 1 rectangle de l'image en fond (Client) sous la souris
'@param: MPx, MPy coordonnees de la souris sur le fond du Client
'@param: BiWidth, BiHeight taille du rectangle recupere
'@e-src: http://www.developpez.net/forums/showthread.php?t=271443
Private Function GetBackgroundImage(ByVal MPx As System.Int32, ByVal MPy As System.Int32, ByVal BiWidth As System.Int32, ByVal BiHeight As System.Int32) As System.Drawing.Image
'definitions
Dim G1 As Graphics = Me.CreateGraphics
Dim MyImage As Image = New Bitmap(BiWidth, BiHeight, G1)
Dim G2 As Graphics = Graphics.FromImage(MyImage)
'traitements
Dim dc1 As IntPtr = G1.GetHdc()
Dim dc2 As IntPtr = G2.GetHdc()
BitBlt(dc2, 0, 0, BiWidth, BiHeight, dc1, MPx, MPy, TernaryRasterOperations.SRCCOPY)
G1.ReleaseHdc(dc1)
G2.ReleaseHdc(dc2)
'liberation de la memoire
G1.Dispose()
G2.Dispose()
'retour
Return MyImage
End Function
'@name: GetBackgroundImage(ByVal MPx As System.Int32, ByVal MPy As System.Int32)
'@action: Recupere et stock 1 rectangle de l'image en fond (Client) sous la souris
'@param: PreviousImg System.Drawing.Image source pour la copie
'@return: System.Drawing.Image (copie de PreviousImg)
Private Function CloneImage(ByVal PreviousImg As System.Drawing.Image) As System.Drawing.Image
Return PreviousImg
End Function
'@name: Public Sub ReplaceImage(ByRef NextImg As System.Drawing.Image, ByVal NImgPosX As System.Int32, ByVal NImgPosY As System.Int32)
'@action: remplace une image par une autre (BackImgOriginale -> BackImgWithBTerm)
'@param: NextImg System.Drawing.Image remplacante
'@param: NImgPosX, NImgPosY int32, position angle superieur gauche du rectangle forme par Image
Public Sub ReplaceImage(ByRef NextImg As System.Drawing.Image, ByVal NImgPosX As System.Int32, ByVal NImgPosY As System.Int32)
UcPlan1.CreateGraphics.DrawImageUnscaled(NextImg, NImgPosX, NImgPosY)
End Sub
'@name: UcPlan1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
'@action: Evt lance a chaque modification de UCPlan1 (redim, hide, ...), de l'affichage en general
Private Sub UcPlan1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles UcPlan1.Paint
' pas encore fait
End Sub
'@name: PaintTermPoste(ByRef g As Graphics, ByVal ListeBTermsIndex As Integer)
'@action: creer 1 BTerm (graph)
Private Sub PaintTermPoste(ByRef g As Graphics)
'definition
Dim CouleurEcran As Color
Dim CouleurBordure As Color = Color.White
Dim Rect As Rectangle
Dim TermStatus As LBTerm.StatusEnum = 3 'REMARQUE: temporaire, def a faire
Dim X As Integer = Me.InBTposXDebDraw
Dim Y As Integer = Me.InBTposYDebDraw
'On va regarder le status du terminal
Select Case TermStatus
Case LBTerm.StatusEnum.AccesLibre : CouleurEcran = Color.Lime
Case LBTerm.StatusEnum.Occupe : CouleurEcran = Color.Blue
Case LBTerm.StatusEnum.EnLigne : CouleurEcran = Color.Green
Case Else : CouleurEcran = Color.Red
End Select
'on décale le dessin pour avoir un contour en cas de surbrillance
X += 2
Y += 2
'dessin ecran
Rect = New Rectangle(X, Y, 36, 28)
g.FillRectangle(New SolidBrush(Color.White), Rect)
Rect = New Rectangle(X + 2, Y + 2, 32, 24)
g.FillRectangle(New SolidBrush(CouleurEcran), Rect)
'dessin clavier
Rect = New Rectangle(X + 2, Y + 32, 31, 4)
g.DrawRectangle(New Pen(Color.White), Rect)
'dessin texte
Rect = New Rectangle(X, Y + 40, 40, 14)
g.DrawString("Nouveau", New Font(FontFamily.GenericSansSerif, 8), Brushes.White, Rect)
End Sub |
Partager