Picturebox de forme ronde

Résolu
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 16 déc. 2012 à 21:16
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 - 20 déc. 2012 à 15:49
Bonjour

comment découper un picturebox en forme ronde
j'essaie avec pic.region mais comment créer
la liste de points il faut definir 360 points
pour décrire le cercle ?

merci

9 réponses

Utilisateur anonyme
17 déc. 2012 à 00:12
Salut ShayW,

Non, pas besoin de définir des points, tu as juste à ajouter une élipse à un Graphic path.


Dim graph As New System.Drawing.Drawing2D.GraphicsPath
graph.AddEllipse(0, 0, 200, 200)
Dim reg As Region = New Region(graph)
Me.Region = reg
3
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 56
17 déc. 2012 à 07:53
Merci
une question de compréhension
pourquoi les méthodes graphique du system.drawing.graphic doivent etre appelées dans
l'évenement paint du control où ils sont dessinées
et ici (le code donné au dessus) n' a pas besoin
d'etre écrit dans l'évenement paint
0
Utilisateur anonyme
17 déc. 2012 à 12:07
Je ne sais pas. Peut être parce qu'on ne dessine rien sur le contrôle.
Tu te poses trop de questions ShayW
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 56
17 déc. 2012 à 12:26
Tu te poses trop de questions ShayW


Ah oui c'est vrai je n'ai pas dormi de la nuit à cause de ça et meme allez consulter le psy
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
17 déc. 2012 à 12:44
Tant que tu n'entends pas des petites voix dans ta tête...
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
20 déc. 2012 à 13:58
Bonjour ShayW,

Rien ne vous oblige à utiliser les méthodes de la classe Graphics en dehors de l'évènement Paint d'un contrôle.

Par exemple :
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim g As Graphics = Me.Button1.CreateGraphics()
        g.FillEllipse(Brushes.Blue, 3, 3, 10, 10)

    End Sub


Donc sur le clic du bouton, la première ligne de code permet de récupérer le Graphics du contrôle (Tel qu'il est dessiné au moment du clic)
et ensuite le FillEllipse vient dessiner un petit rond bleu par dessus.

L'intérêt de l'utiliser dans l'évènement Paint est que c'est l'évènement qui va être appelé à chaque fois que le contrôle doit être dessiné à l'écran. C'est pour cela qu'il est utilisé pour substituer l'affichage standard du contrôle en le redéfinissant complètement ou en y ajoutant des éléments.

D'ailleurs vous allez vite vous en rendre compte si vous testez mon code ci-dessus. Dès que la sourie va quitter le survol du bouton, le petit rond bleu va disparaître car l'évènement Paint va être rappelé par le contrôle (car son affichage doit passer de survolé à non-survolé). Donc il va reprendre son affichage standard.

En espérant avoir aider.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
20 déc. 2012 à 14:32
Auto correction désolé:
Rien ne vous oblige à utiliser les méthodes de la classe Graphics uniquement dans l'évènement Paint d'un contrôle.
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 56
20 déc. 2012 à 15:22
Bonjour foliv57
j'ai testé

pourquoi si j'écris

Dim g As Graphics = Me.PanelGame.CreateGraphics()
        g.FillEllipse(Brushes.Blue, 3, 3, 100, 110)


dans l'evenement load de la form ça ne marche pas
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
20 déc. 2012 à 15:49
Dans l'évènement Load, les contrôles ne sont pas encore rendu à l'écran.

Il faut tenter l'évènement Shown qui devrait être lancé après rendu du formulaire. Mais même la, il faudrait être sur que le contrôle en question (PanelGame) ne fait pas un Repaint à la fin de Form_Shown.

En faite c'est exactement à cause de ces questions que les méthodes Graphics sont très rarement utilisées en dehors de l'évènement Paint.
Car il y a pas mal de choses qui demande à un contrôle de se redessiner. Par exemple si vous déplacez la form en partie en dehors de l'écran et que vous faite revenir la form, chaque contrôles qui se trouvaient dans la partie cachée vont relancer leur évènement Paint.
(En poussant plus loin on constate même que l'évènement Paint est lancé avec un masque uniquement sur la partie du contrôle à redessiner. Cette zone est appelée ClipRectangle)

Ce que je conseil toujours pour bien comprendre ce genre de phénomène est de faire ceci :
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Console.WriteLine("La form se charge")
    End Sub


    Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        Console.WriteLine("La form est affichée")
        Dim g As Graphics = Me.Panel1.CreateGraphics()
        g.FillEllipse(Brushes.Blue, 3, 3, 10, 10)
    End Sub

    Private Sub Panel1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        Console.WriteLine("Le panel doit se dessiner dans le rectangle {0}", e.ClipRectangle.ToString)
    End Sub


En y ajoutant l'heure à la milliseconde dans les Console.WriteLine, on peut se faire une bonne idée de l’enchaînement des évènements.

Avec l'exemple ci-dessus, placez un panel assez grand au milieu de votre form et amusez vous à déplacer la form en partie en dehors de l'écran. Vous constaterez en la faisant revenir à l'écran que le panel va lancer plein de paint avec un Clip d'une largeur de 1 ou 2 pixels en fonction de la vitesse à laquelle vous allez déplacer la form car le panel se redessine petit à petit.
0