2010-07-06 2 views
2

Je crée une application Paint avec C#, WPF et Visual Studio 4. Tout comme MS Paint, l'utilisateur peut dessiner des lignes et des formes.C#, WPF, Visual Studio 4: remplissage de formes irrégulières

Comment remplir une forme irrégulière dessinée par l'utilisateur avec la couleur? Y a-t-il une bibliothèque pour faire quelque chose comme ça? La détection d'une boucle fermée créée par des lignes semble être une approche peu pratique. Je peux imaginer toutes sortes de "fuites" en raison d'un écart de pixel.

Merci.

+0

Si vous utilisez un Polygon, vous pouvez Il suffit de combiner le dernier point et le point initial, puis de le remplir avec une couleur en utilisant la propriété Polygon.Fill. –

+0

@Claus - vous devriez faire une réponse pour que je puisse voter! – codekaizen

Répondre

1

Voici un simple SSCCE.

Éditer: Ce n'est peut-être pas exactement ce que vous vouliez, maintenant relire la question, mais peut-être que cela peut vous donner une idée de la façon de structurer vos outils de remplissage. En ce qui concerne la perfection des pixels, même MS Paint nécessite un dessin fermé complet, où d'autres bibliothèques pourraient utiliser des degrés d'antialias correspondant pour éviter les "fuites".

XAML:

<Window x:Class="FreeformDrawing.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     MouseLeftButtonDown="Window_MouseLeftButtonDown" 
     MouseLeftButtonUp="Window_MouseLeftButtonUp" 
     MouseMove="Window_MouseMove" 
     Title="MainWindow" Height="400" Width="400"> 
    <Grid> 
     <Canvas x:Name="DrawingCanvas" /> 
    </Grid> 
</Window> 

C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace FreeformDrawing 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private Polygon polygon; 
     private bool isDrawing = false; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      if (!isDrawing) 
      { 
       isDrawing = true; 

       polygon = new Polygon() 
       { 
        Stroke = Brushes.Black, 
        StrokeThickness = 1, 
        StrokeMiterLimit = 1, 
        StrokeLineJoin = PenLineJoin.Round, 
        StrokeStartLineCap = PenLineCap.Round, 
        StrokeEndLineCap = PenLineCap.Round 
       }; 

       AddPoint(e.GetPosition(DrawingCanvas)); 
       DrawingCanvas.Children.Add(polygon); 
      } 
     } 

     public void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
     { 
      isDrawing = false; 

      if (polygon != null) 
      { 
       polygon.Points.Add(polygon.Points.First()); 
       polygon.Fill = Brushes.Yellow; 
      } 
     } 

     public void Window_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (isDrawing) 
      { 
       AddPoint(e.GetPosition(DrawingCanvas)); 
      } 
     } 

     private void AddPoint(Point value) 
     { 
      if (value.X < (DrawingCanvas.ActualWidth - 1) 
      && value.Y < (DrawingCanvas.ActualHeight - 1)) 
      { 
       polygon.Points.Add(value); 
      } 
     } 
    } 
} 
+0

C'est bon, merci. Cependant, que faire si l'utilisateur a créé une forme complexe. Imaginez une étoile dessinée à la main créée avec un seul coup (http://mathworld.wolfram.com/images/eps-gif/StarPolygons_650.gif) et l'utilisateur veut seulement que la partie centrale soit remplie. De même, imaginez un rectangle dessiné avec 2 traits. Je suis plus à l'aise avec Java que C#, s'il vous plaît pardonnez-moi si je ne suis pas correct. Merci encore. – user377782