BooksXL - Ihr Online Buchshop

 

Home

Projekte

VB Tipps

über mich

vb tipps

 

 

AMAZON: Professional VB6 - XML

home english version

Tooltips in Visual Basic (VB3)

Wie so viele Geschichten von Programmierproblemen spielt auch diese in einer langen, dunklen Nacht - nur erhellt vom Schein eines Bildschirms. Der Auftraggeber wollte Tooltips - das Programm musste unter 16Bit laufen. Tooltips sind die kleinen gelben Pickerl für diejenigen unter uns, die das Lesen noch immer nicht verlernt haben. Sie erscheinen, wenn wir zu lange unschlüssig über einem Button mit Sinnbild verweilen.
Apropos, kürzlich erzählte mir ein Bekannter, er hätte einen Button in einem Programm entdeckt, der mit dem Abbild eines Flugzeugs verziert war :-o. Da wird dann der Sinn solcher Tooltips recht einleuchtend. Kein Problem - Handbuch und Hilfe bieten die Lösung(?).

Erste Version: VB Handbuch / Hilfe

Ersparen wir uns den Code. Kurz gesagt schlägt das Handbuch folgende Lösung vor: Beim betreten des Buttons (MouseMove) wird ein Timer enabled, der nach etwa 1 Sekunde das gelbe Pickerl anzeigt. Das umgebende Fenster, die Buttonleiste, schaltet dann ebenfalls bei MouseMove eben jenen Timer wieder ab.

Na ja, ganz nett. Kleiner Test gefällig: Zieht man die Maus schnell genug aus dem zugehörigen Fenster raus (Rennmaus >= 0,02m/s), bleibt die Hilfe stehen. Nicht jeder hat eine Maus Marke Speedy Gonzales, langsamere Mäuse verlassen den Button bei eingeblendetem Tooltip gemächlich über eben diesen, wenn er wie eine Brücke über das umgebende Fenster reicht. Also der nächste Versuch:

Zweite Version: MS Developer Network

War ja damals nicht ganz billig die CD, aber immerhin scheint dort die Lösung meines Problems zu liegen:
Das Einschalten des Timers erfolgt wie gehabt. Sobald diese Timer dann aktiv wird, wird der Fokus auf den zugehörigen Button gesetzt, d.h. dieser ist jetzt der Empfänger für sämtliche Events. Bei jedem MouseMove-Event frägt der Button nun ab, ob die Position ausserhalb seines Bildschirmbereich liegt. Wenn ja, schaltet er Tooltip, Timer und Focus ab.

Schon besser. Erst nach einigem Testen zeigt sich, daß diese Lösung zwar nicht schlecht, aber eben doch nur die halbe Miete ist. Drückt man jetzt nämlich die Maustaste, verlässt den Knopf und fährt auf dem Fenster hin und her --- alle Knöpfe der Gruppe des verlassen Knopfes erklären sich solidarisch und versteckt sich vor der Maus, d.h. sie erscheinen im gedrückten Zustand. Vielleich könnte man diesen Effekt mal bei einem Programm für eine Lichtorgelsimulation verwenden?

Letzte Version: Also doch selbst ans Werk

Prinzipell funktionierte ja die zweite Version ganz gut. Nur darf der Eventfocus bei gedrückter Maustaste natürlich nicht vom Knopf genommen werden. Dieser sollte ja 1. ein Loslassen mitbekommen und 2. beim Wiedereintritt entsprechend reagieren.

Private Sub ribBereich_MouseDown(Index As Integer, _
Button As Integer, Shift As Integer, X As Single, Y As Single) MouseIsDown = True End Sub Private Sub ribBereich_MouseMove(Index As Integer, _
Button As Integer, Shift As Integer, X As Single, Y As Single) ' if user moved off button... If X > ribBereich(Index).Width Or X < 0 Or _
Y > ribBereich(Index).Height Or Y < 0 Then ' turn off timer tmrButtons.Enabled = False If MouseIsDown = False Then ReleaseCapture End If ' hide the help lblButtonInfoTip.Visible = False Else If Not lblButtonInfoTip.Visible Then gnQuickInfoButtonSelected = Index tmrButtons.Enabled = True Dim i As Integer i = SetCapture(ribBereich(Index).hWnd) End If End If End Sub Private Sub ribBereich_Click(Index As Integer, Value As Integer) Dim i As Integer MouseIsDown = False If lblButtonInfoTip.Visible = True Then frmKRegion.tmrButtons.Enabled = False lblButtonInfoTip.Visible = False ReleaseCapture End If ... End Sub Private Sub ribBereich_MouseUp(Index As Integer, _
Button As Integer, Shift As Integer, X As Single, Y As Single) MouseIsDown = False End Sub

Die bestehende Lösung musste lediglich um zwei Kleinigkeiten erweitert werden. Zunächst erhält jeder Button eine Variable, die festhält, ob die linke Maustaste gerade gedrückt ist. Ist sie das, wird der Fokus beim verlassen des Buttons nicht von diesem weggenommen. Lediglich der Tooltip wird dann weggeblendet.

 

top