IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Drag & drop de composants graphiques (pb pour les creer aussi)


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut Drag & drop de composants graphiques (pb pour les creer aussi)
    Bonjour a tou(te)s !
    Je dois réaliser une application ou des icônes seront déplacées sur un plan (rectangle graphique). J'aurais besoin de créer des instances de chacun de ces icônes et de définir des propriétés pour chacune, tout en enregistrant leur positions a l'écran/plan.
    Enfin, je débute un peu sur VS 2008 (vb.net), alors je cherche des conseils sur les méthodes utilisables?!

    une partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
       Public Sub New(ByVal BTid As Integer, ByVal BTtype As TypeEnum, ByVal BTlocx As Integer, ByVal BTlocy As Integer)
          'creation selon le type
          Select Case BTtype
             Case 1      ' = truc
                 ....
             Case 2
                ....
             Case 3      ' = Poste
                'dessin du fond de BTerm
                FondBTerm = New Bitmap(Me.Width, Me.Height)
                Dim gFondBTerm As Graphics = Graphics.FromImage(FondBTerm)
                'definition du BTerm = PC
                Me.Status_ = StatusEnum.AccesLibre
                Me.LocX = BTlocx
                Me.LocY = BTlocy
                PaintTermPoste(gFondBTerm)
     
             Case Else
                ....
          End Select
       End Sub
     
       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 = Me.Status
          Dim X As Integer = X0 + Me.LocX
          Dim Y As Integer = Y0 + Me.LocY
          'On va regarder le status du terminal
          Select Case TermStatus
             ....
             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(Me.BDesc, New Font(FontFamily.GenericSansSerif, 8), Brushes.White, Rect)
      End Sub
    voila sauf, qu'il ne dessine rien... je suis un peu dans le flou.

  2. #2
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut
    Bon comme je galère un peu, et que la rame c'est pas mon truc:
    voila ou j'en suis, mon image est correctement dessine (enfin si je demande de l'enregistrer sur le disque dur => elle est comme je l'a souhaite)
    MAIS je n'arrive toujours pas à l'afficher!
    il me semblait qu'avec cette methode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gFondBTerm.DrawImage(FondBTerm, New System.Drawing.Point(10, 10))
    on dessinait l'image (c'est du moins ce que prétend msdn).
    Alors comme je cherche a dessiner par dessus (ou sur) un composant usercontrol avec une backgroundimage, est-ce que ca ne poserait pas pb?

    Comme je cherche a faire un drag & drop, je voudrais faire glisser mon image sur le usercontrol. Donc dans l'evt OnMouseMove:
    On m'a dit que je devais recuperer une partie de la backgroundimage pour la passer en argument a ma fonction de dessin, pour qu'elle dessine mon graphics dessus avant de le retourner. Je trouve la solution bien complique (en + je maitrise pas les outils graphics).

    Je souhaiterais créer un composant que je pourrais faire glisser indépendamment de mon usercontrol, comme une image audessus d'une autre (sans avoir a redessiner une partie de mon usercontrol)
    Bien, j'espere avoir ete clair, et meme si ce n'était pas le cas j'espere que qqun me repondra. Merci.

  3. #3
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    Par défaut
    Bonjour.

    Je ne sais pas si j'ai tout saisi, mais avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim gFondBTerm As Graphics = Graphics.FromImage(FondBTerm)
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gFondBTerm.DrawImage(FondBTerm, New System.Drawing.Point(10, 10))
    Ca ne peut pas marcher.

    Si tu essayes de dessiner sur un truc qui hérite de control, passe par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Me.CreateGraphics.DrawImage(FondBTerm, New System.Drawing.Point(10, 10))
    Cdt.

  4. #4
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut
    Super!
    Je te remercie, effectivement avec createGraphics, je dessine bien mon Terminal par dessus mon usercontrol.
    Il est pas encore permanent, c-a-d qu'il s'efface apres qq secondes, mais je suis sur la bonne voie, merci.


    bon, j'avance, j'avance (reste là l'escargot )
    voila depuis ce matin, j'ai réussi a créer, afficher, déplacer mes terminaux (composants graphics).
    J'utilise les evts:
    - icone_MouseClick (icone de depart ou l'utilisateur vient chercher son composant)
    - Fond_MouseMove remplace par l'evt Timer (redessine mon composant au nouvelle coordonnees souris, a propos les localisation c'est coton alors je me suis aidé de ceci
    - FOnd_MouseUp (definit la derniere position de l'objet)
    - Fond_MouseClick (selectionne un composant selon position de la souris)
    - Timer (redessine tous mes terminaux sur le fond)
    c'est surement pas la meilleure solution

    J'en suis a peu pres satisfait, toutefois (hormis qq bugs que je regarde presentement) il subsiste un effet de dédoublement de mon composant lors du deplacement. Y a t'il une solution?

    Autre question:
    voici mon code pour afficher mon composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    're-dessiner le BTerm selectionne
                temp.GetGraphicsForImage.DrawImage(temp.GetImage, temp.pointBT)
                Fond.CreateGraphics.DrawImage(temp.GetImage, temp.pointBT)
    'temp => mon objet Terminal
    'Fond => mon usercontrol sur lequel je dessine
    excuse moi, si mon ignorance éblouit, mais cela veut dire qu'il me redessine aussi le fond (avec BackgroundImage) a chaque fois que je deplace un terminal??

  5. #5
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    Par défaut
    Bonjour.

    Désolé, mais sans plus de code, ça me semble difficile d'identifier la source du probléme.

    Essayes de poster un code simplifié au max où le probléme persiste.

    Cdt.

  6. #6
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut
    Bonjour (et bonne semaine )
    Voici un peu de mon code concernant mon projet:
    Dans PPlan.vb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
       '@name: PB_BTermPC_Click()
       '@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()
             'lancer(creation)
             '    desactive timerMAJ
             TimerMAJ.Enabled = False
             '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, locXm, locYm)
             'recuperation du Point Mouse et conversion en Point Mouse equivalent sur UCPlan
             BT.pointBT = UcPlan1.PointToClient(New Point(locXm, locYm))
             'stock BTerm selectionne
             TabBTerm.Add(BT)
             SelectedTerm = TabBTerm.Count() - 1     'le dernier est selectionne car min Index = 0
             'dessiner le BTerm
             BT.GetGraphicsForImage.DrawImage(BT.GetImage, BT.pointBT)
             UcPlan1.CreateGraphics.DrawImage(BT.GetImage, BT.pointBT)
             're-active timerMAJ
             TimerMAJ.Enabled = True
          Else
             'button normal
             PB_BTermPC.BorderStyle = BorderStyle.None
             CreationEnCours = False
             'annuler creation
             ' ...
          End If
    End sub
     
       '@name: TimerMAJ_Tick()
       '@action: rafraichissement de l affichage => redessiner les BTerm
       Private Sub TimerMAJ_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerMAJ.Tick
    For i As Integer = 0 To TabBTerm.Count() - 1
             Dim temp As LBTerm = TabBTerm(i)
             'test que 1 BTerm est bien selectionné
             If SelectedTerm = i Then
                'recuperer la localisation de la souris
                Dim locXm As System.Int32 = MousePosition.X
                Dim locYm As System.Int32 = MousePosition.Y
                temp.pointBT = UcPlan1.PointToClient(New System.Drawing.Point(locXm, locYm))
             Else
                'pointBT doit deja etre defini
             End If
             're-dessiner le BTerm selectionne
             temp.GetGraphicsForImage.DrawImage(temp.GetImage, temp.pointBT)
             UcPlan1.CreateGraphics.DrawImage(temp.GetImage, temp.pointBT)
          Next
       End Sub
       '@name: UcPlan1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
       '@action: UcPlan1 = Fond -> afficher / masquer les proprietes des BTerm
       Private Sub UcPlan1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UcPlan1.Click
          'definition
          Dim MPos_UCPlan As System.Drawing.Point = UcPlan1.PointToClient(New Point(MousePosition.X, MousePosition.Y))
          'test si creation BTerm en cours
          If Me.CreationEnCours Then
             'definition
             Dim createBT As LBTerm = TabBTerm(SelectedTerm)
             'recuperer la localisation de la souris sur UCPlan
             createBT.pointBT = MPos_UCPlan
             'enregistrement dans la bdd
             Dim res As Integer = L.BTermUpdateOrInsert(createBT)
             If res = 0 Then
                MsgBox("Une erreur s'est produite...", MsgBoxStyle.Critical)
             End If
             'fin de la creation
             SelectedTerm = -1
             CreationEnCours = False
             'button normal
             PB_BTermPC.BorderStyle = BorderStyle.None
          Else
             'pas de creation en cours
             '   test si 1 BTerm est selectionne
             If SelectedTerm <> -1 Then
                'definition
                Dim SelectedBT As LBTerm = TabBTerm(SelectedTerm)
                'recuperer la localisation de la souris sur UCPlan
                SelectedBT.pointBT = MPos_UCPlan
                'maj dans la base (update)
                Dim res As Integer = L.BTermUpdateOrInsert(SelectedBT)
                If res = 0 Then
                   MsgBox("Une erreur s'est produite...", MsgBoxStyle.Critical)
                End If
                'fin de la selection
                SelectedTerm = -1
                CreationEnCours = False
             Else
                'pas de selection en cours
                '   boucle sur tous les BTerm du plan
                For Each Term As LBTerm In TabBTerm
                   'test si la souris est au-dessus de 1 BTerm
                   If MouseOnBTermPoint(Term, MPos_UCPlan) Then
                      'selectionner ce BTerm
                      SelectedTerm = TabBTerm.IndexOf(Term)
                      'recuperer son id et ses proprietes
                      '.....
                      'afficher ses proprietes
                      '.....
                   End If
                Next
             End If
          End If
       End Sub
    et dans la declaration de mon objet BTerm, LBTerm.vb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
       '@name: GetGraphicsForImage() As System.Drawing.Bitmap
       '@action: retourne image cree pour le terminal
       Public Function GetGraphicsForImage() As System.Drawing.Graphics
          'dessin du fond de BTerm
          If FondBTerm Is Nothing Then
             FondBTerm = New Bitmap(Me.Width, Me.Height)
          ElseIf FondBTerm.Width <> Me.Width Or FondBTerm.Height <> Me.Height Then
             FondBTerm.Dispose()
             FondBTerm = Nothing
             FondBTerm = New Bitmap(Me.Width, Me.Height)
          End If
          Dim gFondBTerm As Graphics = Graphics.FromImage(FondBTerm)
          PaintTermPoste(gFondBTerm)
          Return gFondBTerm
       End Function
     
       '@name: PaintTermPoste(ByRef g As Graphics, ByVal ListeBTermsIndex As Integer)
       '@action: creer 1 BTerm (graph), surcharge LBTerm.New()
       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 = Me.Status
          Dim X As Integer = X0 + Me.posXDebDraw
          Dim Y As Integer = Y0 + Me.posYDebDraw
          '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(Me.BDesc, New Font(FontFamily.GenericSansSerif, 8), Brushes.White, Rect)
       End Sub
    Voila. Ce sont les principales fonctions en rapport avec la création et le déplacement de mon dessin (1 PC dessiné) sur mon fond (1 usercontrol avec image en fond).
    Et mon principale souci actuellement, c'est la persistance (pendant les déplacements de mes PC (dessinés) du dessin précédent (celui d'origine, comme ceux qui sont dessinés ensuite => effet chenille). Merci

Discussions similaires

  1. Drag and Drop d'objet graphique
    Par sylum dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/07/2010, 02h55
  2. Composant Crystal reports pour les projets WPF
    Par bellak dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 26/08/2009, 16h29
  3. [Humour]Une petite explication pour mesdemoiselles (et pour les messieurs aussi ;) )
    Par chaval dans le forum La taverne du Club : Humour et divers
    Réponses: 44
    Dernier message: 12/07/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo