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 :

Pb raffraichissement suite deplacement d'objet


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Pb raffraichissement suite deplacement d'objet
    Voilà je fais un éditeur de formulaire spécifique à mon boulot.

    Cet editeur instancie des forms "odocument" contenant un panel.
    Dans ce panel j'instance un object "oformulaire" qui est en fait une classe hérité de "picturebox" + quelques propriété perso.
    En gros c'est l'image du formulaire, rien de plus.

    Dans ce formulaire j'instancie des object "ochamp" qui est en fait une classe hérité de "label" + quelques propriété perso.
    En gros c'est juste des rectangles.

    L'utilisateur à la possibilité de déplacer un selection de "ochamp" (clavier et souris), le soucis avec ça c'est que lors du déplacement, j'ai des traces (des fantômes) de l'ancienne position de ces champs.

    J'ai essayer plusieurs trucs mais j'arrive pas à empêcher ces traces, donc je cherche des conseils, une solution...etc.
    Peut être est ce mon approche qui est fausse, peut être que je ne dois pas faire des objects et les deplacer 1 par 1 tel que je le fait, je sais pas trop.

    Voici le code de ma fonction de déplacement/agrandissement des "champs" :
    En gros je boucle sur les object typé "champ" du picturebox et j'applique x,y,xh selon les parametres reçus, rien de bien compliqué.

    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
     
        ' Deplacer selection ou si touche control : agrandir / reduire 
        Protected Friend Sub SetMoveDD(_x As Integer, _y As Integer, _w As Integer, _h As Integer)
            If oToolSelected <> ETool.Deplacer Then Exit Sub
     
            For Each ChildCtrl As Champ In oDocument.oFormulaire.Controls
     
                If ChildCtrl.GetType.Name = "Champ" Then
                    If ChildCtrl.Selected > 0 Then
     
                        ChildCtrl.SuspendLayout()
     
                        ChildCtrl.Left += _x
                        ChildCtrl.Top += _y
                        ChildCtrl.Width += _w
                        ChildCtrl.Height += _h
     
                        ChildCtrl.ResumeLayout()
     
                    End If
                End If
     
            Next
        End Sub
    Et voilà ce que ça donne si je bouge rapidement, ça refresh pas assez vite:

    Nom : exemple_fantome.png
Affichages : 180
Taille : 20,2 Ko

    Merci de vos lumières.

  2. #2
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    essayez de mettre ce bout de code dans l'évènement onPain (_Paint) de la form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetStyle(ControlStyles.ResizeRedraw, true);
    attention c'est du C#, mais il devrait y avoir quelque chose y ressemblant en VB.net

    edit :

    plutôt ceci dans votre cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse

    J'avais essayé ce genre de modification sur les paint (testé sur le paint des label, de la picture et de la form) ça fonctionne pas.

    J'ai trouvé une 1/2 solution alternative, mais c'est un peu comment dire... c'est de la bidouille

    En déplacement : je dessine mes rectangles de ma selection de champ dans une picturebox via un graphic et je deplace uniquement la picturebox, ça fonctionne, plus de probleme de refresh.

    En agrandissement : là par contre ça fonctionne plus car ça revient à faire un étirement de la picture, c'est pas bon, donc je ne fait pas d’étirement sur une selection de champs à la souris, je l'autorise que via les touches clavier, je me suis inspirer de ce que fait acrobat pour faire les pdf, les fonctionnalités d'agrandissement/déplacement fonctionnent ainsi.

    Autre problème lié à cette solution et que je suis obligé de positionner la picture de selection en dessous des mes champs car la gestion de la transparence ne se fait que sur le parent... et me parlait pas de la methode qui recalcul les pixel transparent pour obtenir une vrai picture transparent, c'est trop lent

    Donc pour contrer ce pb de picturebox non réellement transparente, j'ai construit une form transparente en overlay (une forme invisble par dessus le document donc) dans lequel je construis et deplace ma picture de selection, ça fonctionne niquel j'obtient un selection de champs deplaçable , mais bon c'est un peu la misère d'en arriver là.

    Si l'un de vous a une meillleure solution je prend (autre que passer a wpf )

    J'ai pas encore testé les shapes mais j'imagine que ça sera les memes problemes de toutes façon.

    Autre piste encore a explorer et de limiter le nombre d'appel de la methode SetMoveDD() selon le nombre de champ selectionnés.


    Voila voila

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Comme toujours on noie le probleme dans du code personnel pas toujours comprehensible....

    Probablement c'est dans tes controles personnalises qu'on ne voit pas que ca doit boguer...

    Voici un exemple de code qui montre que lorsque on depose une floppee de labels sur un picturebox ,et qu'on les deplaces ou resizes il n'y a pas de probleme de flicker (scintillement) que tu cites:

    Dans l'exemple les labels deposes conserve leur backcolor dans le champ tag qui sert doublement:
    -conserver leur couleur d'origine
    -test de selection:on compare backolor actuel avec couleur d'origine dans tag =>
    *si identique on change backolor en rouge et considere comme selectionne
    *sinon on revient à couleur d'origine dans tag et considere comme deselectionne
    Les 2 checkboxes servent le 1er pour etat Displacement et 2eme pour Resing...

    code 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
     
    Public Class Form2
     
        Private liste As New List(Of Label)
        Private lbl As Label
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
        End Sub
        Private rndPosition As New Random
        Private Sub btnAddCtrl_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddCtrl.Click
            lbl = New Label()
            lbl.Text = "my label"
            lbl.BorderStyle = FormBorderStyle.FixedSingle
            'memorise le backcolor pour le restituer => quand deselectionne
            lbl.Tag = lbl.BackColor
            lbl.Location = New Point(rndPosition.Next(0, 400), rndPosition.Next(0, 400))
     
            'handler => electionne un label
            AddHandler lbl.MouseClick, AddressOf ctrl_MouseClick
            PictureBox1.Controls.Add(lbl)
            'la liste de travail
            liste.Add(lbl)
        End Sub
        Private Sub ctrl_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            Dim ctrl As Control = (CType(sender, Control))
            For Each item As Label In liste
                If ctrl Is item Then
                    If item.BackColor = item.Tag Then 'non selectionne => on selecte
                        item.BackColor = Color.Red
                    Else 'deja selectionne => on deselecte
                        item.BackColor = item.Tag
                    End If
                End If
     
            Next
        End Sub
        Private ptDown As Point
        Private isDown As Boolean
        Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            ptDown = e.Location
            isDown = True
        End Sub
        Dim dx, dy As Integer
        Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
            If isDown Then
                Dim ptMove As Point = e.Location
                dx = ptMove.X - ptDown.X
                dy = ptMove.Y - ptDown.Y
                If CheckBox1.Checked And e.Button = MouseButtons.Left Then
                    For Each item As Label In liste
                        If Not item.BackColor = item.Tag Then 'selectionne
                            item.Left += dx
                            item.Top += dy
                        End If
                    Next
                    'track position
                    ptDown = ptMove
                ElseIf CheckBox2.Checked And e.Button = MouseButtons.Left Then
                    For Each item As Label In liste
                        If Not item.BackColor = item.Tag Then 'selectionne
                            item.Width += dx
                            item.Height += dy
                        End If
                    Next
                    'track position
                    ptDown = ptMove
                End If
            End If
     
        End Sub
     
        Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
            Dim pt As Point = e.Location
            dx = pt.X - ptDown.X
            dy = pt.Y - ptDown.Y
            If e.Button = MouseButtons.Right And CheckBox1.Checked Then
                For Each item As Label In liste
                    If Not item.BackColor = item.Tag Then
                        item.Left += dx
                        item.Top += dy
                    End If
     
                Next
                isDown = False
                ptDown = Point.Empty
     
            ElseIf e.Button = MouseButtons.Right And CheckBox2.Checked Then
                For Each item As Label In liste
                    If Not item.BackColor = item.Tag Then
                        item.Width += dx
                        item.Height += dy
                    End If
                Next
                isDown = False
                ptDown = Point.Empty
     
            End If
     
        End Sub
    End Class
    bon code.........

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Comme toujours on noie le probleme dans du code personnel pas toujours comprehensible....
    Merci je crois que j'ai un debut de piste grace a toi, effectivement j'ai géré les drag and drop via les handler du label et non de la picturebox... peut etre que ça vient de la. je vais corrigé et je vous dirai.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    bon j'ai résolu mon problème en forçant le refresh de la picturebox avant de faire le for each tout bêtement...

    J'ai regardé ton code, le soucis de tes handles c'est que le PictureBox1_MouseMove n'est pas detecté si tu est sur un label, donc il faut bien que je laisse mes mousemove et up sur les labels et que je gere le drag and drop au niveau champ.

    Voilà et merci de votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Deplacer un objet grace au clavier
    Par peepo dans le forum Interfaces Graphiques en Java
    Réponses: 16
    Dernier message: 31/07/2010, 02h55
  2. deplacer des objets dans un panel
    Par chris81 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/03/2008, 12h44
  3. [CS3] Dreamweaver CS3 deplacer des objet
    Par sambzh24 dans le forum Dreamweaver
    Réponses: 5
    Dernier message: 06/02/2008, 08h40
  4. Comment deplacer les objets sur JBuilder?
    Par awane dans le forum JBuilder
    Réponses: 3
    Dernier message: 08/07/2006, 18h23
  5. [VB6] Deplacer un objet sur une form en mode Exploitation
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 30/05/2006, 15h12

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