2015-11-07 2 views
0

je suis en train de faire un picturebox personnalisé qui ressemble à ceci -Dessin picturebox C#

enter image description here

Jusqu'à présent, tout ce que je l'ai fait est - enter image description here

en utilisant ce code -

protected void UpdateRegion() 
    { 
     var path = new GraphicsPath(); 
     Point[] points = 
     { 
      new Point(0, 0), 
      new Point(0, ClientSize.Height-80), 
      new Point(80 , ClientSize.Height), 
      new Point(ClientSize.Width-80, ClientSize.Height), 
      new Point(ClientSize.Width, ClientSize.Height-80), 
      new Point(ClientSize.Width , 0) 
     }; 
     path.AddPolygon(points); 
     path.FillMode = FillMode.Winding; 
     this.Region = new Region(path); 
    } 
+2

Vous aurez besoin d'ajouter un arc. – TaW

+0

@TaW, comment puis-je l'utiliser pour cela? – DeaDViruS

+1

Voir ma réponse pour un exemple. J'ai aussi un peu nettoyé votre code. – TaW

Répondre

3

vous allez ici:

enter image description here

 GraphicsPath path = new GraphicsPath(); 
     path.FillMode = FillMode.Winding; 

     int cut = 80; 
     Rectangle cr = panel1.ClientRectangle; 

     Point[] points = 
     { 
      new Point(0, cr.Height - cut), 
      new Point(0, 0), 
      new Point(cr.Width, 0), 
      new Point(cr.Width, cr.Height - cut), 
      new Point(cr.Width - cut, cr.Height), 
      new Point(cut, cr.Height), 
      new Point(0, cr.Height - cut), 
     }; 
     path.AddPolygon(points); 

     Rectangle arcRect = new Rectangle(0, cr.Height - 2 * cut, 2 * cut, 2 * cut); 
     path.AddArc(arcRect, 90f, 90f); 

Un arc est définie par le rectangle de délimitation, qui dans notre cas a deux fois la taille de la coupe. Il commence à 90 ° dans le sens des aiguilles d'une montre à partir de l'axe des x et va pour (au moins) 90 ° de plus. Vous pouvez add it to a GraphicsPath ou draw it with a Graphics objet.

Voici une citation de MSDN:

Si des lignes ou des courbes précédentes dans la figure, une ligne est ajoutée pour relier l'extrémité du segment précédent au début de l'arc.

L'arc est tracé le long du périmètre de l'ellipse délimitée par le rectangle spécifié . Le point de départ de l'arc est déterminé par mesurant dans le sens des aiguilles d'une montre à partir de l'axe des x de l'ellipse (à l'angle ) par le nombre de degrés de l'angle de départ. Le point final est situé de manière similaire en mesurant dans le sens des aiguilles d'une montre à partir du point de départ par le nombre de degrés dans l'angle de balayage. Si l'angle de balayage est supérieur à 360 degrés ou inférieur à -360 degrés, l'arc est balayé par exactement 360 degrés ou -360 degrés, respectivement.

Notez que j'ai ajouté le rectangle de délimitation de l'arc pour la démonstration seulement. Le code ne l'inclut pas.

Pour des coupes arrondies dans les autres coins, vous devez modifier & pour agrandir le tableau de points et ajouter d'autres arcs.

les autres coins arcs prennent ces rectangles:

Rectangle arcRectTL = new Rectangle(0, 0, 2 * cut, 2 * cut); 
Rectangle arcRectTR = new Rectangle(cr.Width - 2 * cut, 0, 2 * cut, 2 * cut); 
Rectangle arcRectBR = new Rectangle(cr.Width - 2*cut, cr.Height - 2*cut, 2*cut, 2*cut); 

Les angles de départ sont respectivement: 180°, 270° and 0°.

Les tailles et l'angle de balayage restent les mêmes.

+0

Ce code peut aussi fonctionner si j'ai besoin d'une courbe en haut à gauche et d'un bouton à droite et les autres bords seront normaux. – DeaDViruS

+0

Bien sûr, ajoutez simplement plus de coupes et plus d'arcs! – TaW

+0

merci, je vais chercher plus sur la façon d'utiliser l'arc .. – DeaDViruS