Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1856to1860
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

2. Userform bei MouseMove anzeigen

2. Userform bei MouseMove anzeigen
17.11.2021 15:45:56
Chris
Hallo Forum,
ich habe eine userform mit 17 Frames. Sobald ich mit der Maus über einen Frame gehe, soll sich Userform2 öffnen.
Für die ersten 8 Frames soll Userform2 rechts neben den Mauszeiger angezeigt werden, für die restlichen links neben dem Mauszeiger.
Bei dem Makro unten - für die Frames 1 und 2 - funktioniert zwar das Anzeigen der UF2, jedoch nur in der Bildschirmmitte.
Wie löst man dies?
VG
Chris

Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
UserForm2.Show
End Sub

Private Sub Frame2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
UserForm2.Show
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Unload UserForm2
End Sub

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 2. Userform bei MouseMove anzeigen
17.11.2021 15:52:22
Rudi
Hallo,
lege im Activate-Event Left und/oder Top der UF wie gewünscht fest.
Gruß
Rudi
AW: 2. Userform bei MouseMove anzeigen
17.11.2021 16:15:45
Chris
Hallo Rudi,
danke für die Rückmeldung.
Soweit ich das verstehe, geben .Left. .top die Position der UF von oben Links am Bildschirmrand an.
UF2 soll jedoch immer direkt neben dem Mauszeiger angezeigt werden, der sich an verschiedenen Stellen auf dem Bildschirm befindet.
Oder verstehe ich etwas falsch bzgl. den o. g. Befehlen?
Gruß
Chris
AW: 2. Userform bei MouseMove anzeigen
17.11.2021 16:28:30
Rudi
das verstehst du richtig.
Du hast doch X und Y für die Mauszeigerposition. Speichere die in 2 Public-Variablen und nutze die für Left und Top. Evtl +- Korrektur.
Gruß
Rudi
Anzeige
AW: 2. Userform bei MouseMove anzeigen
17.11.2021 16:19:11
Nepumuk
Hallo Chris,
für die Frames 1-8 so:

Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
With UserForm2
.LeftPos = False
.Show
End With
End Sub
für die Frames 9-n so:

Private Sub Frame9_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
With UserForm2
.LeftPos = True
.Show
End With
End Sub
Im UserForm2 setzt du die Eigenschaft "StartUpPosition" auf 0-Manuell und kopiere folgernden Code in dessen Modul:

Option Explicit
Private Declare PtrSafe Function GetCursorPos Lib "user32.dll" ( _
ByRef lpPoint As POINTAPI) As Long
Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function GetDC Lib "user32.dll" ( _
ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function ReleaseDC Lib "user32.dll" ( _
ByVal hwnd As LongPtr, _
ByVal hdc As LongPtr) As Long
Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32.dll" ( _
ByVal hdc As LongPtr, _
ByVal nIndex As Long) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Const LOGPIXELS_X As Long = 88&
Private Const LOGPIXELS_Y As Long = 90&
Private mblnLeftPos As Boolean
Private Sub UserForm_Activate()
Dim udtCursorPos As POINTAPI
Dim sngConversionX As Single, sngConversionY As Single
sngConversionX = GetResolution(LOGPIXELS_X)
sngConversionY = GetResolution(LOGPIXELS_Y)
Call GetCursorPos(udtCursorPos)
If LeftPos Then
Left = udtCursorPos.X * sngConversionX - Width
Else
Left = udtCursorPos.X * sngConversionX
End If
Top = udtCursorPos.Y * sngConversionY
End Sub
Private Function GetResolution(ByVal pvlngLogPixel As Long) As Single
Dim lngptrhWndDesk As LongPtr, lngptrhDCDesk As LongPtr
Dim lnglogPixel As Long
lngptrhWndDesk = GetDesktopWindow()
lngptrhDCDesk = GetDC(lngptrhWndDesk)
lnglogPixel = GetDeviceCaps(lngptrhDCDesk, pvlngLogPixel)
Call ReleaseDC(lngptrhWndDesk, lngptrhDCDesk)
GetResolution = 72 / lnglogPixel
End Function
Friend Property Get LeftPos() As Boolean
LeftPos = mblnLeftPos
End Property
Friend Property Let LeftPos(ByVal pvblnLeftPos As Boolean)
mblnLeftPos = pvblnLeftPos
End Property
Gruß
Nepumuk
Anzeige
wer kann, der kann!!! owT
17.11.2021 19:31:09
Rudi
AW: wer kann, der kann!!! owT
19.11.2021 14:13:20
Chris
Vielen Dank an alle. Klappt nun wie gewünscht.
Gruß
Chris
AW: 2. Userform bei MouseMove anzeigen
17.11.2021 16:20:47
Daniel
Hi
in der Eigenschaftsliste "StartUpPostition" auf 0-manuell stellen und dann nach dem .Show die .Left- und .Top-werte entsprechend einstellen.
Gruß Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige