PopupMenuは、メニューがポップアップされているフォームのScaleModeにX座標とY座標が必要です。この場合、おそらくユーザーコントロールを意味します。
しかし、実際には、MouseDownイベントをどこで処理しているかによって異なります。 (あなたはClickイベントで座標を取得しません)。イベントハンドラがユーザコントロール内にある場合は、指定された座標を使用しても問題はありません。ただし、投稿したコードにFlagsパラメータ(vbPopupMenuLeftAlign)がないため、座標計算が機能しない理由が説明されています。さらに、メニューをユーザーコントロール自体のプロパティとして定義する必要があります。
一方、ユーザーコントロールからMouseDownイベントを発生させ、それを含むフォームで処理する場合、ポップアップメニューは、含まれているフォームのプロパティでなければなりません。この場合、XとYパラメータは無視できますが、座標計算は自分で行う必要があります。メインフォームを基準にしたボタンの左端は、コントロール内のボタンのオフセットであるユーザーコントロールの左端のとの合計になります。同様の数学がボタンの下端を計算するために機能します。言い換えれば、これはあなたがその左、上、および高さのプロパティにアクセスできるように、また、ユーザーコントロールのプロパティとしてボタン(ボタン)を露出することを必要とすること
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
注意。十分に簡単です:
Public Property Get Button() As CommandButton
Set Button = Command1
End Property
イベントを発生させるだけで十分です。ユーザーコントロールでボタンのMouseDownイベントに
RaiseEvent MouseDown(Button, Shift, X, Y)
:ちょうどこれを使用し、その後、ユーザーコントロールの最上部に
Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
を置きます。
最後に、メインフォームでイベントハンドラをワイヤリングするには、コード編集ウィンドウの上部にある2つのドロップダウンを使用します。左側のコントロールからユーザーコントロールを選択し、右側のMouseDownイベントを選択します。これにより、上記のコードで記入するイベントハンドラが挿入されます。
どのような方法であれ、ユーザーコントロール内部のメニューを処理し、選択されたときに有意義なイベントを発生させると、物事が分離されます。ユーザーコントロールはUI作業を処理し、メニューの配置について心配することなく、ユーザーの選択に応じて実行する必要がある処理をメインアプリケーションに任せます。
したがって、実際にはMouseDownイベントは発生しません。 OptionOneSelected、OptionTwoSelected、OptionThreeSelectedなどのイベントを発生させます。 (もっと意味のある名前はもちろん、多くの方が良いでしょう。)
とにかく、私は、これはコンパイルされません
...これが役に立つことには遅すぎではありません願って、あなたはそれを修正してもいるのでそれはコンパイルされ、動作しません。 – raven
@raven私の答えで言及したように、私はそれをチェックするのに便利なコンパイラを持っていませんでした。この変更されたバージョンは機能するはずです。 –