2009-07-03 19 views
4

私はVB6アプリケーションを持っています。メインフォームがあります。それはユーザーコントロールを格納します。このユーザーコントロールにはボタンコントロールがあります。ボタンをクリックすると、メニューの左上がボタンの左下にくるようにメニューがポップアップします。VB6のボタンのすぐ下にポップアップメニューを配置する方法

私がしなければ:マウスがどこにある

frm.PopupMenu mnuBlah 

メニューが起動します。

私が提供しようと

は数学が完全に間違って出てくると、メニューが目標に道をオフに表示されている

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

を調整します。

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

答えて

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 

注意。十分に簡単です:

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などのイベントを発生させます。 (もっと意味のある名前はもちろん、多くの方が良いでしょう。)

とにかく、私は、これはコンパイルされません

1

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

私はあなたがこのような何かを探していると思う:

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

...これが役に立つことには遅すぎではありません願って、あなたはそれを修正してもいるのでそれはコンパイルされ、動作しません。 – raven

+0

@raven私の答えで言及したように、私はそれをチェックするのに便利なコンパイラを持っていませんでした。この変更されたバージョンは機能するはずです。 –

1

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

frm.PopupMenu mnuBlah, vbPopupMenuLeftAlign, btn.Left, btn.Top + btn.Height 
関連する問題