Laden...

Der ToolTip flackert.

Erstellt von Natascha vor 15 Jahren Letzter Beitrag vor 15 Jahren 7.217 Views
Natascha Themenstarter:in
42 Beiträge seit 2007
vor 15 Jahren
Der ToolTip flackert.

Hallo,

ich habe Problem mit dem flackernden ToolTip.

Mit dem folgenden Code im MouseMove Ereigniss des Formulars zeige ich den ToolTip an den Stellen im Formular an denen ich die bmp-Dateien als Symbole zeichne. Der ToolTip flackert dabei. Ich habe schon die DoubleBuffered-Eigenschaft des Formulars auf true gesetzt, der ToolTip flackert trotzdem. Die geladene bmp-Bilder und andere Zeichnungselemente wie z.B. Linien werden richtig ohne zu flackern gezeichnet.

List<Symbol> symbol;// Generische Liste aller Symbole, für Bestimmung des aktuellen Symbols bei MouseMove.

private void Formular_MouseMove(object sender, MouseEventArgs e)
        {
            if (betrieb == 0)
            {
                SymbolName(e.X, e.Y);
            }
        }

        private void SymbolName(int x, int y)
        {
            Graphics grafic;
            grafic = this.CreateGraphics();
            toolTip.Hide(this);
            foreach (Symbol sym in this.symbol)
            {
                if (x > sym.Position.X && x < (sym.Position.X + sym.Bild.Width) && y > sym.Position.Y && y < (sym.Position.Y + sym.Bild.Height))
                {
                    toolTip.Show(sym.QuickInfo, this, sym.Position.X, sym.Position.Y);
                }
            }
        }

Weiß jemand, was ich noch einstellen oder programmieren muss, damit der ToolTip sich beim anzeigen ruhig verhält?

Danke im Voraus!

Natascha

Wer sucht, der findet!

Gelöschter Account
vor 15 Jahren
  1. warum das:
Graphics grafic;
            grafic = this.CreateGraphics();

und dann noch im mousemove
und dann noch kein dispose
und dann verwendest du es nicht ein mal

so verbrauchst du die handles ganz schnell und nach 5 minuten kommt eine outofmemoryexception

  1. machst du immer zuerst ein "hide" und anschließend ein Show.
    klar das es dabei flackert. du musst die komplette methode umbauen.
915 Beiträge seit 2006
vor 15 Jahren

Das Problem das es Flockert liegt beim MouseMove Ereigniss, nutze besser ein Click oder MouseDown Ereigniss.

Das Graphics grafic; grafic = this.CreateGraphics() ist gefährlich ohne Dispose zu benutzen mal davon abgesehen das es nicht mal benutzt. Schmeiß es am besten erstmal raus und wenn du jemals Graphics benutzt, schreib einfach nen using drum herum. also:


using(Graphics grafic  = this.CreateGraphics() )
{
  .... //usw
}

Das toolTip.Hide(this); brauchst du dann auch nicht mehr, da beim toolTip bereits einen Intervall mit angeben kannst 🙂

[Edit] JAck30lena war schneller ,-)

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Natascha Themenstarter:in
42 Beiträge seit 2007
vor 15 Jahren

Danke für die schnelle Antworten.

Ich weiß nicht, warum ich das Graphics Objekt in meiner MouseMove Funktion habe, vielleicht hatte ich etwas damit vor, gehört ganz klar nicht dahin. Ich habe diese Zeilen auskommentiert, aber das Problem mit dem Flackern bleibt.

Die ToolTip.Hide() Metode habe ich benutzt um ToolTip auszublenden, sobald ich mit Mouse außerhalb des Symbols bin. Wenn ich die Zeile ToolTip.Hide() auskommentiere, flackert der ToolTip tatsächlich nicht mehr, der verschwindet aber auch gar nicht, bis ich zu dem nächsten Symbol komme. Wenn ich beim ToolTip den Zeitintervall angebe, dann erneuert sich die Anzeige des ToolTips jedes mal nach diesem Intervall. D. h. wenn ich 500 msek angebe, flackert es einmal nach einer halben Sekunde. In allen Windowsanwendungen funktioniert es aber so, dass der ToolTip gezeigt wird, nur so lange sich der Mousezeiger im entsprechenden Bereich befindet, nicht länger und nicht weniger. Man muss normalerweise auch nicht mit dem Mouse klicken, um ein kurzes Info zu bekommen.

Wer sucht, der findet!

Gelöschter Account
vor 15 Jahren

ja du must das hide auch nur dann machen, wenn du einen bereich verlässt und nicht immer wenn sich die mouse bewegt.

Natascha Themenstarter:in
42 Beiträge seit 2007
vor 15 Jahren

Das läuchtet ein, ich muss mir uberlegen, wie ich das realisieren kann.

Danke!

Wer sucht, der findet!

915 Beiträge seit 2006
vor 15 Jahren

Dafür gibt es ebenso ein Event "Leave" kannst das aber auch auf andere weise lösen 🙂

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Natascha Themenstarter:in
42 Beiträge seit 2007
vor 15 Jahren

Ich habe die Klasse Symbol selbst geschrieben, sie hat kein Event "Leave". Diese Klasse lädt nur Bitmaps und definiert den Zustand des Symbols, und im Formular zeichne ich diese Symbole an bestimmten Stellen entsprechend dem Zustand.

Daher muss ich es auf andere Weise lösen. Weis aber erlich gesagt noch nicht wie.

Wer sucht, der findet!

Gelöschter Account
vor 15 Jahren

ganz einfach:

du hast doch gewisse regionen, wo du weißt, das ein tooltip angezeigt wird.
also musst du nur noch im move ereigniss abfragen ob sich der mousezeiger noch in der region befindet, für das gerade der tooltip auf show ist und diesen dann nur noch hide machen.

Natascha Themenstarter:in
42 Beiträge seit 2007
vor 15 Jahren

Das habe ich auf diese weise versucht:

private void Formular_MouseMove(object sender, MouseEventArgs e)
        {
            if (betrieb == 0)
            {
                SymbolName(e.X, e.Y);
            }
        }

        private void SymbolName(int x, int y)
        {
            //toolTip.Hide(this);
            foreach (Symbol sym in this.symbol)
            {
                if (x > sym.Position.X && x < (sym.Position.X + sym.Bild.Width) && y > sym.Position.Y && y < (sym.Position.Y + sym.Bild.Height))
                {
                    toolTip.Show(sym.QuickInfo, this, sym.Position.X, sym.Position.Y);
                }
                else
                {
                    toolTip.Hide(this);
                }
            }
        }

es haut aber nicht hin.

Wer sucht, der findet!

Gelöschter Account
vor 15 Jahren

es haut aber nicht hin.

was haut nicht hin? bitte beachte -> wie poste ich richtig (link dafst du selber in der faq suchen) ich denke es war punkt 5?

915 Beiträge seit 2006
vor 15 Jahren

        private void Formular_MouseMove(object sender, MouseEventArgs e)
        {
            if (betrieb == 0)
            {
                SymbolName(new Point(e.X, e.Y));
            }
        }

        private void SymbolName(Point pt)
        {
            //toolTip.Hide(this);
            bool bFound = false;
            foreach (Symbol sym in this.symbol)
                if(sym.pt.Contains(pt))
                {
                    bFound = true;
                    break;
                }

            if(!bFound) toolTip.Hide(this);
    }

Dreh einfach das ganze um.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Natascha Themenstarter:in
42 Beiträge seit 2007
vor 15 Jahren

Ich danke dir Andreas.May.

Das mit der boolischen Variable funktioniert hervorragend.

Ich habe es jetzt so:

private void Formular_MouseMove(object sender, MouseEventArgs e)
        {
            if (betrieb == 0)
            {
                SymbolName(e.X, e.Y);
            }
        }

        private void SymbolName(int x, int y)
        {
            //toolTip.Hide(this);
            bool bFound = false;
            foreach (Symbol sym in this.symbol)
            {
                if (x > sym.Position.X && x < (sym.Position.X + sym.Bild.Width) && y > sym.Position.Y && y < (sym.Position.Y + sym.Bild.Height))
                {
                    toolTip.Show(sym.QuickInfo, this, sym.Position.X, sym.Position.Y);
                    bFound = true;
                }
            }

            if (!bFound)
            {
                toolTip.Hide(this);
            }
        }

Eigentlich einfach, wenn man es fertig hat.

Danke!

Wer sucht, der findet!