Dynamický ToolTip   otázka

VB.NET, WinForms

Dobrý den,

nad objektem na formuláři (button) bych potřeboval zobrazit tooltip. To je celkem jednoduché. Narazil jsem však při potřebě měnit text v tooltipu. Ten by se měl měnit v závislosti na čase a na dalších zadávaných proměnných, ale to je celkem jedno. A nevím jak na to.

Díky za pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Použijte k tomu metodu System.Windows.Forms.ToolTip.SetToolTip, kde první parametr je ovládací prvek a druhý parametr text popisku (hodnota Nothing pro zrušení popisku).

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Hodnotu potřebuji měnit v události Popup a tam se mi to nedaří, vyhodí to chybu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Proč v události Popup?! Tato událost nastává v momentě kdy je popisek zobrazen a to už je na změnu textu pozdě.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

no já bych to potřeboval nastavit v okamžiku těsně před zobrazením tooltipu, tedy ne hned, kdy se myš zastaví, ale opravdu až v okamžiku těsně před zobrazením popisku. Jak tedy na to?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Předpokládám, že chcete v popisku zobrazovat nějaký stav něčeho, tak nevím proč nepoužijete metodu SetToolTip v místě, kde se tento stav mění.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

tento stav se mění podle polohy dejme tomu nad pictureboxem a určuje se časově náročným výpočtem, tím pádem to nemohu dát do mouse move, protože by to procák nezvládnul, chtěl jsem to udělat nějak tak, že by se prostě výpočet a nastavení tooltipu spustil až dejme tomu po 500 ms, kdy se uživatel zastaví myší. Pokud se myš hýbe a nebo se pohne v čase pod 500 ms, tak se nic dít nebude. Fakt mě nenapadá, jak na to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Myslím že to bude problém a že to budete muset vyřešit jinak (například po klepnutí myší do PictureBoxu). Zkoušel jsem následující kód (pokud to chcete vyzkoušet, nastavte vlastnost OwnerDraw u ToolTipu na True, a vlastnost ToolTip on ToolTip1 u tlačítka na libovolný text):

Public Class Form1
  Private Sub ToolTip1_Draw(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawToolTipEventArgs) Handles ToolTip1.Draw
    Dim toolTipText = "Nový popisek"
    Dim bounds As New Rectangle
    With e.Bounds
      bounds.X = .X
      bounds.Y = .Y
      bounds.Width = CInt(e.Graphics.MeasureString(toolTipText, e.Font, Screen.PrimaryScreen.WorkingArea.Width).Width)
      bounds.Height = .Height
    End With
    Dim newEventArgs As New DrawToolTipEventArgs(e.Graphics, _
                                                 e.AssociatedWindow, _
                                                 e.AssociatedControl, _
                                                 bounds, _
                                                 toolTipText, _
                                                 SystemColors.Info, _
                                                 SystemColors.InfoText, _
                                                 e.Font)
    e = newEventArgs
    e.DrawBackground()
    e.DrawBorder()
    e.DrawText()
  End Sub
End Class

Tento kód zajišťuje vlastní obsluhu vykreslování popisku, tudíž teoreticky je právě toto místem, kde by se měl dát vykreslovaný text změnit. Jenže problém je v tom, že šířka oblasti pro vykreslování popisku se nějak vnitřně vypočítává podle původního textu a předání nové oblasti pro vykreslování (bounds) na to nemá vliv. Výsledný efekt je tedy to, že nový text se nemusí vejít do popisku.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Děkuji za radu, vyzkouším a dám vědět.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Blbne to, místo tooltipu se mi vykreslí černý rectangle s velikostí odpovídající původnímu textu. Přes tooltip asi cesta nevede. Asi to zkusím přes label, který na definovanou dobu vykreslím ke kurzoru myši. Teď jen vymyslet, jak udělat, aby se po zastavení myši nad pictureboxem počkalo dejme tomu 500 ms a teprve pak se spustil výpočet a následné zobrazení labelu s hodnotou. Pokud by se v průběhu těch 500 ms pohlo s myší, tak by se vše zrušilo a po zastavení myši opět znovu.

Asi to bude chtít timer, možná nějaké pozastavení vlákna... nevim.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Funguje to přesně jako obyčejný ToolTip, tj. vykreslí se žlutý obdélník s textem, který ale přesahuje. Pokud ne, máte něco špatně. Vymýšlíte zbytečně komplikovaná řešení, udělejte to jako ToolTip zobrazený explicitně po klepnutí myší a je to. Obzvlášť pokud jde o nějaký složitější výpočet.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

No jo, jenže na klepnutí myši už mám pověšené jiné věci... zase jiný, podrobnější výpočet. Ten tooltip pak dává jen jakési informativní údaje, bohužel dynamické a tak se taky musí vypočítávat. Musím to prostě nějak udělat... jdu bádat

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback