Hallo,
ich bin jetzt mal wieder in C# unterwegs und wollte mir ein kleines Simulationsprogramm schreiben. Es kann sein, dass ich ein wenig raus bin. Ich bin mir nicht sicher ob das Problem bei mir liegt oder VS. Ich habe eine Klasse die von Control erbt, nach dem Kompilieren ist das Control in der Toolbox. Ziehe ich nun das Control auf eine Form stürtzt Visual Studio ab ("Visual Studio 2013 funktioniert nicht mehr.."). Füge ich das Control per Hand in die Designer-Datei funktionierts und ich kann auch Debuggen. Ich hab mal testweise ein neues Projekt gemacht und die 2 Klassen hinzugefügt (s.u.) und es verhält sich so wie vorher. Ist also reproduzierbar. Ich verwende Visual Studio 2013 Community.
Component.cs
und das eigentliche Control:
ComponentContainer.cs
Weiß jemand wo der Fehler liegt? Auf den Designer verzichten wollte ich ungern .
Grüße
*Topic verschoben*
ich bin jetzt mal wieder in C# unterwegs und wollte mir ein kleines Simulationsprogramm schreiben. Es kann sein, dass ich ein wenig raus bin. Ich bin mir nicht sicher ob das Problem bei mir liegt oder VS. Ich habe eine Klasse die von Control erbt, nach dem Kompilieren ist das Control in der Toolbox. Ziehe ich nun das Control auf eine Form stürtzt Visual Studio ab ("Visual Studio 2013 funktioniert nicht mehr.."). Füge ich das Control per Hand in die Designer-Datei funktionierts und ich kann auch Debuggen. Ich hab mal testweise ein neues Projekt gemacht und die 2 Klassen hinzugefügt (s.u.) und es verhält sich so wie vorher. Ist also reproduzierbar. Ich verwende Visual Studio 2013 Community.
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Linq;
- using System.Text;
- namespace CurcuitSim
- {
- public interface IDrawable
- {
- void Draw(Graphics g, Font f);
- bool Contains(Point position, Matrix transform);
- void MoveTo(Point from, Point to, Matrix transform);
- }
- public struct Connection :
- IDrawable
- {
- public Connection(string name, bool state)
- {
- Name = name;
- State = state;
- }
- public string Name;
- public bool State; // true == high , false == low
- public void Draw(Graphics g, Font f)
- {
- }
- public bool Contains(Point position, Matrix transform)
- {
- return false;
- }
- public void MoveTo(Point from, Point to, Matrix transform)
- {
- throw new NotImplementedException();
- }
- }
- public class Component :
- IDrawable
- {
- public Point Position { get { return pos; } set { pos = value; } }
- protected Point pos;
- public virtual string Name {get {return "Component";}}
- protected Size componentSize = new Size(50, 100);
- public Component() { pos = new Point(0, 0); }
- public Component(Point position)
- {
- pos = position;
- }
- public virtual void MoveTo(Point from, Point to, Matrix transform)
- {
- to = TransformPointI(to, transform);
- from = PointToClient(TransformPointI(from, transform));
- pos = new Point(to.X - from.X, to.Y - from.Y);
- }
- public virtual void Draw(Graphics g, Font f)
- {
- g.FillRectangle(Brushes.Black, new Rectangle(pos, componentSize));
- }
- public virtual bool Contains(Point posi, Matrix transform)
- {
- posi = TransformPointI(posi, transform);
- return (posi.X > pos.X) && (posi.Y > pos.Y) && (posi.X < (pos.X + componentSize.Width)) && (posi.Y < (pos.Y + componentSize.Height));
- }
- public Point PointToClient(Point origin)
- {
- return new Point(origin.X - pos.X, origin.Y - pos.Y);
- }
- private Point TransformPointI(Point posi, Matrix transform)
- {
- Point[] p = new Point[] { posi };
- // Copy Matrix
- Matrix transform2 = new Matrix(transform.Elements[0], transform.Elements[1], transform.Elements[2], transform.Elements[3], transform.Elements[4], transform.Elements[5]);
- transform2.Invert();
- transform2.TransformPoints(p);
- return p[0];
- }
- protected void DrawName(string name, Graphics g, Font f)
- {
- SizeF stringSize = g.MeasureString(name, f);
- g.DrawString(name, f, Brushes.Black, new PointF(pos.X + componentSize.Width/2.0f - stringSize.Width/2.0f, pos.Y));
- }
- }
- public class AndGate :
- Component
- {
- public AndGate(){ }
- public AndGate(Point p) : base(p) {}
- public override string Name { get { return "And Gate"; } }
- public override void Draw(Graphics g, Font f)
- {
- var bounds = new Rectangle(pos, componentSize);
- g.FillRectangle(Brushes.White, bounds);
- g.DrawRectangle(Pens.Black, bounds);
- DrawName("&", g, f);
- }
- }
- }
und das eigentliche Control:
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace CurcuitSim
- {
- public class ComponentContainer :
- Control
- {
- private List<IDrawable> drawItems = new List<IDrawable>();
- public void AddItem(IDrawable item) { drawItems.Add(item); Invalidate(); }
- public void RemoveItem(IDrawable item) { drawItems.Remove(item); Invalidate(); }
- public void ClearItems() { drawItems.Clear(); Invalidate(); }
- public float Zoom { get { return Zoom; } set { zoom = value; UpdateMatrix(new Point(0, 0)); } }
- float zoom = 1.0f;
- public Point Offset { get { return offset; } set { offset = value; UpdateMatrix(new Point(0, 0)); } }
- Point offset = new Point(0, 0);
- Matrix currentTransform = new Matrix();
- public ComponentContainer()
- {
- DoubleBuffered = true;
- Text = "";
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);
- e.Graphics.Transform = currentTransform;
- for (int i = 0; i < drawItems.Count; ++i)
- {
- drawItems[i].Draw(e.Graphics, Font);
- }
- }
- IDrawable drawItemCaught = null;
- Point lastPosition;
- protected override void OnMouseDown(MouseEventArgs e)
- {
- base.OnMouseDown(e);
- if (e.Button != System.Windows.Forms.MouseButtons.Left && e.Button != System.Windows.Forms.MouseButtons.Right)
- return;
- for (int i = 0; i < drawItems.Count; ++i)
- {
- if (drawItems[i].Contains(e.Location, currentTransform)) // Capture last DrawItem caught by Mouse
- {
- drawItemCaught = drawItems[i];
- lastPosition = e.Location;
- }
- }
- }
- protected override void OnMouseUp(MouseEventArgs e)
- {
- base.OnMouseUp(e);
- drawItemCaught = null;
- }
- protected override void OnMouseMove(MouseEventArgs e)
- {
- base.OnMouseMove(e);
- if (drawItemCaught == null)
- return;
- drawItemCaught.MoveTo(lastPosition, e.Location, currentTransform);
- lastPosition = e.Location;
- Invalidate();
- }
- protected override void OnMouseWheel(MouseEventArgs e)
- {
- base.OnMouseWheel(e);
- if (drawItemCaught != null)
- return;
- zoom += e.Delta * 0.0005f;
- zoom = Math.Min(Math.Max(zoom, 0.002f), 5.0f);
- UpdateMatrix(e.Location);
- }
- protected override void OnKeyDown(KeyEventArgs e)
- {
- switch(e.KeyCode)
- {
- case Keys.Up:
- offset.Y -= 15;
- break;
- case Keys.Down:
- offset.Y += 15;
- break;
- case Keys.Left:
- offset.X -= 15;
- break;
- case Keys.Right:
- offset.X += 15;
- break;
- }
- UpdateMatrix(new Point(0, 0));
- base.OnKeyDown(e);
- }
- private void UpdateMatrix(Point offs)
- {
- currentTransform.Reset();
- currentTransform.Translate(Offset.X, Offset.Y);
- currentTransform.Translate(offs.X, offs.Y);
- currentTransform.Scale(zoom, zoom);
- currentTransform.Translate(-offs.X, -offs.Y);
- Invalidate();
- }
- }
- }
Weiß jemand wo der Fehler liegt? Auf den Designer verzichten wollte ich ungern .
Grüße
*Topic verschoben*
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()