4

私はVB6アプリを持っています。メインフォームがあります。ユーザーコントロールを収容します。このユーザー コントロールにはボタン コントロールがあります。ボタンをクリックすると、メニューがポップアップして、メニューの左上がボタンの左下のすぐ下になるようにします。

私が行った場合:

frm.PopupMenu mnuBlah

マウスがある場所にメニューが表示されます。

座標を提供しようとすると

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

計算が完全に間違っていることがわかり、メニューが目標から大きく外れて表示されます。

PopupMenu 呼び出しに必要な座標の種類と、ボタンの下の位置を計算する方法がよくわかりません。

4

3 に答える 3

2

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 などのイベントを発生させます。(もちろん、より意味のある名前の方がはるかに優れています。)

とにかく、これが手遅れにならないことを願っています...

于 2009-07-15T04:58:13.977 に答える
1

vbPopupMenuLeftAlignフラグをPopupMenuメソッドに渡す必要があります。これは、PopupMenuメソッドのドキュメントと矛盾することに注意してください(Microsoftが実際に間違いを犯した可能性はありますか?)が、機能します。

frm.PopupMenu mnuBlah, vbPopupMenuLeftAlign, btn.Left, btn.Top + btn.Height
于 2009-07-06T15:07:53.400 に答える
1

親コンテナーの高さと左の値を含める必要があります (これは通常フォームですが、フレームやその他のコンテナーの場合もあります)。

私はあなたがこのようなものを探していると思います:

btn.Parent.PopupMenu mnuBlah, vbPopupMenuLeftAlign , btn.Left, btn.Top + btn.Height
于 2009-07-03T06:09:43.923 に答える