none
Form2がアクティブなとき、From1のToolStripButtonをクリックしてもClickイベントが発生しない。 RRS feed

  • 質問

  • 今まで、Buttonでしていたことを、ToolStripButtonでしようとしましたが、

    Form1とForm2の二つのフォームを開いていて、Form2がアクティブなとき、

    Form1のToolStripButtonをクリックすると一回目でForm1にフォーカスが移り、

    二回目でClickイベントが発生します。

    Buttonの場合は、一回のクリックだけで、フォーカスの移動とClickイベントの発生が

    起こります。

    ToolStripButtonでも同じ動作にする方法はないでしょうか。

    ToolStripButtonのMouseEnterイベントでフォーカス移動する方法を考えていますが、

    ほかの方法があれば教えてくださいませ。

    2006年10月29日 10:16

回答

  • Form2 を表示するときに Form1 をオーナーにすれば可能です。

    Form2.Show(Me)

    しかし、これでは常に Form1 の上に Form2 が表示されてしまいます。

    2006年10月31日 13:45
  • すみません。やっぱり勘違いでした。

    お詫びとしてクリックしたようになるコードを考えました。
    ToolStripButton をクリックした時にフォームがアクティブになるだけなので、そのアクティブ時にクリック処理を入れてみました。


    Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
        ' 座標からの ToolStripItem を取得
        Dim p As Point = Me.ToolStrip1.PointToClient(System.Windows.Forms.Cursor.Position)
        Dim tsi As ToolStripItem = Me.ToolStrip1.GetItemAt(p.X, p.Y)
     
        If tsi Is Me.ToolStripSplitButton1 Then
            ' ボタン領域を取得
            Dim bounds As New Rectangle( _
                Me.ToolStripSplitButton1.Bounds.X, _
                Me.ToolStripSplitButton1.ButtonBounds.Y, _
                Me.ToolStripSplitButton1.ButtonBounds.Width, _
                Me.ToolStripSplitButton1.ButtonBounds.Height _
            )
     
            If bounds.Contains(p) = True Then
                ' ボタン領域
                Me.ToolStripSplitButton1.PerformButtonClick()
            Else
                ' ドロップダウン領域
                Me.ToolStripSplitButton1.ShowDropDown()
            End If
        End If
    End Sub

     

     

     

    2006年11月1日 12:31

すべての返信

  • Form2 を表示するときに Form1 をオーナーにすれば可能です。

    Form2.Show(Me)

    しかし、これでは常に Form1 の上に Form2 が表示されてしまいます。

    2006年10月31日 13:45
  • ダッチさんありがとうございます。

    実は、Form1をオーナーにしています。

    それでも、同じ動作でした。

    ただ、

    Form2.Owner = Me
    Form2.Show()

    だったので、

    Form2.Show(Me)

    に変えましたが、同じでした。

    また、Form2のTopMostプロパティをTrueにしていますが、Falseにしても同じでした。

    どこかで何か違うことをやっているのでしょうか。

    マウスでポイントするとToolStripButtonの色が変わるのに、

    クリックしても一発ではClickイベントが起きないのは、変な感じがします。

    2006年10月31日 16:44
  • 勘違いかもしれません。

    昨日 Visual Studio 2005 Standard Edition を使用してやったときはうまくいったと思ったのですが、
    本日 Visual Studio 2005 Express Edition を使用してやってみたら、一回目のクリックは反応しませんでした。

    もう一度確認してみます。
    お騒がせしてすみません。

    2006年11月1日 3:43
  • すみません。やっぱり勘違いでした。

    お詫びとしてクリックしたようになるコードを考えました。
    ToolStripButton をクリックした時にフォームがアクティブになるだけなので、そのアクティブ時にクリック処理を入れてみました。


    Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
        ' 座標からの ToolStripItem を取得
        Dim p As Point = Me.ToolStrip1.PointToClient(System.Windows.Forms.Cursor.Position)
        Dim tsi As ToolStripItem = Me.ToolStrip1.GetItemAt(p.X, p.Y)
     
        If tsi Is Me.ToolStripSplitButton1 Then
            ' ボタン領域を取得
            Dim bounds As New Rectangle( _
                Me.ToolStripSplitButton1.Bounds.X, _
                Me.ToolStripSplitButton1.ButtonBounds.Y, _
                Me.ToolStripSplitButton1.ButtonBounds.Width, _
                Me.ToolStripSplitButton1.ButtonBounds.Height _
            )
     
            If bounds.Contains(p) = True Then
                ' ボタン領域
                Me.ToolStripSplitButton1.PerformButtonClick()
            Else
                ' ドロップダウン領域
                Me.ToolStripSplitButton1.ShowDropDown()
            End If
        End If
    End Sub

     

     

     

    2006年11月1日 12:31
  • コードを考えていただきありがとうございます。

    ToolStripSplitButtonを対象としたテクニックですね。

    私が今まで使ったことのないメソッドPointToClient、PerformButtonClickなどがあって、

    大変参考になります。

    これらの方法を参考にして、研究してみます。

    2006年11月2日 13:35