DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン MouseEventArgsのカレント座標 /あばば無人君 (19/05/27(Mon) 14:38) #34265
Nomalアイコン Re[1]: MouseEventArgsのカレント座標 /Hongliang (19/05/27(Mon) 15:32) #34266
  └Nomalアイコン Re[2]: MouseEventArgsのカレント座標 /あばば無人君 (19/05/27(Mon) 16:11) #34267 解決み!


親記事 / ▼[ 34266 ]
■34265 / 親階層)  MouseEventArgsのカレント座標
□投稿者/ あばば無人君 一般人(4回)-(2019/05/27(Mon) 14:38:23)
  • アイコン環境/言語:[Win10Pro(Ver1809)、C#(.Net4.7.1)] 
    分類:[.NET] 

    現在、Win10Pro(Ver1809)+C#(.Net4.7.1)の環境でタイトルバーの無い
    フォームアプリケーション※を作成しております。
    ※FormのプロパティFormBorderStyle=None

    ただ、このアプリは移動はさせたいとの事なのでMouseDown/MouseMove/MouseUpの
    イベントを設定して以下の実装をしております。
    (マウスでフォームをドラッグして移動できる実装)

    private bool IsFormMoveStart = false;
    private Point MouseLocation;

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
    Debug.WriteLine("マウスダウンイベント発生!:" + e.Button + e.Location);

    IsFormMoveStart = true;
    MouseLocation = e.Location;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
    if (IsFormMoveStart)
    {
    Debug.WriteLine("マウスムーブイベント発生!:" + e.Button + e.Location);

    /// マウスの移動距離(ピクセル?)を求める
    int moveX = e.Location.X - MouseLocation.X;
    int moveY = e.Location.Y - MouseLocation.Y;

    /// マウスの移動距離分だけ当EXEフォームも移動させる
    this.Location = new Point(this.Location.X + moveX,
    this.Location.Y + moveY);

    // MouseLocation = e.Location; ★
    }
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
    Debug.WriteLine("マウスアップイベント発生!:" + e.Button + e.Location);

    IsFormMoveStart = false;
    }

    質問はこのフォームを実際にマウスで移動した時の以下ログのX座標の値です。

    マウスダウンイベント発生!:Left{X=200,Y=100} -@
    マウスムーブイベント発生!:Left{X=200,Y=100} -A
    マウスムーブイベント発生!:Left{X=201,Y=100} -B
    マウスムーブイベント発生!:Left{X=200,Y=100} -C
    マウスアップイベント発生!:Left{X=200,Y=100} -D

    @A行目はフォームをマウスで押下(指は解放していない)した時の物で、
    X座標はその時点の値が出力されていて問題は無い認識です。

    次に右へ1ピクセル動かしたログがBCなのですが、Bで200 → 201 となったのに
    Cで200に戻っています。
    また、指を開放した時のDも同様です。

    最初は私の操作がおかしいのかと思いましたが、何度やってもフォームは確実に
    1ピクセル動いていますし、また他の人間に操作させても同じ結果でした。

    CDで1ピクセル小さい値がイベントとして上がってくる原因が分かる方は
    いらっしゃいますでしょうか?

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 34265 ] / ▼[ 34267 ]
■34266 / 1階層)  Re[1]: MouseEventArgsのカレント座標
□投稿者/ Hongliang 大御所(561回)-(2019/05/27(Mon) 15:32:22)
  • アイコン2019/05/27(Mon) 15:45:02 編集(投稿者)

    e.Locationは、senderであるコントロールの左上を (0, 0) とするクライアント座標系で表されています。
    マウスを右に1ピクセル動かすと、フォームがそれに続いて右に1ピクセル移動されるため、結局クライアント座標系におけるマウスカーソル位置は元に戻ることになります。

    追記。
    マウスが動いていなくても、フォームの方が移動した時、MouseMoveイベントが発生します。
違反を報告
[ 親 34265 / □ Tree ] 返信 削除キー/

▲[ 34266 ] / 返信無し
■34267 / 2階層)  Re[2]: MouseEventArgsのカレント座標
□投稿者/ あばば無人君 一般人(6回)-(2019/05/27(Mon) 16:11:24)
  • アイコンNo34266に返信(Hongliangさんの記事)
    > 2019/05/27(Mon) 15:45:02 編集(投稿者)

    > e.Locationは、senderであるコントロールの左上を (0, 0) とするクライアント座標系で表されています。
    > マウスを右に1ピクセル動かすと、フォームがそれに続いて右に1ピクセル移動されるため、結局クライアント座標系におけるマウスカーソル位置は元に戻ることになります。

    Oh!その通りですね。
    しょぼいレベルの質問にお答えして頂き本当にありがとうございました。



    > 追記。
    > マウスが動いていなくても、フォームの方が移動した時、MouseMoveイベントが発生します。

    ご丁寧にありがとうございました。



    本件、解決済みとさせて頂きます。

解決み!
違反を報告
[ 親 34265 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -