Laden...

Wie über ein Bild einen Layer legen, diesen mit Punkten versehen auf die ich zugreifen kann?

Erstellt von Tossi65 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.546 Views
T
Tossi65 Themenstarter:in
83 Beiträge seit 2010
vor 5 Jahren
Wie über ein Bild einen Layer legen, diesen mit Punkten versehen auf die ich zugreifen kann?

Hallo Leute,
ich stehe vor einem interessanten Problem. Grafik ist nicht so mein Ding, aber eine Herausforderung.
Folgendes:
ich muss ein Programm erstellen, mit dem ich ein Bild anzeige und darüber einen Layer legen kann. Auf diesem Layer sezte ich Punkte und die muss ich ansprechen können und auch die Farbe wechseln. Also bis zum Bild laden bekomme ich hin und dann kein Plan.

Kann mir jemand helfen. Ist echt wichtig 😉

Danke Tossi

T
Tossi65 Themenstarter:in
83 Beiträge seit 2010
vor 5 Jahren

Ich habe wahrscheinlich selbst eine Möglichkeit gefunden. Ich will die Grafikobjekte in einer Liste speichern. Das klappt auch ganz gut. Zum Speichern will ich diese Serialisieren, aber ich bekomme immer einen Fehler.


[Serializable]
    public class MyLine : MyGraphicObject
    {
        public MyLine(Pen pen, Point start, Point end)
            : base(pen)
        {
            Path.AddLine(start, end);
        }
    }


S> Fehlermeldung:

ystem.Runtime.Serialization.SerializationException
HResult=0x8013150C
Nachricht = Der Typ "System.Drawing.Pen" in Assembly "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" ist nicht als serialisierbar gekennzeichnet.
Quelle = mscorlib
Stapelüberwachung:
bei System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
bei System.Runtime.Serialization.FormatterServices.<>c__DisplayClass9_0.<GetSerializableMembers>b__0(MemberHolder _)
bei System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory)
bei System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
bei System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
bei System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
bei System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
bei System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)
bei GrafikLayer.MainForm.button1_Click(Object sender, EventArgs e) in C:\Projekte\GrafikLayer\GrafikLayer\Form3.cs: Zeile171
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei GrafikLayer.Program.Main(String[] args) in C:\Projekte\GrafikLayer\GrafikLayer\Program.cs: Zeile21

wenn ich aber Pen als [Serializable] markiere meckert die IDE rum, das man das nicht machen kann!!!!

Weiß jemand rat?

Danke Tossi

T
2.219 Beiträge seit 2008
vor 5 Jahren

Ohne Code und mit deinen paar Worten kann man sich nicht wirklich vorstellen was du machen willst.
Der Fehler ist an sich eindeutig.

Du willst Pen serialisieren, was aber nicht geht da die Klasse Pen das Attribut Serializible nicht hat.
Ergo kannst du Pen auch nicht serialisieren, was auch nicht sinnvoll wäre, da du mit der Pen Klasse zeichnen kannst und diese keinen sinnvollen Ansatz zum serialisieren bieten würde.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

2.298 Beiträge seit 2010
vor 5 Jahren

Hallo Tossi65,

aufbauend auf meinen Vorredner der Tipp: Merke dir, welche Punkte du gezeichnet hast und speichere die Auflistung der Koordinaten weg.- Beim Laden zeichnest du die Punkte einfach wieder neu.

Ich würde das in etwa wie folgt aufbauen (GraphicCanvas ist übrigens die Basis):


 /// <summary>
    /// base class for graphical objects
    /// </summary>
    public abstract class GraphicObject
    {
        /// <summary>
        /// gets or sets the line color
        /// </summary>
        public Color Color { get; set; }

        /// <summary>
        /// Method to draw the graphic
        /// </summary>
        /// <param name="graphics">the graphics</param>
        public abstract void Draw(Graphics graphics);
    }

 /// <summary>
    /// Line object
    /// </summary>
    public class LineObject : GraphicObject
    {
        /// <summary>
        /// Gets or sets the start point
        /// </summary>
        public Point StartPoint { get; set; }

        /// <summary>
        /// Gets or sets the end point
        /// </summary>
        public Point EndPoint { get; set; }
        public LineObject(Color linecolor, Point startPoint, Point endPoint)
        {
            base.Color = linecolor;

            this.StartPoint = startPoint;
            this.EndPoint = EndPoint;
        }

        /// <summary>
        /// drawing method
        /// </summary>
        /// <param name="graphics">the graphics</param>
        public override void Draw(Graphics graphics)
        {
            using (Pen pen = new Pen(this.Color))
            {
                graphics.DrawLine(pen, this.StartPoint, this.EndPoint);
            }
        }
    }

 /// <summary>
    /// canvas
    /// </summary>
    public class GraphicCanvas
    {
        /// <summary>
        /// the grafical objects
        /// </summary>
        public List<GraphicObject> GraphicObjects { get; set; } = new List<GraphicObject>();

        /// <summary>
        /// Method to add a graphical object
        /// </summary>
        /// <param name="graphic"></param>
        public void AddGraphicObject(GraphicObject graphic)
        {
            this.GraphicObjects.Add(graphic);
        }

        /// <summary>
        /// Method to remove
        /// </summary>
        /// <param name="graphic"></param>
        public void RemoveGraphicObject(GraphicObject graphic)
        {
            this.GraphicObjects.Remove(graphic);
        }

        /// <summary>
        /// method to draw
        /// </summary>
        /// <param name="graphics"></param>
        public void Draw(Graphics graphics)
        {
            foreach (GraphicObject graph in this.GraphicObjects)
                graph.Draw(graphics);
        }

        /// <summary>
        /// Method to save
        /// </summary>
        /// <param name="fileName"></param>
        public void Save(string fileName)
        {
            using (Stream fileStream = File.Create(fileName))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(GraphicCanvas));
                serializer.Serialize(fileStream, this);
            }
        }

        /// <summary>
        /// method to load canvas
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static GraphicCanvas Load(string fileName)
        {
            using (Stream fileStream = File.OpenRead(fileName))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(GraphicCanvas));
                return (GraphicCanvas)serializer.Deserialize(fileStream);
            }
        }
    }

ACHTUNG: Das ganze ist ungetestet und nur eben dahin geschrieben!

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |