일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C# MDB
- C# MDB Handle
- 디자인 패턴
- Excel Cell Format
- Cell Border Style
- C# 파일 암/복호화
- 공공 데이터 포털
- eventhandler
- WPF
- GDI+
- Winform
- MDB Select
- DrawRectangle
- c#
- 객체지향
- MDB Connect
- MVC
- delegate
- sqlite3
- solid
- 버스 API
- JSON
- TDD
- 경기도 버스정보시스템
- 경기도 버스
- 시
- Json.NET
- eventargs
- DrawEllipse
- NUnit
- Today
- Total
White Whale Studio
[GDI] C# GDI 탐구 - 마우스로 도형 그리기 - 1 본문
도형 그리는 방법을 알아보았으니 이제 마우스로 클릭해서 드래그하면 그릴 수 있는 프로그램을 만들어보겠습니다.
화면은 앞의 포스팅에서와 같고 panel의 속성 창에서 마우스 이벤트를 추가해 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private void panel1_MouseDown(object sender, MouseEventArgs e) { } private void panel1_MouseMove(object sender, MouseEventArgs e) { } private void panel1_MouseUp(object sender, MouseEventArgs e) { } | cs |
간략하게 설명을 해보면
Mouse Down : 시작 좌표를 설정하게 됩니다. 앞의 포스팅에서 언급한바와 같이 Rectangle을 그리려면 시작 좌표가 있어야 하므로..
Mouse Down과 동시에 해당 좌표를 가져와서 변수에 저장합니다.
MouseEventArgs 파라미터인 e에서 e.Location <- 요런식으로 위치를 가져옵니다.
또한 마우스가 Hold 됬다는 여부를 저장해야겠죠? bool 값인 isHold로 저장합니다.
MouseMove : 가장 까다로울 수도 있는 부분인데 이 부분에서는 지속적으로 크기가 변하는 사각형을 계속 그려주어야합니다.
마우스의 움직임에 따라서 사각형의 크기가 달라지니까 어찌보면 당연한 수순이겠죠?
그리는 도중이라면 isHold는 true입니다.
MouseUp : 그리기가 완료되는 시점입니다.
사각형의 크기가 정해지게 되는 지점이죠. Mouse Up 포인트를 가져와서 시작포인트와 비교하고
그 차이값(폭, 너비)를 사용해서 Rectangle을 지정할 수 있습니다.
마우스 사용을 다했으므로 isHold는 false 입니다.
자, 이제 순서대로 코딩을 해보겠습니다.
우선 Mouse Down부터
1 2 3 4 5 | private void panel1_MouseDown(object sender, MouseEventArgs e) { rect.Location = e.Location; isHold = true; } | cs |
위에서 언급한바와 같이 rectangle에 시작위치를 지정해줍니다. 그리고 isHold = true로 설정하죠.
true로 설정하지 않으면 클릭하지 않은 상태인 때도 계속 사각형을 그리게됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | private void panel1_MouseMove(object sender, MouseEventArgs e) { if (isHold) { int width = e.Location.X - rect.Location.X; int height = e.Location.Y - rect.Location.Y; rect.Width = width; rect.Height = height; panel1.Invalidate(); } } | cs |
다음은 MouseMove입니다.
Hold가 된 상태에서 시작 위치와 현재 마우스 포인트의 위치를 비교해가면서 Rectangle의 폭과 너비를 계산하고
invalidate로 계속 그려줍니다.
마지막으로 MouseUp입니다.
1 2 3 4 5 6 7 8 9 10 11 12 | private void panel1_MouseUp(object sender, MouseEventArgs e) { int width = e.Location.X - rect.Location.X; int height = e.Location.Y - rect.Location.Y; rect.Width = width; rect.Height = height; isHold = false; panel1.Invalidate(); } | cs |
마우스 업에서는 isHold를 false로 전환하여 그리기를 완료합니다.
일단 기본적인 구성은 위와 같구요.
만약 다른 도형을 그린다거나 하게 되면 추가적인 설정이 필요하겠군요.
다음포스팅에서는 저질러 놓은 버튼들을 마무리 해보겠습니다.
'IT Engineering > C#.net' 카테고리의 다른 글
[JSON] 기본적인 내용 (0) | 2016.08.09 |
---|---|
[GDI] C# GDI 탐구 - 마우스로 도형 그리기 - 2 (0) | 2016.08.03 |
[GDI] C# GDI 탐구 - 도형 그리기 (0) | 2016.08.03 |
[GDI] C# GDI 탐구 - 시작 (0) | 2016.07.12 |
Delegate & Event / 델리게이트와 이벤트 (0) | 2016.06.23 |