728x90
반응형
PictureBox Mouse Drag로 사각형 그리기
PictureBox 클릭 시 마우스 포지션 가져오기
두 포인트 사이에 거리 계산하기
MouseDown, MouseMove, MouseUp Event
마우스 다운 이벤트(picturebox1_MouseDown)에서의 시작 포인트( X1, Y1 ) 값과
마우스 업 이벤트(picturebox1_MouseUp)에서의 마지막 포인트( X2, Y2 ) 값을 통해
각 포인트 사이의 거리, 즉, 표시된 사각형의 대각선 길이를 구하는 코드이다.
두 포인트 사이의 거리는 우리가 잘 알고 있는 수학공식을 이용하여 계산하였다.
이를 코드로 나타내면 아래와 같다.
double distance = Math.Sqrt(Math.Pow((e.X - clickPoint.X), 2) + Math.Pow((e.Y - clickPoint.Y), 2));
그리고, 사각형을 그리기 위한 코드에서
시작 포인트와 마지막 포인트를 비교하여 X, Y 값이 작은 것을 기준으로 그려야 한다.
g.DrawRectangle(pn, e.X(두 포인트 중 작은 X), e.Y(두 포인트 중 작은 Y), w, h);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
private float zoomRatio = 1.0f;
private double recRatio = 3.6875;
private Point clickPoint;
private void picturebox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//마우스 버튼 다운 시 처음 시작 포인트 저장하기
clickPoint = new Point(e.X, e.Y);
}
picturebox1.Invalidate(); //다음 사각형 그리기 위해 Invalidate() 호출
}
private void picturebox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//움직일 때마다 포지션 값 라벨에 표시하기
lblPosition.Text = $"X : {e.X}, Y : {e.Y}";
Pen pn = new Pen(Color.Black); //라인을 그릴 펜
Graphics g = picturebox1.CreateGraphics(); //picturebox1에 대한 Graphics 생성
//사각형 그리기 (시작 포인트와 마지막 포인트에 따라 사각형 그리는게 달라짐)
float w = Math.Abs(clickPoint.X - e.X);
float h = Math.Abs(clickPoint.Y - e.Y);
if (e.X > clickPoint.X)
{
if (e.Y > clickPoint.Y) g.DrawRectangle(pn, clickPoint.X, clickPoint.Y, w, h);
else g.DrawRectangle(pn, clickPoint.X, e.Y, w, h);
}
else
{
if (e.Y > clickPoint.Y) g.DrawRectangle(pn, e.X, clickPoint.Y, w, h);
else g.DrawRectangle(pn, e.X, e.Y, w, h);
}
picturebox1.Invalidate(); //움직일때마다 사각형 새로 그려야 하므로 Invalidate() 호출
}
}
private void picturebox1_MouseUp(object sender, MouseEventArgs e)
{
Pen pn = new Pen(Color.Black); //라인을 그릴 펜
Graphics g = picturebox1.CreateGraphics(); //picturebox1에 대한 Graphics 생성
//사각형 그리기 (시작 포인트와 마지막 포인트에 따라 사각형 그리는게 달라짐)
float w = Math.Abs(clickPoint.X - e.X);
float h = Math.Abs(clickPoint.Y - e.Y);
if (e.X > clickPoint.X)
{
if (e.Y > clickPoint.Y) g.DrawRectangle(pn, clickPoint.X, clickPoint.Y, w, h);
else g.DrawRectangle(pn, clickPoint.X, e.Y, w, h);
}
else
{
if (e.Y > clickPoint.Y) g.DrawRectangle(pn, e.X, clickPoint.Y, w, h);
else g.DrawRectangle(pn, e.X, e.Y, w, h);
}
//대각선 거리 구하기
double distance = Math.Sqrt(Math.Pow((e.X - clickPoint.X), 2) + Math.Pow((e.Y - clickPoint.Y), 2));
distance = distance / recRatio; //실제 비율 맞추기
lblPosition.Text = $"DISTANCE={distance.ToString(".####")}mm";
}
|
cs |
728x90
반응형
'IT > C#' 카테고리의 다른 글
[C#] Unsafe Code 사용하기 (pointer 사용하기) (0) | 2019.11.29 |
---|---|
[C#] CultureInfo와 Resources File을 사용하여 Multi Language 다국어 지원하기 (2) | 2019.06.05 |
[C#] Picturebox 위에 Grid 격자 모눈종이 그리기 (0) | 2019.05.29 |
[C#][Database] Mysql Database 연결하기 (0) | 2019.05.27 |
[C#][Solved] System.ArgumentOutOfRangeException: 'InvalidArgument=Value of '-1' is not valid for 'index'. (0) | 2019.04.03 |