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
これには、ユーザー コントロールのプロパティとしてボタン (Button) も公開して、その Left、Top、および Height プロパティにアクセスできるようにする必要があることに注意してください。それはとても簡単です:
Public Property Get Button() As CommandButton
Set Button = Command1
End Property
イベントを発生させるのも簡単です。置くだけ
Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ユーザーコントロールの上部で、これを使用します:
RaiseEvent MouseDown(Button, Shift, X, Y)
ユーザー コントロールのボタンの MouseDown イベントで。
最後に、メイン フォームでイベント ハンドラーを接続するには、コード編集ウィンドウの上部にある 2 つのドロップダウンを使用します。左側からユーザー コントロールを選択し、右側から MouseDown イベントを選択します。これにより、上記のコードを入力したイベント ハンドラーが挿入されます。
どちらの方法が良いかというと、ユーザー コントロール自体の内部でメニューを処理し、いずれかが選択されたときに意味のあるイベントを発生させることです。ユーザー コントロールは UI 作業を処理し、メニューの配置を気にすることなく、ユーザーの選択に応じて実行する必要があるものはすべてメイン アプリケーションに処理させます。
したがって、実際には MouseDown イベントを発生させることはありません。むしろ、OptionOneSelected、OptionTwoSelected、または OptionThreeSelected などのイベントを発生させます。(もちろん、より意味のある名前の方がはるかに優れています。)
とにかく、これが手遅れにならないことを願っています...