none
GDI+, dessiner, effacer ... RRS feed

  • Question

  • Bonjour à tous,

    j'utilise VB2008 express (pour le moment car vb2008 pro en commande).

    sur un form, j'ai mis un panel.
    dans ce panel, fond noir, je dessine un quadrillage blanc via un Graphics global au form, créé par le contrôle panel.

    ensuite je dessine via un Bouton1 un petit rectangle sur ce contrôle via un nouveau Graphics pour le même panel, comme ça:
    Dim nouveau_ContexteGraphique As Graphics = panel1.CreateGraphics
    nouveau_ContexteGraphique.SetClip(clipRect) 'en gros
    je clipe donc la zone de mon rectangle afin de pouvoir l'effacer sans toucher au quadrillage
    etc le rectangle se dessine bien


    et via un Bouton2 je change les coordonnées de mon point.
    ma routine efface l'ancien rectangle et le dessine à sa nouvelle position, tout marche bien.

    mon problème:
    lorsque mon rectangle s'efface, il efface aussi le quadrillage dessous.

    alors, comme ça fait un moment que j'essaie de comprendre, je m'en remets à plus expert.

    Pourquoi, alors que je crée deux Graphics, celui de dessous est impacté par celui de dessus, est-ce un comportement normal, ou je fais une erreur quelque part?

    par avance merci pour vos pistes.


    lundi 20 octobre 2008 16:47

Réponses

  • Bonjour,

     

    Il faut comprendre que normalement, le Graphics permet que dessiner du pixel.

    L'utilisation de BeginContainer et EndContainer sert le plus souvent à changer de matrice de transformation, tout en gardant les précédentes pour y revenir après.

     

    Le concept du GDI+ est de demander à l'utilisateur de redessiner une portion d'une surface de dessin à chaque fois que celle-ci devient invalide.

    GDI+ n'enregistre en aucun cas en mémoire les tracés que vous avez effectué.

    En cas d'invalidation d'une surface de dessin c'est à vous de la redessiner, et dans votre cas, vous devez redessiner votre quadrillage.

     

    Cordialement

    vendredi 24 octobre 2008 13:46
    Modérateur
  • Bonjour,

     

    Pour invalider une partie d'une zone de dessin, utilisez cette version de la méthode Invalidate() :

    http://msdn.microsoft.com/fr-fr/library/8dtk06x2.aspx

     

    Cordialement

     

    samedi 25 octobre 2008 16:19
    Modérateur

Toutes les réponses

  • Bon, une bonne piste semble être beginContainer (ou save) et EndContainer (ou restore)
    à suivre donc :-)
    lundi 20 octobre 2008 21:37
  • Bonjour,

     

    Il faut comprendre que normalement, le Graphics permet que dessiner du pixel.

    L'utilisation de BeginContainer et EndContainer sert le plus souvent à changer de matrice de transformation, tout en gardant les précédentes pour y revenir après.

     

    Le concept du GDI+ est de demander à l'utilisateur de redessiner une portion d'une surface de dessin à chaque fois que celle-ci devient invalide.

    GDI+ n'enregistre en aucun cas en mémoire les tracés que vous avez effectué.

    En cas d'invalidation d'une surface de dessin c'est à vous de la redessiner, et dans votre cas, vous devez redessiner votre quadrillage.

     

    Cordialement

    vendredi 24 octobre 2008 13:46
    Modérateur
  • Merci de votre réponse, c'est en gros ce que j'ai constaté à l'usage.
    Je suis donc revenu à quelque chose de plus simple, j'invalide toute la zone et redessine tout.
    Dommage car ça clignote donc lorsque je change la position de mon point.
    Existe-t-il une technique à utiliser pour ne redessiner qu'une petite partie d'un graphics?
    merci encore
    vendredi 24 octobre 2008 18:35
  • Bonjour,

     

    Pour invalider une partie d'une zone de dessin, utilisez cette version de la méthode Invalidate() :

    http://msdn.microsoft.com/fr-fr/library/8dtk06x2.aspx

     

    Cordialement

     

    samedi 25 octobre 2008 16:19
    Modérateur