|
|
home
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
|
|