tabControlの中でのマウスの右クリックの位置がすぐに表示されない

タグの編集
投稿者 kojiro  (社会人) 投稿日時 2020/3/27 21:02:37
いつもお世話になっております。
表題のことで以下、
Imports System.Drawing
Imports System.Drawing.Imaging
Public Class Form1
    Private sPos As MouseEventArgs  'マウスのドラッグの開始点
    Private Sub TabPage1_MouseDown(sender As Object, e As MouseEventArgs) Handles TabPage1.MouseDown
        If e.Button = MouseButtons.Right Then
            '開始点の取得
            sPos = e
            Dim k As Integer = TabControl1.SelectedIndex
            Dim i As Integer = sPos.X
            Dim j As Integer = sPos.Y
            MsgBox(k)
            MsgBox(i)
            MsgBox(j)
        End If
    End Sub
End Class
としたのですが、msgboxの命令が、2回目の右クリック時に表示されます。
すぐ表示するように、したいのですが・・・
投稿者 るきお  (社会人) 投稿日時 2020/3/28 08:54:54
試してみたところ私の環境では1回右クリックしただけでメッセージが表示されました。

マウスのボタンが複数同時に押されたケースに対応できていないのかなと思い、と私のマウスでボタンを同時に押してみたんですが、短い時間に複数のMouseDownイベントが発生するだけでkojiroさんの状況は再現できませんでした。

ただ、この動作はマウスの製品やドライバーなどによって再現状況が異なるということもありそうなので、私は再現できなくてもkojiroさんの環境ではこれが原因ということもあるかもしれません。

プログラム上は次のように書くと、複数のマウスボタンが押されている場合でもその中に右ボタンが含まれているかを判断してくれるようになります。
If e.Button.HasFlag(MouseButtons.Right) Then


つまり、
マウスの右ボタンだけが押されているのを判断するのか、
それとも、
マウスの1つ以上のボタンが押されており、その中に右ボタンが含まれているのを判断するのか
の違いです。

とはいえ、冒頭に書いたように私は複数ボタンが同時に押された状態でMouseDownイベントが発生するところは確認できなかったので机上の論かもしれません。ひとまずお試しください。

なお、ドラッグの開始点を判断するロジックとしてはkojiroさんのイベント内のロジックは一般的なものであり、私がコードレビューワーであれば、この判断ロジックは問題ない評価するか、せいぜい上記の修正を提案する程度です。
TabPage1でこれをやろうとしているところはかなり特殊ですね。PictureBoxなどが多いのではないかと思います。TabPage内にPictureBoxを目いっぱいの大きさで貼り付けるなど。ただ、今回の現象がコントロールの違いで発生するかはわかりません。



参考
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.mousebuttons?view=netframework-4.8
投稿者 (削除されました)  () 投稿日時 2020/3/28 10:55:46
(削除されました)
投稿者 kojiro  (社会人) 投稿日時 2020/3/28 11:01:58
解決しました。実はTabControlの中にボタンを配置し、右クリック時の座標から、右クリック時の動作設定しようと思っていました」。ボタンの上では、座標は表示されないようです。ボタンの右クリック時は、以下でできるようです。
 Private Sub Button1_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown
        If e.Button.HasFlag(MouseButtons.Right) Then
            '開始点の取得
            sPos = e
            Dim k As Integer = TabControl1.SelectedIndex
            Dim i As Integer = sPos.X
            Dim j As Integer = sPos.Y
            MsgBox(k)
            MsgBox(i)
            MsgBox(j)
        End If
    End Sub
投稿者 (削除されました)  () 投稿日時 2020/3/30 22:09:06
(削除されました)