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

Windows Forms Discussion :

[Vb.NET]Faire bouger un rectangle en GDI+


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Points : 17
    Points
    17
    Par défaut [Vb.NET]Faire bouger un rectangle en GDI+
    Bonjour,
    Je n'arrive pas a faire bouger un rectangle dans un graphic en GDI.
    Je m'explique, j'ai un code du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Dim g As Graphics 
        Dim newBitmap As Bitmap = New Bitmap(200, 200)
         g = Graphics.FromImage(newBitmap)
         g.FillRectangle(Brushes.Blue, New Rectangle(x, y, 30, 10)) 'dessin du rectangle
         PictureBox1.Image = newBitmap
    Le truc c'est que le rectangle s'affiche, mais je n'ai aucune idée de comment le faire se déplacer en suivant la souris.

    Si quelqu'un pourrait me donner quelques pistes.

    Merci et bonne journée !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Pour suivre la souris, il faut redessiner ce rectangle dans un événement Paint en fonction des coordonnées de la souris.

    Il faut invalider (Invalidate()) le contrôle (ou la form) concerné sur l'événement MouseMove.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci de ta réponse mais jai encore un petit probleme ^^
    Tout d'abord voila mon 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
    Public Class Form1
        Private bitmap As Bitmap
        Dim intBallPositionX, intBallPositionY As Integer
     
        Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
             Dim grfx As Graphics = CreateGraphics()
     
            grfx.DrawImage(bitmap, CInt(intBallPositionX / 2), CInt(intBallPositionY / 2), 10, 10)
     
            grfx.Dispose()
     
            ' On incrémente la position de la balle
            intBallPositionX += 10
            intBallPositionY += 10
     
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim grfx As Graphics = CreateGraphics()
     
            ' On remet la balle au milieu de la form
            intBallPositionX = CInt(ClientSize.Width / 2)
            intBallPositionY = CInt(ClientSize.Height / 2)
     
            ' On cree un nouveau bitmap
            bitmap = New Bitmap(10, 10)
     
            ' On recree la balle
            grfx = Graphics.FromImage(bitmap)
            With grfx
                .Clear(BackColor)
                .FillEllipse(Brushes.Red, New Rectangle(1, 1, 10, 10))
                .Dispose()
            End With
     
            'on lance le timer
            Timer1.Enabled = True
        End Sub
    End Class
    En fait le problème est que la balle se déplace bien mais toutes les positions précédentes de la balle restent affichées. Comment faire pour ne plus les voir ?

    MErci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Il n'y a pas besoin de créer un bitmap.
    L'écran est déjà un bitmap !
    L'événement Paint fournit un objet Graphics dans ses paramètres.
    C'est celui là qu'il faut utiliser pour redessiner toute la scène à chaque appel (pas seulement la balle).

    Le timer doit modifier la position mais ne s'occupe pas du dessin : il invalide simplement la form, ce qui déclenche l'appel de Paint.

    Remarque : ne pas rechercher l'optimisation de l'affichage à ce stade. On redessine toute l'image dans Paint().

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    En fait le but est de faire un casse briques. J'ai voulu faire en GDI plutot que d'utiliser une multitudes de picturebox mais si je redessine a chaque fois toute la scene est ce que ca ne va pas prendre un temps fou ?
    Il n'y aurait pas un moyen de gérer séparément les briques, le pad et la balle ?

    Merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Oui on peut toujours optimiser.

    Mais, commences par faire un logiciel qui marche.
    Ensuite, si c'est nécessaire, on discutera de l'optimisation.

    D'abord la fonction, ensuite la performance.
    Et les machines sont bien plus rapides que tu ne le penses...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci encore
    J' encore une question
    Mon problème est le suivant : Il y a un problème de clignotement du dessin en gdi. A chaque tick du timer, on appercoi un clignotement de tous les éléments du dessin... Y aurait il un moyen que tout ca s'arrête ?
    Merci

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 72
    Points : 63
    Points
    63
    Par défaut
    je remonte ce post j'ai le meme probleme de clignotement, comment redessiner que ce que l'on a besoin et pas tout ?

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    deja par rapport à ce que je viens de lire, les picturebox ou autre utilise gdi aussi ...

    gdi n'utilise pas d'accélération matérielle apparement, ce qui le rend extremement lent
    il est deja limite pour afficher 50 boutons sur un pc à 3GHz alors vouloir faire un casse brique en gdi c'est ptete pas c'qu'y a d'mieux
    et directX9 est pas énormément compliqué à mettre en oeuvre pour faire de la 2D, voir XNA peut etre aussi

    enfin il est surement possible d'améliorer quand meme en restant sur gdi
    une des possibilité est de créer un control spécial sur lequel tu retires toutes les fonctionnalités d'origine de rafraichissement et que ca soit toi qui gère tout
    sinon tu peux aussi tenter me.doublebuffered = true dans le new de ta feuille
    sinon jette un oeil vers les system.Drawing.bufferedgraphics

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/05/2005, 20h02
  2. [VB.NET] [WinForms] Afficher un rectangle sur une image
    Par Noodles dans le forum Windows Forms
    Réponses: 3
    Dernier message: 20/12/2004, 11h36
  3. [FLASH MX2004] Faire bouger un clip
    Par Ticoche dans le forum Flash
    Réponses: 2
    Dernier message: 21/11/2004, 11h17
  4. Faire bouger un personnage
    Par DeusXL dans le forum DirectX
    Réponses: 35
    Dernier message: 09/06/2004, 16h49
  5. [VB.Net] Faire du JS sur des contrôles côté serveur
    Par TagadaTsoin dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/11/2003, 16h51

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