Hallo
Ich habe folgende Klasse:
namespace Signal_Zeit_Diagramm
{
class Process:GraphicObject
{
//------------------------------------------------------
// Eigenschaften der Objekte
//------------------------------------------------------
public double StartTime // Startzeitpunkt (pos. Flanke)
{
get;
set;
}
public double EndTime // Endzeitpunkt (neg. Flanke)
{
get;
set;
}
public double Duration // Prozessdauer
{
get;
set;
}
public string ProcessName // Signalnamen
{
get;
set;
}
public int SignalStripeNumber // Signalstreifennummer
{
get;
set;
}
public Rectangle Rect // Koordinaten der Signale
{
get;
set;
}
//------------------------------------------------------
// Methoden der Objekte
//------------------------------------------------------
public override void DrawSignal(Graphics g)
{
g.FillRectangle(new SolidBrush(Color.Blue), Rect);
}
}
}
Wie bekomme ich ein Control auf das Objektmember process.Rect hin?
Ich möchte bei Mouseover über jedes Rechteck ein eigenes Tooltip anzeigen lassen. Ist es überhaupt möglich, ein Tooltip mit einem Klassenmember zu verlinken?
Ich hatte an sowas gedacht:
Control ctrlRect;
ctrlRect = process.Rect = new Rectangle(x1,y1,x2,y1);
ToolTip toolTip = new ToolTip();
toolTip.SetToolTip(ctrlRect, "Test");
toolTip.ShowAlways = true;
Scheint aber nicht der richtige Weg zu sein...
Danke und Gruß
Beren
Das Leben ist beschissen. Aber die Grafik ist geil! 😁
Hallo Beren,
ich würde es folgendermaßen machen:
Merke dir die Rechtecke, die du gezeichnest und prüfe in OnMouseMove, ob und in welchem Rechteck sich der Mauscursor befindet. Anschließend zeigts du den ToolTip an. Beim verlassen dieses Rechtecks (oder bei MouseMove), blendest du ihn wieder aus.
Hallo, punkdevil
Die Rechtecke habe ich ja bereits in den Objekten abgelegt. Wie verknüpfe ich die mit den Tooltips? Kann ich nicht eine dynamische Anzahl von Tooltips generieren, die mit den Koordinaten der Rechtecke in den einzelnen Objekten verknüpft sind? Wenn ja, wie? Habe irgendwie keine Idee, wie ich das anstellen soll....
Gruß
Beren
Das Leben ist beschissen. Aber die Grafik ist geil! 😁
So wie es aussieht, zeichnest du ja etwas auf eine Oberfläche. Also musst du beim MouseMove auf der Oberfläche immer abfragen, ob der Cursor sich gerade auf einem Objekt befindet. Wenn ja, dann den ToolTip generieren und anzeigen. Sobald im MouseMove das Rechteck verlassen wird, wird der ToolTip wieder entfernt.
Du hast ja ein Objekt "GraphicObject". Baue da am besten eine Methode "HitTest" ein, du ein bool zurückliefert. So kannst du auf der Oberfläche immer bequem via
if (Objekt.HitTest(x, y))
ZeigeToolTipAn();
prüfen, ob der Mauscursor sich gerade auf ein Objekt befindet.
Die ToolTips würde ich auf keinen Fall direkt an die Objekte klatschen, sondern wirklich nur über die Oberfläche steuern lassen.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
Für Khalid's Lösung kannst dir den HitTest ganz einfach gestallten ohne viel Aufwand.
public bool HitTest(System.Drawing.Point e)
{
return new System.Drawing.Region(this.Rect).IsVisible(e);
}
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
Wobei ein
public bool HitTest(System.Drawing.Point e)
{
return this.Rect.Contains(e);
}
etwas schneller ist, da kein zusätzliches Region erzeugt wird. Und ein Region muss disposed werden, da sonst nach einer gewissen Zeit sich eine menge Speicher ansammelt.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
Huch, stimmt🙂
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
Hi,
habe das Problem, wie folgt gelöst (sorry, hatte vergessen es gestern zu schreiben):
protected override void OnMouseClick(MouseEventArgs e)
{
if (fileLoaded)
{
base.OnMouseMove(e);
foreach (Process go in _objectList)
{
if (go.Rect.Contains(e.Location.X-autoScrollPosition.X, e.Location.Y-autoScrollPosition.Y))
{
toolTip.Show(go.ProcessName+" - Startzeit: "+go.StartTime+ " s, Endzeit: "+go.EndTime+" s, Dauer: "+go.Duration+" s", this, e.Location, 5000);
}
}
}
Die Autoscroll Position hole ich mir im OnPaint:
protected override void OnPaint(PaintEventArgs e)
{
if (fileLoaded)
{
base.OnPaint(e);
autoScrollPosition = base.AutoScrollPosition;
e.Graphics.TranslateTransform(autoScrollPosition.X, autoScrollPosition.Y);
DrawSignalStripe(e.Graphics); // Signalstreifen zeichnen
foreach (GraphicObject go in _objectList)
{
go.DrawSignal(e.Graphics);
}
}
Gruß
Beren
Das Leben ist beschissen. Aber die Grafik ist geil! 😁