皆様、お世話になっています。
C# WPF です。 Canvas上の範囲指定でよくあるマウス追従のラバーバンドが表示されるように
したいため、以下のように記述しました。ラバーバンド形状は Rectangle です。
実行すると動くのですが、クリック(マウスダウン)と同時にドラッグすると
最初のDown時のポイント座標(座標表示では正確)とドラッグ時の座標が
マウス先端座標ではなく、マウス先端からさらにX,Yに40~50(変動あり)ほどプラスされた
位置に矩形表示(動きはOK)されてしまいます。
最初のマウスポイント座標は固定、ドラッグ時はマウスに従って変化するのは正常ですが、
座標の取得なのか表示なのか、単に考え方がわるいのか、わかりませんが ラバーバンド矩形
の座標がマウスカーソル先端とはずれる。
よく考えればわかるかもしれませんが、・・・わかりません。
何が間違っているかわかる方、いらっしゃいますでしょうか。
rc は Rectangle
View は Canvas名
vd は 別クラスで座標情報を持たせている
vd.MouseD はマウスダウン時のPoint
vd.MouseM はマウスドラッグ移動時のPoint
Jotai はマウスダウン中の状態
MainWindowのコンストラクタの続きから・・・
rc = new Rectangle();
rc.Stroke = new SolidColorBrush(Color.FromRgb(255, 0, 0));
rc.Opacity = 0.5;
rc.StrokeThickness = 3;
rc.Width = 0;
rc.Height = 0;
Canvas.SetTop(rc, 0);
Canvas.SetLeft(rc, 0);
View.Children.Add(rc);
}
/// ----- Mouse Down メソッド ---------- private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) { vd.MouseD = e.GetPosition(this); vd.MouseM = vd.MouseD; Canvas.SetTop(rc, vd.MouseD.X ); Canvas.SetLeft(rc, vd.MouseD.Y); rc.Width = vd.MouseM.X - vd.MouseD.X; rc.Height = vd.MouseM.Y - vd.MouseD.Y; Jotai = MUD.D; // Joutai は Enum型 } /// ----- Mouse Move メソッド -------- private void View_MouseMove(object sender, MouseEventArgs e) { if (Jotai == MUD.D) { vd.MouseM = e.GetPosition(this); rc.Width = vd.MouseM.X - vd.MouseD.X; rc.Height = vd.MouseM.Y - vd.MouseD.Y; } } /// ----- Mouse Up メソッド -------- 消すの処理は動きOK完成の後 private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) { if (rc != null) { Jotai = MUD.U; vd.MouseM = e.GetPosition(this); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/25 13:29