GDI+ und ColorDialog, Problem bei der Farbänderung einer Shape (Line)

  • C#
  • .NET (FX) 4.5–4.8

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

    GDI+ und ColorDialog, Problem bei der Farbänderung einer Shape (Line)

    Hallo Leute,
    ich hoffe alle sind gesund?! :)

    Ich habe folgendes Problem:
    Ich möchte die Farbe von Shapes die ich mit GDI+ erstellt habe mit durch einen ColorDialog ändern.
    Die Farbe ändert sich auch aber total falsch, es sieht so aus als würden die R, G, B -Werte total wild durcheinander gemixt!?
    Ich hab ein kleines Beispielprg. erstellt bei dem der Code genauso stukturiert ist und das gleiche Problem auftritt. Ich hab versucht den Code so kurz zu halten wie es geht.
    Das Projekt hab ich natürlich auch angehängt!

    Code in der Form:

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. using System.Drawing.Drawing2D;
    4. using System.Windows.Forms;
    5. namespace ColorDialog_Problem
    6. {
    7. public partial class Form1 : Form
    8. {
    9. private bool _drawState = true;
    10. private string _shapeName = "Line";
    11. private Line _line = new();
    12. private Point _lineCoords;
    13. private int _alpha = 255;
    14. private int _red = 255;
    15. private int _green = 201;
    16. private int _blue = 14;
    17. public Form1()
    18. {
    19. InitializeComponent();
    20. }
    21. protected override void OnPaint(PaintEventArgs e)
    22. {
    23. base.OnPaint(e);
    24. _drawState = true;
    25. _line.Draw(e.Graphics);
    26. }
    27. private void CmdStart_Click(object sender, EventArgs e)
    28. {
    29. if (DlgColor.ShowDialog() == DialogResult.OK)
    30. {
    31. _red = DlgColor.Color.R;
    32. _blue = DlgColor.Color.G;
    33. _green = DlgColor.Color.B;
    34. switch (_shapeName)
    35. {
    36. case "Line":
    37. _line = new Line(_alpha, _red, _green, _blue, 10, DashStyle.Dash)
    38. { LineLocation = _lineCoords, Size = new Size(200, 0) };
    39. break;
    40. default:
    41. break;
    42. }
    43. }
    44. Invalidate();
    45. }
    46. private void Form1_Load(object sender, EventArgs e)
    47. {
    48. InitializeShapes();
    49. }
    50. public void InitializeShapes()
    51. {
    52. _lineCoords = new Point(300, 200);
    53. _line = new Line(_alpha, _red, _green, _blue, 10, DashStyle.Dash)
    54. { LineLocation = _lineCoords, Size = new Size(200, 0) };
    55. }
    56. }
    57. }


    Code in der Klasse Shape:

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. using System.Drawing.Drawing2D;
    4. namespace ColorDialog_Problem
    5. {
    6. public abstract class Shape
    7. {
    8. public Point LineLocation;
    9. public abstract string Name { get; set; }
    10. public int Alpha { get; set; }
    11. public int Width { get; set; }
    12. public DashStyle DStyle { get; set; }
    13. public Size Size { get; set; }
    14. public Pen Pen;
    15. public abstract void Draw(Graphics e);
    16. }
    17. }


    Code in der Klasse Line:

    C#-Quellcode

    1. using System.Drawing;
    2. using System.Drawing.Drawing2D;
    3. namespace ColorDialog_Problem
    4. {
    5. class Line : Shape
    6. {
    7. public override string Name
    8. {
    9. get => "Line";
    10. set { }
    11. }
    12. public Line() { }
    13. public Line(int alpha, int red, int green, int blue, int width, DashStyle dStyle)
    14. {
    15. Pen = new Pen(Color.FromArgb(alpha, red, green, blue), width)
    16. {
    17. DashStyle = dStyle
    18. };
    19. }
    20. public override void Draw(Graphics e)
    21. {
    22. e.DrawLine(Pen, LineLocation, LineLocation + Size);
    23. }
    24. }
    25. }


    Wäre super wenn Ihr mir helfen könntet!
    Vielen Dank vorab für Eure Mühe!!!!
    ;)
    Duster
    Dateien
    Zeile#38, #39: so ist es momentan

    C#-Quellcode

    1. _blue = DlgColor.Color.G;
    2. _green = DlgColor.Color.B;
    Wie es sein sollte, findest Du leicht raus. Schau nochmal genau hin ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Duster Da hilft tatsächlich nur Debuggen.
    Nicht glauben, was der Code tut, sondern es wissen:
    Debuggen, Fehler finden und beseitigen
    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).
    Programmierfragen über PN / Konversation werden ignoriert!