| |
Fortgeschrittene ProgrammierungToolTip bei FileListBox | | | Autor: BAStler | Datum: 19.12.06 15:27 |
| Hallo All,
will für mein Projekt DosShell noch bei der Listbox und zu langen Einträgen den ToolTip anzeigen, nach Möglichkeit so positioniert wie im Explorer, aber ohne OCX oder DLL-Aufruf.
Eine vereinfachte Variante habe ich schon mit SendMessage hinbekommen.
Private Sub Datei1_MouseMove(Index As Integer, Button As Integer, Shift As _
Integer, x As Single, y As Single)
' Mit Hilfe des ermittelten Index, wird der Dateiname an ToolTip übergeben
Datei1(glngFileList).ToolTipText = Datei1(glngFileList).List( _
FileListBoxHitTest(Datei1(glngFileList), x, y))
End Sub
'Übergibt den unter dem Mauszeiger befindlichen Index
Public Function FileListBoxHitTest(FileListBox As FileListBox, ByVal x As _
Single, ByVal y As Single) As Long
Dim nXPoint As Long
Dim nYPoint As Long
Dim nIndex As Long
nXPoint = x / Screen.TwipsPerPixelX
nYPoint = y / Screen.TwipsPerPixelY
With FileListBox
'Hier wird der Index(Dateiname) unter dem Mauszeiger ermittelt
nIndex = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, nYPoint * 65536 + nXPoint)
If (nIndex And &H10000) = &H10000 Then
FileListBoxHitTest = -1 'Mauszeiger befindet sich innerhalb der
' Listbox, aber nicht über einer Datei
Else
FileListBoxHitTest = nIndex
End If
End With
End Function Hat jemand ne Idee, wie ich den ToolTip genau positionieren kann?
Vielen Dank
BAStler | |
Re: ToolTip bei FileListBox | | | Autor: vbtricks | Datum: 19.12.06 18:34 |
| Salut,
mit der Suchmaschine und den Schlüsselwörtern listbox und ToolTip findet man eine ganze Menge, z.B. auch
CodeGuru: Tooltips for each ListBox Item
Worin konkret besteht denn das Problem?
Stefan
Web: http://www.vbtricks.de.vu/
VBTricks.de.vu. Meine Webseite zu VB und anderen Programmiersprachen. Verschiedene fortgeschrittene OCXe und komplette Projekte sind im Sourcecode verf?gbar. | |
Re: ToolTip bei FileListBox | | | Autor: BAStler | Datum: 19.12.06 20:28 |
| Hallo Stefan,
danke für den Tip, aber das habe ich schon.
Was ich jetzt noch erreichen wollte, ist die Auswertung der Länge des Eintrages (was wohl auf Basis von Pixel) passieren muß und nur wenn dieser breiter ist als die FileListBox, dann soll es wie im Explorer genau positioniert und angezeigt werden.
Gruß BAStler | |
Re: ToolTip bei FileListBox | | | Autor: vbtricks | Datum: 20.12.06 10:40 |
| Salut,
die Länge kannst du ermitteln, indem du die TextWidth-Methode benutzt (auf einem Control, das die gleiche Schriftart wie die Listbox hat.
Hab da gerade noch das gefunden, sieht eigentlich nach dem aus, was du suchst:
Wegen Überbreite unlesbar?
Stefan
Web: http://www.vbtricks.de.vu/
VBTricks.de.vu. Meine Webseite zu VB und anderen Programmiersprachen. Verschiedene fortgeschrittene OCXe und komplette Projekte sind im Sourcecode verf?gbar. | |
Re: ToolTip bei FileListBox | | | Autor: BAStler | Datum: 20.12.06 11:08 |
| Hallo Stefan,
das habe ich auch schon, aber da wird ein UserControl (ActiveX-Komponente) benutzt. Das wollte ich vermeiden und habe versucht es auf die Form umzuschreiben (ScaleMode = Pixel), jedoch
Zitat: | | Da wir einen Wert in Pixels benötigen, haben wir der Einfachheit halber den ScaleMode des UserControls auf vbPixels voreingestellt, und können nach der Zuweisung des aktuellen Fonts der ListBox an das UserControl dessen Methode TextWidth zur Ermittelung der Textbreite verwenden. | |
... ich bekomme es nicht hin.
Logische Reihenfolge wäre:
MouseZeiger erscheint über der FileListBox, MouseMove wird ausgelöst und ermittelt den Index, damit weiß ich den Dateinamen und nun muß ich die Breite der FileListBox mit der Länge des Dateinamens vergleichen (aber in Pixel) und wenn größer,
brauche ich noch die genaue Position, wobei ich die über die Mousekoordinaten schon habe.
Trotzdem danke, werde nochmal schauen, ob ich es umsetzen kann.
Gruß BAStler | |
Re: ToolTip bei FileListBox | | | Autor: vbtricks | Datum: 20.12.06 11:17 |
| Salut,
kopiere doch einfach die entsprechende ctl-Datei und evtl. benötigte Module in dein Projekt. Dann erscheint die ctl-Datei als Control in deiner Werkzeugleiste und du kannst dieses wie ein normales ActiveX-Control nutzen. Im Gegensatz zu einer OCX-Datei wird das ganze aber mit in deine EXE kompiliert, sodass du keine weiteren Abhängigkeiten hast.
Stefan
Web: http://www.vbtricks.de.vu/
VBTricks.de.vu. Meine Webseite zu VB und anderen Programmiersprachen. Verschiedene fortgeschrittene OCXe und komplette Projekte sind im Sourcecode verf?gbar. | |
Re: ToolTip bei FileListBox | | | Autor: BAStler | Datum: 21.12.06 16:35 |
| Hallo All und Stefan,
habe nochmal unter zu Hilfenahme des Links versucht, das Ganze in geordnete Bahnen zu bringen, allerdings habe ich meine Probleme mit den absoluten Koordinaten.
Mein Tooltip schwebt irgendwo auf dem Screen und Inhalt hat es auch nicht.
Der Source sieht momentan so aus und ich würde mich freuen, wenn mir jemand aus dem Dschungel hilft (sehe den Wald vor lauter Weihnachtsbäumen nicht mehr)
Global gRect as Rect 'ist global deklariert
Private Sub Datei1_MouseMove(Index As Integer, Button As Integer, Shift As _
Integer, X As Single, Y As Single)
Dim DateiName As String
Dim nIndex As Long
Dim nTop As Long
Dim nLeft As Long
Dim nHeight As Long
Dim nWidth As Long
Dim mDesktopWindow As Long
' Mit Hilfe des ermittelten Index, wird der Dateiname an DateiName übergeben
nIndex = FileListBoxHitTest(Datei1(glngFileList), X, Y)
DateiName = Datei1(glngFileList).List(nIndex)
' PictureBox leeren, zur Aufnahme des neu ermittelten Eintrages
PicRuler.Cls
PicRuler.AutoRedraw = True
Set PicRuler.Font = Datei1(glngFileList).Font
nWidth = PicRuler.TextWidth(DateiName)
' Anzeige soll nur erfolgen, wenn der Eintrag(DateiName) breiter als die
' FileListBox ist
If gRect.Right - gRect.Left <= PicRuler.TextWidth(DateiName) Then
' Startposition für Tooltip ermitteln (bis hierher klappt alles)
nTop = gRect.Top + (nIndex - Datei1(glngFileList).TopIndex) * gItemHeight + _
1
nWidth = nWidth + PicRuler.TextWidth(" ")
' Hier soll nur die optimale Höhe eingestellt werden
nHeight = PicRuler.TextHeight("A") + 3
--> Ab hier kommen die Schwierigkeiten, wo mir der Durchblick fehlt
' Position auf dem Bildschirm ermitteln
If nWidth + 1 > Screen.Width \ Screen.TwipsPerPixelX Then
nLeft = (Screen.Width \ Screen.TwipsPerPixelX) - nWidth
End If
If nTop + nHeight > Screen.Height \ Screen.TwipsPerPixelY Then
nTop = (Screen.Height \ Screen.TwipsPerPixelY) - nHeight
End If
Debug.Print nLeft & ", " & nTop
If GetParent(PicRuler.hwnd) <> GetDesktopWindow() Then
SetParent PicRuler.hwnd, GetDesktopWindow()
End If
nTop = nTop + gRect.Bottom
nLeft = gRect.Left
' Setzen des Tooltip auf die ermittelte Position, wo der Mauszeiger steht
SetWindowPos PicRuler.hwnd, HWND_TOPMOST, nLeft, nTop, nWidth, nHeight, _
SWP_NOACTIVATE
PicRuler.Visible = True
Debug.Print frmDosShell.Left & ", " & frmDosShell.Top & ", " & nLeft & ", " _
& nTop & ", " & nWidth & ", " & nHeight
Datei1(glngFileList).ToolTipText = DateiName
Else
Datei1(glngFileList).ToolTipText = ""
PicRuler.Visible = False
End If
End Sub Gruß BAStler | |
Re: ToolTip bei FileListBox | | | Autor: vbtricks | Datum: 24.12.06 08:54 |
| Salut,
kannst du mir das mal als VB6-Projekt mailen (evtl. abgespeckt)? Hier im Source fehlen ein paar Funktionen.
Stefan
Web: http://www.vbtricks.de.vu/
VBTricks.de.vu. Meine Webseite zu VB und anderen Programmiersprachen. Verschiedene fortgeschrittene OCXe und komplette Projekte sind im Sourcecode verf?gbar. | |
Re: ToolTip bei FileListBox | | | Autor: BAStler | Datum: 24.12.06 11:20 |
| Hallo Stefan,
habe es inzwischen soweit, das die Picture-Box genau positioniert wird und den Eintrag anzeigt, wenn der Mauszeiger über einem zu langen Dateinamen steht. Allerdings kann ich dann die Datei nicht mehr markieren (weil ja die Picture-Box darüberliegt) und in der Taskleiste erscheint ein unbenannter Eintrag durch die SetWindowPos-Funktion, den ich etwas störend finde und noch weg haben will.
Kann dir den Source auch erst am Mittwoch schicken, weil ich es noch auf Arbeit im Compi habe.
Also bis dahin erstmal danke, schöööne Weihnachten und ein paar schöne, streßfreie Festtage!
Gruß BAStler | |
Re: ToolTip bei FileListBox | | | Autor: BAStler | Datum: 27.12.06 10:53 |
| Hallo Stefan,
hier ist die neue MouseMove-Prozedur.Private Sub Datei1_MouseMove(Index As Integer, Button As Integer, Shift As _
Integer, X As Single, Y As Single)
Dim DateiName As String
Dim nIndex As Long
Dim nTop As Long
Dim nLeft As Long
Dim nHeight As Long
Dim nWidth As Long
Dim mDesktopWindow As Long
Dim nRect As RECT
' Mit Hilfe des ermittelten Index, wird der Dateiname an DateiName übergeben
nIndex = FileListBoxHitTest(Datei1(glngFileList), X, Y)
DateiName = Datei1(glngFileList).List(nIndex)
'PictureBox leeren, zur Aufnahme des neu ermittelten Eintrages
PicRuler.Cls
PicRuler.AutoRedraw = True
Set PicRuler.Font = Datei1(glngFileList).Font
PicRuler.FontSize = Datei1(glngFileList).FontSize
nRect.Top = frmDosShell.Top \ Screen.TwipsPerPixelX
nRect.Left = frmDosShell.Left \ Screen.TwipsPerPixelY
'Anzeige soll nur erfolgen, wenn der Eintrag(DateiName) breiter als die
' FileListBox ist
If gRect.Right - PicRuler.TextWidth(DateiName) <= 0 Then
'Startposition für Tooltip ermitteln
nWidth = PicRuler.TextWidth(DateiName) + PicRuler.TextWidth(" ")
nHeight = PicRuler.TextHeight("A") + 3
' Startposition = (Indexposition + Zeilenhöhe) + Hauptform.Top +
' FileListBox.Top
nTop = (nIndex * gItemHeight + 1) + nRect.Top + Datei1(glngFileList).Top + _
41
nLeft = nRect.Left + Datei1(glngFileList).Left + 5
' Position auf dem Bildschirm ermitteln
If nWidth + 1 > lScreenWidth Then
nLeft = lScreenWidth - nWidth
End If
If nTop + nHeight > lScreenHeight Then
nTop = lScreenHeight - nHeight
End If
If GetParent(PicRuler.hwnd) <> GetDesktopWindow() Then
SetParent PicRuler.hwnd, GetDesktopWindow()
End If
' Setzen des Tooltip auf die ermittelte Position, wo der Mauszeiger steht
PicRuler.Visible = True
SetWindowPos PicRuler.hwnd, HWND_TOPMOST, nLeft, nTop, nWidth, nHeight, _
SWP_SHOWWINDOW
PicRuler.Print DateiName
' Die folgende Codezeile wäre die einfache Tooltipausgabe, ohne genaue
' Positionierung
'Datei1(glngFileList).ToolTipText = DateiName
Else
'Datei1(glngFileList).ToolTipText = ""
PicRuler.Visible = False
End If
End Sub da wird dann die Funktion FileListBoxHitTest aufgerufen.
'Übergibt den unter dem Mauszeiger befindlichen Index
Public Function FileListBoxHitTest(FileListBox As FileListBox, ByVal X As _
Single, ByVal Y As Single) As Long
Dim nXPoint As Long
Dim nYPoint As Long
Dim nIndex As Long
With Screen
nXPoint = X / .TwipsPerPixelX
nYPoint = Y / .TwipsPerPixelY
lScreenWidth = .Width \ .TwipsPerPixelX
lScreenHeight = .Height \ .TwipsPerPixelY
End With
With FileListBox
GetClientRect .hwnd, gRect
'Hier wird der Index(Dateiname) unter dem Mauszeiger ermittelt
nIndex = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, nYPoint * 65536 + nXPoint)
'nachdem der Index ermittelt ist, wird die tatsächliche Höhe des
' Listeneintrages ermittelt
gItemHeight = SendMessage(.hwnd, LB_GETITEMHEIGHT, 0, 0)
If (nIndex And &H10000) = &H10000 Then
FileListBoxHitTest = -1 'Mauszeiger befindet sich innerhalb der
' Listbox, aber nicht über einer Datei
Exit Function
Else
FileListBoxHitTest = nIndex
End If
End With
End Function Hier noch ein paar Deklarationen im Modul, in dem die Funktion drin steht.
'Variable für FileListBox
Global gRect As RECT
Global gItemHeight As Long
Private Const LB_GETITEMHEIGHT = &H1A1
Private Const LB_ITEMFROMPOINT = &H1A9
Public Const SWP_SHOWWINDOW = &H40
Public Const HWND_TOPMOST = -1
'Die folgende API wird für den Tooltip innerhalb der FileListBox(Datei(1-3))
' benötigt
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long PicRuler selbst ist eine normale PictureBox, mit ScaleMode = Pixel.
Gruß BAStler | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere Infos
|