Bildeditor - Mehrere Linien nebeneinander zeichnen

  • C#

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von DosiSoft.

    Bildeditor - Mehrere Linien nebeneinander zeichnen

    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.

    C#-Quellcode

    1. int pictureBoxCounter = 0;
    2. PictureBox[] drawPictureBoxes = new PictureBox[999];
    3. Point selectionStart;
    4. Point selectionEnd;
    5. Color foreColor = Color.White;
    6. int size = 10;
    7. private void Editor_Load(object sender, EventArgs e)
    8. {
    9. drawPictureBoxes[0] = new PictureBox();
    10. drawPictureBoxes[0].SizeMode = PictureBoxSizeMode.StretchImage;
    11. drawPictureBoxes[0].Image = screenshot;
    12. drawPictureBoxes[0].Size = pbImage.Size;
    13. drawPictureBoxes[0].Location = new Point(0, 0);
    14. drawPictureBoxes[0].Paint += new PaintEventHandler(ImagePaint);
    15. drawPictureBoxes[0].MouseDown += new MouseEventHandler(ImageMouseDown);
    16. drawPictureBoxes[0].MouseMove += new MouseEventHandler(ImageMouseMove);
    17. drawPictureBoxes[0].MouseUp += new MouseEventHandler(ImageMouseUp);
    18. drawPictureBoxes[0].Paint += new PaintEventHandler(ImagePaint);
    19. pbImage.Controls.Add(drawPictureBoxes[0]);
    20. }
    21. private void ImageMouseDown(object sender, MouseEventArgs e)
    22. {
    23. MouseDown = true;
    24. selectionStart = e.Location;
    25. selectionEnd = Point.Empty;
    26. }
    27. private void ImageMouseMove(object sender, MouseEventArgs e)
    28. {
    29. if (MouseDown)
    30. {
    31. selectionEnd = e.Location;
    32. drawPictureBoxes[pictureBoxCounter].Invalidate();
    33. }
    34. }
    35. private void ImageMouseUp(object sender, MouseEventArgs e)
    36. {
    37. MouseDown = false;
    38. drawPictureBoxes[pictureBoxCounter].Paint -= ImagePaint;
    39. drawPictureBoxes[pictureBoxCounter].MouseDown -= ImageMouseDown;
    40. drawPictureBoxes[pictureBoxCounter].MouseMove -= ImageMouseMove;
    41. drawPictureBoxes[pictureBoxCounter].MouseUp -= ImageMouseUp;
    42. pictureBoxCounter++;
    43. drawPictureBoxes[pictureBoxCounter] = new PictureBox();
    44. drawPictureBoxes[pictureBoxCounter].SizeMode = PictureBoxSizeMode.StretchImage;
    45. drawPictureBoxes[pictureBoxCounter].Size = pbImage.Size;
    46. drawPictureBoxes[pictureBoxCounter].Location = new Point(0, 0);
    47. drawPictureBoxes[pictureBoxCounter].BackColor = Color.Transparent;
    48. drawPictureBoxes[pictureBoxCounter].Paint += new PaintEventHandler(ImagePaint);
    49. drawPictureBoxes[pictureBoxCounter].MouseDown += new MouseEventHandler(ImageMouseDown);
    50. drawPictureBoxes[pictureBoxCounter].MouseMove += new MouseEventHandler(ImageMouseMove);
    51. drawPictureBoxes[pictureBoxCounter].MouseUp += new MouseEventHandler(ImageMouseUp);
    52. drawPictureBoxes[pictureBoxCounter - 1].Controls.Add(drawPictureBoxes[pictureBoxCounter]);
    53. drawPictureBoxes[pictureBoxCounter].BringToFront();
    54. }

    gaaanz falscher Ansatz...
    Controls transparent übereinander funktioniert leider nicht.

    wie meinst du, mehrere Linien? Parallel?
    Jou Jou.
    @DosiSoft Du hast eine List(Of Line), der Du alle fertigen Linien zuweist, die beim Paint dargestellt werden müssen.
    Außerdem hast Du die Daten der aktuellen Linie, die gerade editiert wird.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!