teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

見直しキャンペーン中

2023/07/18 21:43

投稿

TN8001
TN8001

スコア10108

answer CHANGED
@@ -1,98 +1,99 @@
1
- 直接の原因は`SetLeft`と`SetTop`が逆だからでしょうか(LeftがX)
2
- `e.GetPosition(this)`は`e.GetPosition(View)`のほうがいいでしょう(レイアウト次第ですが)
3
- あと`rc.Width` `rc.Height`がマイナスになった(左や上にドラッグした)とき、エラーになりませんか?
4
-
5
- ```C#
6
- using System.Windows;
7
- using System.Windows.Controls;
8
- using System.Windows.Input;
9
- using System.Windows.Media;
10
- using System.Windows.Shapes;
11
-
12
- namespace Questions237403
13
- {
14
- public partial class MainWindow : Window
15
- {
16
- private enum MUD { U, D }
17
- private struct VD
18
- {
19
- public Point MouseD;
20
- public Point MouseM;
21
- }
22
- private Canvas View;
23
- private Rectangle rc;
24
- private MUD Jotai;
25
- private VD vd;
26
-
27
- public MainWindow()
28
- {
29
- //InitializeComponent();
30
-
31
- View = new Canvas();
32
- View.Background = Brushes.White;
33
- View.MouseDown += Canvas_MouseDown;
34
- View.MouseMove += View_MouseMove;
35
- View.MouseUp += Canvas_MouseUp;
36
- AddChild(View);
37
-
38
- rc = new Rectangle();
39
- rc.Stroke = new SolidColorBrush(Color.FromRgb(255, 0, 0));
40
- rc.Opacity = 0.5;
41
- rc.StrokeThickness = 3;
42
- rc.Width = 0;
43
- rc.Height = 0;
44
- View.Children.Add(rc);
45
- }
46
-
47
- private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
48
- {
49
- vd.MouseD = e.GetPosition(View);
50
- vd.MouseM = vd.MouseD;
51
- Canvas.SetLeft(rc, vd.MouseD.X);
52
- Canvas.SetTop(rc, vd.MouseD.Y);
53
- rc.Width = vd.MouseM.X - vd.MouseD.X;
54
- rc.Height = vd.MouseM.Y - vd.MouseD.Y;
55
-
56
- Jotai = MUD.D;
57
- }
58
-
59
- private void View_MouseMove(object sender, MouseEventArgs e)
60
- {
61
- if(Jotai == MUD.D)
62
- {
63
- vd.MouseM = e.GetPosition(View);
64
- var w = vd.MouseM.X - vd.MouseD.X;
65
- var h = vd.MouseM.Y - vd.MouseD.Y;
66
-
67
- if(0 <= w)
68
- {
69
- Canvas.SetLeft(rc, vd.MouseD.X);
70
- rc.Width = w;
71
- }
72
- else
73
- {
74
- Canvas.SetLeft(rc, vd.MouseD.X + w);
75
- rc.Width = -w;
76
- }
77
-
78
- if(0 <= h)
79
- {
80
- Canvas.SetTop(rc, vd.MouseD.Y);
81
- rc.Height = h;
82
- }
83
- else
84
- {
85
- Canvas.SetTop(rc, vd.MouseD.Y + h);
86
- rc.Height = -h;
87
- }
88
- }
89
- }
90
-
91
- private void Canvas_MouseUp(object sender, MouseButtonEventArgs e)
92
- {
93
- Jotai = MUD.U;
94
- vd.MouseM = e.GetPosition(View);
95
- }
96
- }
97
- }
1
+ 直接の原因は`SetLeft`と`SetTop`が逆だからでしょうか(`Left``X`
2
+ `e.GetPosition(this)`は`e.GetPosition(View)`のほうがいいでしょう(レイアウト次第ですが)
3
+
4
+ あと`rc.Width`・`rc.Height`がマイナスになった(左や上にドラッグした)とき、エラーになりませんか?
5
+
6
+ ```cs
7
+ using System.Windows;
8
+ using System.Windows.Controls;
9
+ using System.Windows.Input;
10
+ using System.Windows.Media;
11
+ using System.Windows.Shapes;
12
+
13
+ namespace Questions237403
14
+ {
15
+ public partial class MainWindow : Window
16
+ {
17
+ private enum MUD { U, D }
18
+ private struct VD
19
+ {
20
+ public Point MouseD;
21
+ public Point MouseM;
22
+ }
23
+ private Canvas View;
24
+ private Rectangle rc;
25
+ private MUD Jotai;
26
+ private VD vd;
27
+
28
+ public MainWindow()
29
+ {
30
+ //InitializeComponent();
31
+
32
+ View = new Canvas();
33
+ View.Background = Brushes.White;
34
+ View.MouseDown += Canvas_MouseDown;
35
+ View.MouseMove += View_MouseMove;
36
+ View.MouseUp += Canvas_MouseUp;
37
+ AddChild(View);
38
+
39
+ rc = new Rectangle();
40
+ rc.Stroke = new SolidColorBrush(Color.FromRgb(255, 0, 0));
41
+ rc.Opacity = 0.5;
42
+ rc.StrokeThickness = 3;
43
+ rc.Width = 0;
44
+ rc.Height = 0;
45
+ View.Children.Add(rc);
46
+ }
47
+
48
+ private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
49
+ {
50
+ vd.MouseD = e.GetPosition(View);
51
+ vd.MouseM = vd.MouseD;
52
+ Canvas.SetLeft(rc, vd.MouseD.X);
53
+ Canvas.SetTop(rc, vd.MouseD.Y);
54
+ rc.Width = vd.MouseM.X - vd.MouseD.X;
55
+ rc.Height = vd.MouseM.Y - vd.MouseD.Y;
56
+
57
+ Jotai = MUD.D;
58
+ }
59
+
60
+ private void View_MouseMove(object sender, MouseEventArgs e)
61
+ {
62
+ if(Jotai == MUD.D)
63
+ {
64
+ vd.MouseM = e.GetPosition(View);
65
+ var w = vd.MouseM.X - vd.MouseD.X;
66
+ var h = vd.MouseM.Y - vd.MouseD.Y;
67
+
68
+ if(0 <= w)
69
+ {
70
+ Canvas.SetLeft(rc, vd.MouseD.X);
71
+ rc.Width = w;
72
+ }
73
+ else
74
+ {
75
+ Canvas.SetLeft(rc, vd.MouseD.X + w);
76
+ rc.Width = -w;
77
+ }
78
+
79
+ if(0 <= h)
80
+ {
81
+ Canvas.SetTop(rc, vd.MouseD.Y);
82
+ rc.Height = h;
83
+ }
84
+ else
85
+ {
86
+ Canvas.SetTop(rc, vd.MouseD.Y + h);
87
+ rc.Height = -h;
88
+ }
89
+ }
90
+ }
91
+
92
+ private void Canvas_MouseUp(object sender, MouseButtonEventArgs e)
93
+ {
94
+ Jotai = MUD.U;
95
+ vd.MouseM = e.GetPosition(View);
96
+ }
97
+ }
98
+ }
98
99
  ```

1

2020/01/25 08:46

投稿

TN8001
TN8001

スコア10108

answer CHANGED
@@ -38,7 +38,7 @@
38
38
  rc = new Rectangle();
39
39
  rc.Stroke = new SolidColorBrush(Color.FromRgb(255, 0, 0));
40
40
  rc.Opacity = 0.5;
41
- rc.StrokeThickness = 10;
41
+ rc.StrokeThickness = 3;
42
42
  rc.Width = 0;
43
43
  rc.Height = 0;
44
44
  View.Children.Add(rc);