안녕하세요. 명월입니다.
이번 포스팅에서는 GDI 좌표계에 대해 알아 보겠습니다. 물론 좌표계에 대해서는 C# 뿐만 아니라 윈도우 프로그래밍을 사용하는것은 같은 좌표계를 사용합니다.
수학에서는 음수가 없는 좌표 기준(0,0)을 왼쪽 하단으로 계산을 합니다. 그러나 윈도우 에서는 왼쪽 상단이 기준으로 움직입니다. 문론 이 위치는 윈도우 전체에 해당이 됩니다. 즉 모니터 기준으로 가장 왼쪽,상단 픽셀이 (0,0)이 되겠습니다. 역시 설명 보다는 예제가 이해하기 빠르겠습니다.
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
namespace Blog20121001_0_
{
class Program : Form
{
static void Main(string[] args)
{
Application.Run(new Program());
}
public Program()
{
this.Load += new EventHandler(Program_Load);
}
void Program_Load(object sender, EventArgs e)
{
this.Location = new Point(0, 0);
}
}
}
결과 화면 보면 윈도우 창이 모니터의 왼쪽 상단에서 생성이 됩니다.
두번째 예제 입니다.
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
namespace Blog20121001
{
class FormClass :Form
{
static void Main(string[] args)
{
Application.Run(new FormClass());
}
private float x;
private float y;
private float x_;
private float y_;
private Timer tm;
private Graphics g;
private float angle;
private float width = 200;
public FormClass()
{
this.Size = new Size(500, 500);
g = this.CreateGraphics();
this.x = ClientRectangle.Width / 2;
this.y = ClientRectangle.Height / 2;
tm = new Timer();
tm.Interval = 1;
tm.Enabled = true;
tm.Tick += new EventHandler(tm_Tick);
}
void tm_Tick(object sender, EventArgs e)
{
angle++;
float radian = (float)(Math.PI / 180) * angle;
this.x_ = x + (width * (float)Math.Sin(radian));
this.y_ = y - (width * (float)Math.Cos(radian));
g.DrawLine(new Pen(Color.Black), x, y, x_, y_);
}
}
}
DrawLine 의 (0,0)에서 윈도우 크기 너비,높이 길이의 위치 까지 Line을 그리는 것입니다.
위 화면을 보면 x좌표는 수학의 수직선과 비슷하게 왼쪽에서 오른쪽으로 증감형태인데 y축은 아래에서 위로 증가되는 형태가 아닌 위에서 아래로 증가되는 형태입니다.다음은 삼각함수를 이용한 예제입니다.
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
namespace Blog20121001
{
class FormClass :Form
{
static void Main(string[] args)
{
Application.Run(new FormClass());
}
private float x;
private float y;
private float x_;
private float y_;
private Timer tm;
private Graphics g;
private float angle;
private float width = 200;
public FormClass()
{
this.Size = new Size(500, 500);
g = this.CreateGraphics();
this.x = ClientRectangle.Width / 2;
this.y = ClientRectangle.Height / 2;
tm = new Timer();
tm.Interval = 1;
tm.Enabled = true;
tm.Tick += new EventHandler(tm_Tick);
}
void tm_Tick(object sender, EventArgs e)
{
angle++;
float radian = (float)(Math.PI / 180) * angle;
this.x_ = x + (width * (float)Math.Sin(radian));
this.y_ = y - (width * (float)Math.Cos(radian));
g.DrawLine(new Pen(Color.Black), x, y, x_, y_);
}
}
}
위 식은 직접 윈도우 프로그램 하나 만들고 돌려보면 금방 알 수 있는 부분이긴 합니다만, 항상 윈도우 컨트롤 만들 때마다 헤갈리는 부분이기도 합니다. 참고사항으로 포스팅했습니다.
첨부파일 :Blog20121001.zip
'Development note > C#' 카테고리의 다른 글
[C#] 파일 다운로드 예제 - 서버 폼 초기화, 이벤트 (0) | 2013.02.26 |
---|---|
[C#] 파일 다운로드 예제 - 소켓 부품 만들기 (0) | 2013.02.25 |
[C#] 파일 다운로드 예제- 화면 설계 (2) | 2013.02.24 |
[C#] AxWebBrowser 로 자동 로그인 소스 (웹 스크래핑) (9) | 2012.10.23 |
[C#] 확장형 브라우져 컨트롤 AxWebBrowser Extended Browser control(확장형 webbrowser) (5) | 2012.10.22 |
[C#] 웹서버 개발하기 (0) | 2012.10.15 |
[C#] 스니퍼 (2) | 2012.10.09 |
[C#] 비프음 (0) | 2012.10.06 |