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

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 (削除されました)  () 投稿日時 2020/3/30 22:09:06
(削除されました)
投稿者 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/28 10:55:46
(削除されました)
投稿者 るきお  (社会人) 投稿日時 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
投稿者 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回目の右クリック時に表示されます。
すぐ表示するように、したいのですが・・・