-
Hallo,
wollte mal fragen ob es möglich ist so in etwa
in ne Picturebox zu malen wie bei z.b. Paint.
Habe hier und anderorts zwar ähnliche Themen gefunden,
aber eher für Linien und Rechtecke.
Schonmal Danke
PS: Sprache ist egal C# oder VB.net
-
Hab hier mal was kleines gemacht ist zwar nicht ganz genau aber funktioniert zumindest

denke mal ist eigentlich selbst erklärendCode :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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
public partial class Form1 : Form { public Form1() { InitializeComponent(); this.list = new List<Point>(); //Liste für Koordinaten instanziieren this.bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); pictureBox1.Image = bmp; } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { mouseDown = true; list.Add(new Point(e.X, e.Y)); } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if (mouseDown) { mouseDown = false; using (Graphics g = Graphics.FromImage(bmp)) { Draw(g); g.Flush(); } list.Clear(); pictureBox1.Invalidate(); } } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (mouseDown) { list.Add(new Point(e.X, e.Y)); pictureBox1.Invalidate(); } } private void pictureBox1_Paint(object sender, PaintEventArgs e) { if (mouseDown) Draw(e.Graphics); } /// <summary> /// zeichnen /// </summary> private void Draw(Graphics g) { using (SolidBrush sb = new SolidBrush(Color.Black)) { foreach (Point pt in list) { if (g.VisibleClipBounds.Contains(pt)) g.FillRectangle(sb, new Rectangle(pt.X, pt.Y, 2, 2)); } } } private bool mouseDown; //ob Maustaste gedrückt wird (zur Speicherung der Maus koordinaten) private readonly List<Point> list; //Mauskoordinaten private readonly Bitmap bmp; //Bitmap zum speichern des gezeichneten }
-
Habs ein bissel verfeinert, jetzt sollten keine Freiräume beim zeichnen mehr erscheinen.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/// <summary> /// zeichnen /// </summary> private void Draw(Graphics g) { if (list.Count > 0) { byte[] bs = new byte[list.Count]; bs[0] = (byte)PathPointType.Start; for (int i = 1; i < list.Count; i++) bs[i] = (byte)PathPointType.Line; using (Pen p = new Pen(Color.Black, 2)) g.DrawPath(p, new System.Drawing.Drawing2D.GraphicsPath(list.ToArray(), bs)); } }
-
Danke sehr
-
Hallo Spyke,
ich habe dein oben geschriebenen Code verwendet und weiterentwickelt und bin auf ein Problem gestossen, wo du mir vielleicht helfen kannst.
Ziel:
Mein Ziel ist es ein Programm zu schreiben, dass beim öffnen einen Screenshot vom Desktop macht und diesen in der Picturebox anzeigt. (funktioniert) Anschließend will ich mit einem "Stift" auf die Picturebox mit dem geladenenen Bild malen (wie in Paint). Dabei dir dein Code verwendet. Zum Schluss soll dann wieder ein Screenshot erstellbar sein.
Problem:
Das Problem ist er zeichnet es wie gewünscht, nur wenn ich die Maus loslasse verschwindet meine gezeichnete Linie wieder und es ist nur das Bild sichtbar. Hast du ein Idee an dem es liegen könnte. Ich kann dir auch den Quellcode geben.
Danke schonmal für deine Bemühungen.
-
Ich denke mal du hast vergessen das als im Bitmap zu "speichern"
Dort lasse ich mir das Graphics Objekt vom Bitmap zurückgeben (Bitmap wird auch für anzeige in PictureBox verwendet).PHP-Code:using (Graphics g = Graphics.FromImage(bmp))
{
Draw(g);
g.Flush();
}
Zeichne auf dem Graphics Objekt (Draw Funktion).
Und mit Flush wird sozusagen das Zeichnen erzwungen.
http://msdn2.microsoft.com/en-us/lib...ics.flush.aspx
Ev. auch noch die Funktion Invalidate der PictureBox aufrufen damit Bild neu dargestellt wird.
Spyke (www.iv-interactive.de)
-
Hallo Spyke,
danke für deine Antwort. Ich habe aber
diesen Code drinnen. Ausserdem habe auch rausgefunden das der AufrufCode :1 2 3 4 5
using (Graphics g = Graphics.FromImage(bmp)) { Draw(g); g.Flush(); }
pictureBox1.Invalidate();
mir mein gezeichnetes löscht. Wenn ich den Funktionsaufruf rausschmeiße, dann ist die Linie da. Aber wenn ich eine zweite machen möchte löscht er mir dann die erste. Damit du dir das Problem besser anschauen kannst habe ich dir mein Projekt angehängt.
Ich bedanke mich schonmal für deine Bemühnungen.
-
Hm also ich musste mit ner Liste arbeiten, wo ich immer die neue Linie hinzugeschrieben habe und dann
alle neu reingeladen habe.
-
Das Problem ist du übergibst zwar meine Bitmap aber lädst danach ein neues Bild, intern wird ein neues Bitmap geladen, womit mein bmp eigentlich überflüssig wurde.
so funktioniertsPHP-Code:pictureBox1.Image = bmp;
try
{
pictureBox1.Load("c:/Dokumente und Einstellungen/All Users/Anwendungsdaten/tmp.bmp");
}
catch (Exception x)
{
MessageBox.Show("Exception " +x.Message);
}
Spyke (www.iv-interactive.de)PHP-Code:this.bmp = new Bitmap("c:/Dokumente und Einstellungen/All Users/Anwendungsdaten/tmp.bmp");
pictureBox1.Image = bmp;
-
Danke für deine Antwort. Es funktioniert.
-
Hallo Spyke,
weisst du auch noch wie man die Deckkraft/Durchsichtikeit der Line verändern kann?
Danke schonmal für deine Bemühungen.
-
Hallo duke007,
Die Transparenz kannst du einstellen indem du den Alpha-wert änderst.
Code :1
Color.FromArgb(128,0,255,0)
Der erste Wert ist der Alpha-Wert, dann kommt der rotanteil, dann grün, dann blau.
Mein Beispiel würd jetzt ein halbtransparentes grün ergeben.
mfg xela123
-
Hallo xela123,
danke für deine Hilfe es funktioniert.
-
Hi!
Ich als Anfänger wollt bloß mal fragen (da ich grad ein Koordinatensystem zeichnen muss, und den Inhalt ständig als BMP speichern, damit er nicht verloren geht), wie es eigentlich funktioniert, dass die Variablen list und bmp, die ja nicht (zumindest das bmp) als globale Variablen deklariert werden können, eigentlich z.B. im MouseDown - Ereignis verfügbar sind?
Ich tipp einfach mal, dass es was mit this. zum tun hat - aber wie schaut des dann in VB aus?
Edit:
Vielleicht sollt ich noch hinzufügen, dass die Height und Width Eigenschaft eines Bitmaps schreibgeschützt ist.Geändert von TobsDi (26.05.08 um 18:50 Uhr)
-
Wie du schon sagst sie sind global, aber halt global innerhalb ihrer eigenen Objektinstanz.
this ist dabei der Zeiger auf das eigene Objekt.
Kann man eigentlich auch weglassen und steht nur der Lesbarkeit halber da.
zu VB:
zumindest kann ich sagen das es in VB 6 dafür me gab und glaube in VB.Net auch so sein müsste. me sollte man genauso wie this weglassen können
also entweder
oder nurCode :1
me.list.Add
Code :1
list.Add
Edit:
dein Satz war entwas verwirrend, aber nur nochmal zum klarstellen list und bmp sind globalGeändert von Spyke (26.05.08 um 19:29 Uhr)
Ähnliche Themen
-
Haare malen
Von McStanley im Forum PhotoshopAntworten: 12Letzter Beitrag: 17.05.07, 22:46 -
Unsichtbar malen ?
Von Alex BDX im Forum PhotoshopAntworten: 7Letzter Beitrag: 04.09.06, 15:12 -
pictureBox auf PictureBox oder Label
Von shn im Forum .NET Windows FormsAntworten: 1Letzter Beitrag: 31.08.05, 16:37 -
PictureBox über PictureBox
Von JK_net im Forum .NET ArchivAntworten: 1Letzter Beitrag: 14.03.05, 09:03 -
Malen in Picturebox rückgängig machen?
Von daDom im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 06.06.04, 15:58



2Danke

Zitieren
Login





