WPFでマウス操作の練習をしようぜ(^~^)?

あびぶべぼー(^q^) びゅぷー(^~^) 公開下書き

前の話し

📖 WPFって何だぜ(^~^)?

気の早い人向け

📖 wpf-mouse-operation-practice - Git hub に上げたもの

今回の話し

ramen-tabero-futsu2.png
「 WPFで マウス操作の練習をしようぜ?」

kifuwarabe-futsu.png
「 動かすだけじゃないのか?」

ohkina-hiyoko-futsu2.png
「 マウスカーソルの座標、使えるマウスボタンの認識、ボタンの押下状態、
マウスの状態のキャプチャー中にマウスカーソルが Window の外に出ていってしまったときの挙動、などなどがあるわね」

ramen-tabero-futsu2.png
「 1990年代の Windows プログラミングみたいだな」

kifuwarabe-futsu.png
「 MFCよりマシだろ」

マウスカーソルの座標ってどうやって取得すんの?

📖 Mouse.GetPosition(IInputElement) メソッド

ramen-tabero-futsu2.png
「 👆 これ 使えるかな?」

20210918wpf103a1.png

ramen-tabero-futsu2.png
「 👆 Windowタグをクリックして 雷マークから MouseMove のテキストボックスをダブルクリックしろだぜ」

20210918wpf104a1.png

            Trace.WriteLine($"Window_MouseMove x={e.GetPosition((IInputElement)sender).X}");

ramen-tabero-futsu2.png
「 👆 デバッグ中のコンソール画面に X 座標を出してみようぜ?」

20210918wpf105a1.png

ramen-tabero-futsu2.png
「 👆 取れてるな」

ramen-tabero-futsu2.png
「 👆 ちなみに Gridタグで同じことやったが 働かなかった」

kifuwarabe-futsu.png
「 Grid が マウスカーソルの位置をキャプチャーしてくれないんじゃ、計算が大変じゃないか?」

ohkina-hiyoko-futsu2.png
「 MouseMove のイベントが Grid に降りてきてないの?」

📖 WPF Grid MouseUp Event(s) not working

kifuwarabe-futsu.png
「 👆 背景が透明なものは 無い ものと扱われるのでは? という話しも出てるな」

ramen-tabero-futsu2.png
「 透明でも マウスカーソルの位置をキャプチャーしたいことは 山ほど あるのに」

ohkina-hiyoko-futsu2.png
「 じゃあ 画面上に 丸を描いて、 丸の中で MouseMove イベントが働いて、丸の外で MouseMove イベントが働かないか
調べてちょうだい」

    <Grid>
        <Ellipse Width="300" Height="200" Fill="BlanchedAlmond" MouseMove="Ellipse_MouseMove"/>
    </Grid>
        private void Ellipse_MouseMove(object sender, MouseEventArgs e)
        {
            Trace.WriteLine($"Ellipse_MouseMove x={e.GetPosition((IInputElement)sender).X}");
        }

20210918wpf106a1.png

ramen-tabero-futsu2.png
「 👆 背景色が付いているところは MouseMove をキャプチャーできてそうだぜ」

座標をスクリーン座標にマッピングできんの?

ohkina-hiyoko-futsu2.png
「 デスクトップ画面上でウィンドウを動かしたいのよ。スクリーン上の座標で示してちょうだい」

📖 Windows Forms Coordinates
📖 Control.PointToScreen(Point) Method

kifuwarabe-futsu.png
「 👆 PointToScreen(...) というのがあるようだぜ」

ramen-tabero-futsu2.png
「 それは WPF ではないのでは……」

📖 WPF: Converting between screen coordinates and WPF coordinates

ramen-tabero-futsu2.png
「 👆 うーん こんなクソ長いコード書いてる連中は 劣化した又聞きの情報を劣化して又聞きしたような情報を集めるような 最末端だぜ」

📖 Visual.PointToScreen(Point) Method

ramen-tabero-futsu2.png
「 👆 情報の出元を調べることが 一番 手短だったりするぜ」

20210918wpf107a1.png

        private void Ellipse_MouseMove(object sender, MouseEventArgs e)
        {
            var itsObject = (Visual)sender;
            var coord = itsObject.PointToScreen(e.GetPosition((IInputElement)sender));
            Trace.WriteLine($"Ellipse_MouseMove scx={coord.X:0.0f} scy={coord.Y:0.0f}");
        }

ramen-tabero-futsu2.png
「 👆 なんか 二度手間になってるコードだが これで動きそう」

            var coord = ((Visual)sender).PointToScreen(e.GetPosition((IInputElement)sender));
            Trace.WriteLine($"Ellipse_MouseMove scx={coord.X:0.0f} scy={coord.Y:0.0f}");

kifuwarabe-futsu.png
「 👆 うーむ、これ以上短く書けないな」

ohkina-hiyoko-futsu2.png
「 Visual と IInputElement は全く異なるインターフェースなのね」

20210918wpf108a1.png

ramen-tabero-futsu2.png
「 👆 ウィンドウの中の座標も 楕円の中の座標も揃ってるから 多分 スクリーン座標をうまく取れてるんだろ。これで行こうぜ」

何度でもクリック!→

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位 の最近の記事