2009-07-03 6 views
4

Ich habe eine VB6-App. Es gibt ein Hauptformular. Es beherbergt eine Benutzerkontrolle. Dieses Benutzersteuerelement verfügt über eine Schaltflächensteuerung. Wenn ich auf den Knopf klicke, möchte ich, dass ein Menü erscheint, so dass der obere linke Teil des Menüs direkt unterhalb der unteren linken Ecke des Knopfes ist.So positionieren Sie ein Popup-Menü direkt unter einer Schaltfläche in VB6

, wenn ich tun:

frm.PopupMenu mnuBlah 

das Menü erscheint, wo die Maus ist.

wenn ich versuche Koordinaten

frm.PopupMenu mnuBlah, btn.Left, btn.Top + btn.Height 

die Mathematik kommt völlig falsch zu bieten und das Menü Weg vom Ziel angezeigt wird.

Ich bin mir nicht ganz sicher, welche Art von Koordinaten der PopupMenu-Aufruf benötigt und wie die Position unter der Schaltfläche berechnet wird.

Antwort

2

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

1

Sie müssen die Höhe und die linken Werte für den übergeordneten Container einschließen (dies ist normalerweise das Formular, könnte aber auch ein Rahmen oder ein anderer Container sein).

Ich glaube, du bist für so etwas suchen:

btn.Parent.PopupMenu mnuBlah, vbPopupMenuLeftAlign , btn.Left, btn.Top + btn.Height 
+0

Dies gilt nicht kompilieren, und selbst wenn man es zu beheben, so dass Es kompiliert, es funktioniert nicht. – raven

+0

@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. –

1

Sie müssen die vbPopupMenuLeftAlign Flag an die PopupMenu Methode zu übergeben. Beachten Sie, dass dies der Dokumentation der PopupMenu-Methode widerspricht (konnte Microsoft tatsächlich einen Fehler gemacht haben?), Aber es funktioniert.