PopupMenu möchte X- und Y-Koordinaten im ScaleMode des Formulars, auf dem das Menü angezeigt wird. In diesem Fall bedeutet das wahrscheinlich die Benutzerkontrolle.
Aber es hängt wirklich davon ab, wo Sie das MouseDown-Ereignis behandeln. (Sie erhalten keine Koordinaten mit dem Click-Ereignis.) Wenn sich Ihr Ereignishandler im Benutzersteuerelement selbst befindet, sollten Sie keine Probleme mit den angegebenen Koordinaten haben. Der Code, den Sie jedoch veröffentlichten, enthält die Flags-Parameter (sollte vbPopupMenuLeftAlign sein), die erklären könnte, warum Ihre Koordinatenmathematik nicht funktioniert. Außerdem müssen Sie das Menü als eine Eigenschaft des Benutzersteuerelements definieren.
Auf der anderen Seite, wenn Sie das MouseDown-Ereignis aus dem Benutzersteuerelement auslösen und es in dem enthaltenden Formular behandeln, muss das Popup-Menü eine Eigenschaft des enthaltenen Formulars sein. In diesem Fall können Sie die X- und Y-Parameter ignorieren, aber Sie müssen die Koordinatenberechnungen selbst durchführen. Die linke Kante der Schaltfläche relativ zum Hauptformular ist die Summe der linken Kante des Benutzersteuerelements und der Offset der Schaltfläche innerhalb des Steuerelements. Ähnliches Mathe funktioniert, um die untere Kante der Schaltfläche zu berechnen. Mit anderen Worten:
Private Sub UserControl1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
PopupMenu mnuPopup, vbPopupMenuLeftAlign, _
UserControl1.Left + UserControl1.Button.Left, _
UserControl1.Top + UserControl1.Button.Top + UserControl1.Button.Height
End Sub
Beachten Sie, dass dies erfordert, dass Sie auch auf die Schaltfläche (Button) als eine Eigenschaft des Benutzersteuerfreizulegen, so dass Sie ihre Links, Oben zugreifen können und Height.Das ist einfach genug:
Public Property Get Button() As CommandButton
Set Button = Command1
End Property
Anhebung der Veranstaltung ist einfach genug, um als gut; setzen nur
Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
an der Spitze der Benutzersteuerung, dann verwenden Sie diese:
RaiseEvent MouseDown(Button, Shift, X, Y)
im MouseDown--Ereignis der Schaltfläche in der Benutzersteuerung.
Um den Event-Handler im Hauptformular zu verkabeln, verwenden Sie die zwei Dropdown-Menüs oben im Code-Bearbeitungsfenster. Wählen Sie das Benutzersteuerelement aus dem linken aus, und wählen Sie dann das MouseDown-Ereignis aus dem rechten aus. Dies wird den Event-Handler einfügen, den Sie mit dem obigen Code ausfüllen.
Soweit es besser ist, die Handhabung des Menüs innerhalb des Benutzers selbst steuern, und sinnvolle Ereignisse zu erhöhen, wenn man ausgewählt ist, hält die Dinge getrennt. Das Benutzersteuerelement handhabt die UI-Arbeit, wobei die Hauptanwendung so bleibt, dass sie als Reaktion auf die Auswahl des Benutzers alles erledigt, was zu tun ist, ohne sich um die Platzierung des Menüs kümmern zu müssen.
So würden Sie eigentlich nicht das MouseDown-Ereignis auslösen; Sie würden eher Ereignisse wie OptionOneSelected, OptionTwoSelected oder OptionThreeSelected auslösen. (Mehr aussagekräftigen Namen wären viel besser, natürlich.)
Wie auch immer, ich hoffe, dass dies nicht zu spät ist, hilfreich zu sein ...
Dies gilt nicht kompilieren, und selbst wenn man es zu beheben, so dass Es kompiliert, es funktioniert nicht. – raven
@raven Wie ich in meiner Antwort erwähnt habe, hatte ich keinen Compiler zur Hand, um es zu überprüfen. Diese modifizierte Version sollte funktionieren. –