Autor Beitrag
angelag
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 16.11.11 21:41 
nAbend,

bin neu in C# und WPF und würde gerne eine kleine Zeichenanwendung programmieren. Meine erster Ansatz ist zwar schon brauchbar, aber die gezeichneten Striche sind "verwackelt", kantig und manchmal kommt es zu "Aussetzern" und der Strich wird unterbrochen:
user defined image

Im Wesentlichen setze ich die Variable "draw" auf true, sobald die Maus gedrückt wird. Bei einem MouseMove-Event wird dann ein Polyline-Objekt mit der aktuellen Mausposition gefüttert, sofern die Variable noch true ist. Bei MouseUp wird "draw" wieder auf false gesetzt.
Meine Frage ist, warum die Striche so verwackelt sind oder ob ich meinen Code überhaupt zur Gänze umschreiben sollte? Ich konnte nämlich nichts zu MouseDrag finden, bzw bin ich mir nicht sicher ob das Polyline-Objekt die richtige Wahl ist, oder ob es hier bessere Alternativen gibt?

Hier mein Code:
WPF
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
<Window x:Class="SketchRecognition.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SketchRecognition" Height="350" Width="525">
    <Grid>
        <Canvas Name="paintCanvas" Background="LemonChiffon" MouseMove="paintCanvas_MouseMoveHandler" MouseLeftButtonDown="paintCanvas_MouseLeftButtonDown" MouseLeftButtonUp="paintCanvas_MouseLeftButtonUp">
            
        </Canvas>
    </Grid>
</Window>



C#-MainWindow.cs
ausblenden volle Höhe C#-Quelltext
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:
40:
41:
42:
namespace SketchRecognition
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private bool draw;
        private List<SketchObject> sketchedObjects;

        public MainWindow()
        {
            InitializeComponent();

            draw = false;

            sketchedObjects = new List<SketchObject>();
        }

        private void paintCanvas_MouseMoveHandler(object sender, MouseEventArgs e)
        {
            if (draw)
            {
                sketchedObjects[sketchedObjects.Count-1].addPoint(e.GetPosition(this));
            }
        }

        private void paintCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            draw = true;

            SketchObject sketch = new SketchObject(paintCanvas);
            sketchedObjects.Add(sketch);
        }

        private void paintCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            draw = false;
        }

    }
}


C#-SketchObject.cs
ausblenden C#-Quelltext
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:
namespace SketchRecognition
{
    class SketchObject
    {
        private PointCollection pointList;
        private Polyline polyline;
        private Canvas paintCanvas;

        public SketchObject(Canvas paintCanvas)
        {
            this.paintCanvas = paintCanvas;

            pointList = new PointCollection();

            polyline = new Polyline();
            polyline.Points = pointList;
            polyline.Stroke = System.Windows.Media.Brushes.SlateGray;
            polyline.StrokeThickness = 2;
            polyline.FillRule = FillRule.EvenOdd;

            paintCanvas.Children.Add(polyline);
        }

        public void addPoint(Point mousePosition) {
            pointList.Add(mousePosition);
        }
    }
}


Moderiert von user profile iconChristian S.: C#- durch XML-Tags ersetzt
Günther Weber
Hält's aus hier
Beiträge: 4

WIN 2000
C# (VS 2005 Prof)
BeitragVerfasst: So 11.12.11 18:58 
Ich denke mal, Du musst die Maus etwas genauer führen und dabei nicht so zittern...

Wenn das nicht hilft, würde ich statt der PolyLine einen Spline zeichnen lassen. PolyBezierSegment nennt sich die Klasse.