Bioernus Geschrieben 12. Februar 2015 Geschrieben 12. Februar 2015 Hallo, ich bin gerade dabei mit c# die Möglichkeit, auf einer Oberfläche zu schreiben, umzusetzen. Allerdings hab ich ein Problem und keine Idee zur Lösung. Vielleicht habt ihr ja eine Idee zur Lösung. Das Ganze funktioniert derzeit so, dass ich mir die Koordinaten aus dem MouseEventArgs greife und diese zum einen in eine Liste packe zum Zweck der Speicherung und zum anderen bei jeder Koordinate ein 2x2 Pixel grosses Quadrat zeichne (der Schreibvorgang). Bei schnelleren Mousebewegungen werden allerdings nicht mehr alle Mousekoordinaten erfasst. Diese fehlen dann zum einen in der Liste und entsprechend das Quadrat an dieser Position. Je schneller die Mousebewegung ist, desto mehr Koordinaten fehlen. Zum besseren Verständnis mal der Code: public partial class Form1 : Form { public Form1() { InitializeComponent(); } bool mouseStatus = false; SavedLines printedLines = new SavedLines(); private void panel1_MouseMove(object sender, MouseEventArgs e) { if (mouseStatus) { Point MovePos = new Point(e.X, e.Y); printedLines.Coordinates(MovePos); Graphics gobj = panel1.CreateGraphics(); SolidBrush br = new SolidBrush(Color.Black); gobj.FillRectangle(br, MovePos.X, MovePos.Y, 2, 2); gobj.Dispose(); } } private void panel1_MouseDown(object sender, MouseEventArgs e) { Point DownPos = new Point(e.X, e.Y); printedLines.Coordinates(DownPos); Graphics gobj = panel1.CreateGraphics(); SolidBrush br = new SolidBrush(Color.Black); gobj.FillRectangle(br, DownPos.X, DownPos.Y, 2, 2); gobj.Dispose(); mouseStatus = true; } private void panel1_MouseUp(object sender, MouseEventArgs e) { Point UpPos = new Point(e.X, e.Y); printedLines.Coordinates(UpPos); Graphics gobj = panel1.CreateGraphics(); SolidBrush br = new SolidBrush(Color.Black); gobj.FillRectangle(br, UpPos.X, UpPos.Y, 2, 2); gobj.Dispose(); mouseStatus = false; label1.Text = "Anzahl Koordinaten: " + printedLines.Coordinates(); } Eine "grafische Nachbearbeitung" als Lösung ist mMn doof. Die Lücken mit einer Geraden zu schliessen, macht das ganze Schriftbild unansehnlich, und da Schrift keiner mathematischen Funktion folgt, kann ich die Koordinaten auch nicht nachberechnen. Kennt jemand z.B. eine Möglichkeit, die Koordinatenerfassung zu verbessern? Allerdings bin ich noch in der Ausbildung, wenn die Lösung zu komplex wird, müsst ihr das bitte für Dummies erklären :-). Viele Grüße, Bioernus Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 13. Februar 2015 Geschrieben 13. Februar 2015 Wie oft die Maus Positionsdaten an den PC meldet, ist beschränkt. Es ist völlig normal, dass du selbst bei geringen Mausgeschwindigkeiten nicht für jeden einzelnen Pixel ein Maus-Event bekommst. Trotzdem sollte selbst die minimale Abfragegeschwindigkeit ausreichen, um ein halbwegs ordentliches Bild zu erzeugen, wenn du die Punkte durch Geraden verbindest. Vielleicht bremst irgendetwas anderes dein Programm aus. Zitieren
Bioernus Geschrieben 13. Februar 2015 Autor Geschrieben 13. Februar 2015 Danke für Hinweis. Also wenn du sagst, dass es grundsätzlich funktionieren sollte, dann werd ichs wohl einfach *hust* suboptimal programmiert haben. Kanns vielleicht sein, dass das ständige Neuerstellen des Graphics-Objects Performance kostet? Hab in einem Buch gelesen, dass man das so macht mit dem Erstellen-Benutzen-Disposen, aber vielleicht kann man auch bei allen Events immer dasselbe Graphics-Object benutzen. Wäre natürlich cool, wenn das Problem damit schon behoben wäre. Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 13. Februar 2015 Geschrieben 13. Februar 2015 Natürlich ließe sich die Performance von dem Code noch verbessern. Aber selbst mit dem unveränderten Code lief es bei mir zufriedenstellend. Vielleicht sind auch deine Ansprüche zu hoch. Starte doch einmal Paint und male ein wenig herum. Sieht das signifikant anders aus als bei deinem Programm? Zitieren
Bioernus Geschrieben 13. Februar 2015 Autor Geschrieben 13. Februar 2015 Habs mal mit Paint verglichen. Paint ist natürlich perfekt, auch schnellste Bewegungen werden vollständig umgesetzt, während bei mir auch normalschnelle Bewegungen Lückenhaft umgesetzt werden. Sah denn das Ergebnis bei dir genauso aus wie auf meinem Screenshot? Vielleicht hab ich echt zu hohe Ansprüche :-) (Die unterste Zeile ist von einer schnellen Bewegung, die Paint problemlos mitmacht. Der Text waren jetzt eher langsame Bewegungen. Wenn ich auf einem Tablet schreiben würde mit Touch-Event statt Mouse-Event, wären die Lücken wohl noch grösser.....) Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 13. Februar 2015 Geschrieben 13. Februar 2015 Paint verbindet die Punkte mit geraden Linien. Das solltest du natürlich auch tun. Zitieren
Bioernus Geschrieben 13. Februar 2015 Autor Geschrieben 13. Februar 2015 Ok, dann setz ich noch Geraden zwischen den Punkten. Muß ja auch nicht die Qualität von Paint erreichen, nur lesbar solls sein. So eine Methoden kann ich dann vielleicht auch noch gebrauchen, wenn ich math. Funktionen zeichne. Vielen Dank für die Unterstützung ! :-) Zitieren
SilentDemise Geschrieben 13. Februar 2015 Geschrieben 13. Februar 2015 warum machst du für sowas nicht Canvas mit WPF? Zitieren
Bioernus Geschrieben 14. Februar 2015 Autor Geschrieben 14. Februar 2015 Weil WPF nicht Inhalt unseres Unterrichts ist. Und Warum DAS so ist, weiß mein Lehrer allein :-)) WPF wollte ich mir aber privat nochmal anschauen. Canvas muß ich wohl auch mal googlen, der Begriff ist mir hier und da schonmal über den weg gelaufen. Das Ganze soll im Endeffekt auf eine Präsentationssoftware hinauslaufen, bei der man dynamisch Informationen unterschiedlicher Art einfach zusammenstellen kann, mit drag and drop. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.