vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
ToolTip 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel