Čas zobrazenia tool tipu

Práve pracujem na aplikácii, kde sa správičky v zobrazujú v ToolTipe, keď užívateľ prejde myšou nad labelom, kde je zobrazený iba text správy, čo sa zmestí na jeden riadok. Veľmi jednoduchá uloha. Avšak po spustení som si všimol, že sa tool tip zobrazí iba na 5 sekúnd. To môže byť dosť málo, keď niektoré sprívičky môžu buť dlhšie.

Trieda ToolTip má vlastnosť AutoPopDelay, kde sa v milisekundách dá nastaviť čas zobrazenia. Avšak v dokumentacii je napísané, že maximálny čas nastavený tejto vlastnosti môže byť 5000 ms. Samozrejme, že som to skusil obýsť a dať mu 60000 ms. Avšak tool tip sa stale zobrazoval 5 sekúnd. Aj keď navratová hodnota vlastnosti AutoPopDelay bola 60000.

Potom som skúsil metódu ToolTip.Show a ToolTip.Hide, čo bolo odporúčanie dokumentácia v pripade, že chcem zobraziť tool tip dlhšie ako 5 sekúnd. Problém však bol, že dlhšia správa zobrazila tool tip, ktorého časť bola mimo obrazovky. Táto metóda totiž sama prepočítava rozmery tooltipu a pravdepodobne ten algoritmus nie je taký dokonalý ako ten, čo je implementovaný vo WinAPI. Ďalší problém bol, že táto metóda nefunguje, ak nie je okno aktívne.

Takže nasledoval .NET Reflector. Tam som si všimol, že trieda ToolTip ma nejaký vlastný Timer. A dokonca má protected metódu StopTimer. V dokumentácii k tejto metóde je napísané, že sa zastaví timer, ktorý sa stará o skrývanie. Tak som skúsil odvodiť vlastný ToolTip a zavolať StopTimer v udalosti Popup, teda pri zobrazení tool tipu. Toto však nezafungovalo. Vďaka tomu, že Microsoft uvoľnil zdrojové kódy .NET Framework, tak som mohol debugovať a zistil som, že ten interný timer ani nebol spustený. Po podrobnejšom štúdiu som zistil, že ten interný timer sa používa iba pri manuálnom zobrazení tool tipu cez metódy Show a Hide.

Ale som zistil, že trieda ToolTip vytvorí okno triedy tooltips_class32. Teraz nemyslím .NET triedy, ale Window Class. Tak nasledoval Google, kde som na MSDN našiel dokumentáciu k triede TOOLTIPS_CLASS. Táto trieda pozná message TTM_GETDELAYTIME a TTM_SETDELAYTIME. Tieto message slúžia na nastavenie a zistenie časových intervalov, a teda aj intervalu na zobrazenie tool tipu. V dokumentácii nebolo spomenuté žiadne obmedzenie na tieto intervaly. Tak som skúsil spraviť pomocnú rutinu, ktora pošle obidve message, a teda sa pokusí nastaviť časový interval na 60000 priamo cez Win API. Žiaľ neúspešne. Aj keď keď som nastavil hodnotu na 60000, tak druhá správa vrátila hodnotu 5500. Tak som skúšal googliť správu TTM_SETDELAYTIME a riešenie sa našlo. Na stránke http://www.velocityreviews.com/forums/t104388-tooltip-controlling-duration-of-display.html som sa dočítal, že maximálna hodnota intervalu, ktorú možno nastaviť je 32767. Tak som sa vykašlal na WinAPI a skúsil to nastaviť cez vlastnosť AutoPopDelay.. a fungovalo to :)

Takže maximálna hodnota pre AutoPopDelay v triede ToolTip nie je 5000 ms, ako tvrdia v dokumentácii, ale 32767 ms.

Zaradené do: ,

Komentáre

# Liero said:

nevies nahodou ako nastavit dlzku tooltipu na webforms ovladacich prvkoch? :)

Wednesday, November 05, 2008 1:15 PM
Prihlásiť | Registrovať | Pomoc