Hallo,
als Nebenfeature eines neuen Projekts von mir, arbeite ich gerade an einem Bildeditor.
Ich möchte eine Linie auf einer Picturebox ziehen, was soweit hervorragend klappt.
Ich nutze die Methode Invalidate() zum Aktualisieren der Linie während des Ziehens.
Das macht jetzt allerdings das Problem, dass ich nur eine einzige Linie ziehen kann.
Also habe ich nachgedacht und kam auf die Idee, nach dem Ziehen der Linie immer eine neue Picturebox auf der alten Picturebox zu platzieren, die einen transparenten Hintergrund hat. So bleibt die alte Linie bestehen und ich nutze Invalidate() auf der Picturebox komplett oben, also die der neuen Linie.
Rein theoretisch müssten somit also mehrere Linien ziehbar sein.
Doch das ist scheinbar nur die Theorie.
Ich hake jetzt seit einigen Tagen daran, dass Invalidate trotzdem die vorherige Linie löscht, die aber eigentlich auf einer komplett anderen Picturebox liegt.
Ich hoffe, ich habe das soweit verständlich ausgedrückt. Falls Fragen vorhanden sind, stellt sie ruhig. Ich bin für jede Hilfe offen.
Soweit die Erklärung, hier nun der komplette Code.
Vielen Dank im Voraus für jede Hilfe.
als Nebenfeature eines neuen Projekts von mir, arbeite ich gerade an einem Bildeditor.
Ich möchte eine Linie auf einer Picturebox ziehen, was soweit hervorragend klappt.
Ich nutze die Methode Invalidate() zum Aktualisieren der Linie während des Ziehens.
Das macht jetzt allerdings das Problem, dass ich nur eine einzige Linie ziehen kann.
Also habe ich nachgedacht und kam auf die Idee, nach dem Ziehen der Linie immer eine neue Picturebox auf der alten Picturebox zu platzieren, die einen transparenten Hintergrund hat. So bleibt die alte Linie bestehen und ich nutze Invalidate() auf der Picturebox komplett oben, also die der neuen Linie.
Rein theoretisch müssten somit also mehrere Linien ziehbar sein.
Doch das ist scheinbar nur die Theorie.
Ich hake jetzt seit einigen Tagen daran, dass Invalidate trotzdem die vorherige Linie löscht, die aber eigentlich auf einer komplett anderen Picturebox liegt.
Ich hoffe, ich habe das soweit verständlich ausgedrückt. Falls Fragen vorhanden sind, stellt sie ruhig. Ich bin für jede Hilfe offen.
Soweit die Erklärung, hier nun der komplette Code.
Vielen Dank im Voraus für jede Hilfe.
C#-Quellcode
- int pictureBoxCounter = 0;
- PictureBox[] drawPictureBoxes = new PictureBox[999];
- Point selectionStart;
- Point selectionEnd;
- Color foreColor = Color.White;
- int size = 10;
- private void Editor_Load(object sender, EventArgs e)
- {
- drawPictureBoxes[0] = new PictureBox();
- drawPictureBoxes[0].SizeMode = PictureBoxSizeMode.StretchImage;
- drawPictureBoxes[0].Image = screenshot;
- drawPictureBoxes[0].Size = pbImage.Size;
- drawPictureBoxes[0].Location = new Point(0, 0);
- drawPictureBoxes[0].Paint += new PaintEventHandler(ImagePaint);
- drawPictureBoxes[0].MouseDown += new MouseEventHandler(ImageMouseDown);
- drawPictureBoxes[0].MouseMove += new MouseEventHandler(ImageMouseMove);
- drawPictureBoxes[0].MouseUp += new MouseEventHandler(ImageMouseUp);
- drawPictureBoxes[0].Paint += new PaintEventHandler(ImagePaint);
- pbImage.Controls.Add(drawPictureBoxes[0]);
- }
- private void ImageMouseDown(object sender, MouseEventArgs e)
- {
- MouseDown = true;
- selectionStart = e.Location;
- selectionEnd = Point.Empty;
- }
- private void ImageMouseMove(object sender, MouseEventArgs e)
- {
- if (MouseDown)
- {
- selectionEnd = e.Location;
- drawPictureBoxes[pictureBoxCounter].Invalidate();
- }
- }
- private void ImageMouseUp(object sender, MouseEventArgs e)
- {
- MouseDown = false;
- drawPictureBoxes[pictureBoxCounter].Paint -= ImagePaint;
- drawPictureBoxes[pictureBoxCounter].MouseDown -= ImageMouseDown;
- drawPictureBoxes[pictureBoxCounter].MouseMove -= ImageMouseMove;
- drawPictureBoxes[pictureBoxCounter].MouseUp -= ImageMouseUp;
- pictureBoxCounter++;
- drawPictureBoxes[pictureBoxCounter] = new PictureBox();
- drawPictureBoxes[pictureBoxCounter].SizeMode = PictureBoxSizeMode.StretchImage;
- drawPictureBoxes[pictureBoxCounter].Size = pbImage.Size;
- drawPictureBoxes[pictureBoxCounter].Location = new Point(0, 0);
- drawPictureBoxes[pictureBoxCounter].BackColor = Color.Transparent;
- drawPictureBoxes[pictureBoxCounter].Paint += new PaintEventHandler(ImagePaint);
- drawPictureBoxes[pictureBoxCounter].MouseDown += new MouseEventHandler(ImageMouseDown);
- drawPictureBoxes[pictureBoxCounter].MouseMove += new MouseEventHandler(ImageMouseMove);
- drawPictureBoxes[pictureBoxCounter].MouseUp += new MouseEventHandler(ImageMouseUp);
- drawPictureBoxes[pictureBoxCounter - 1].Controls.Add(drawPictureBoxes[pictureBoxCounter]);
- drawPictureBoxes[pictureBoxCounter].BringToFront();
- }