Laden...

Tooltip Problem - etwas kompliziert...

Erstellt von Beren vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.063 Views
B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren
Tooltip Problem - etwas kompliziert...

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! 😁

P
992 Beiträge seit 2007
vor 16 Jahren

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.

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

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! 😁

3.511 Beiträge seit 2005
vor 16 Jahren

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)

915 Beiträge seit 2006
vor 16 Jahren

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(

3.511 Beiträge seit 2005
vor 16 Jahren

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)

915 Beiträge seit 2006
vor 16 Jahren

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(

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

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! 😁