본문 바로가기

프로그래밍/VC/VC.NET/Cs

윈도우 그래픽 프로그래밍 OnDraw

(환경 : VS 2005에서 실행하였다.)

간단하게 프로젝트에서 Line 이란 프로젝트를 생성한다.
single document로 생성.

그중 view 클래스에서 OnDraw함수를 찾는다.
CLineView::OnDraw() . 이넘이 실질적으로 윈도우에 그림을 뿌려준다...

code
----------------------------------------------------------------
void CLineView::OnDraw(CDC* pDC)
{
 CLineDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;

 // TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
 CPen penRed(PS_SOLID,0,RGB(255,0,0));
 CPen penGreen(PS_DASH,0,RGB(0,255,0));
 CPen penBlue(PS_DOT,0,RGB(0,0,255));

 CPen *ppenOld;
 ppenOld = pDC->SelectObject(&penRed);
 
 pDC->MoveTo(10,10);
 pDC->LineTo(100,150);

 pDC->SelectObject(&penGreen);
 pDC->MoveTo(100,10);
 pDC->LineTo(190,150);

 pDC->SelectObject(&penBlue);
 pDC->MoveTo(190,10);
 pDC->LineTo(280,150);

 pDC->SelectObject(ppenOld);

}
-----------------------------------------------------
간단히 살펴보자.
먼저 그래픽을 출력시킬려면, GDI 오브젝트를 생성해야 한다
이 오브젝트는 생성자를 이용할 수도 있고, CreatePen() 함수를 이용해도 된다.

CPen redPen(PS_SOLID,0,RGB(255,0,0));

적색펜을 생성했다. 이런 생성자를 초기화를 이용하지 않을시에는

CPen penRed; 먼저 생성하고
penRed.CreatePen(PS_SOLID,0,RGB(255,0,0));

이렇게 CreatePen 함수를 이용해도 된다.
여기서 PS_SOLID는  실선을 나타낸다. 이외에도 PS_DOT,PS_DASH,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL등이 있다.
두번째인자 0 은 펜의 두께를 나타내게 되는데, 가장 작은것이 0, 그외의 숫자는 픽셀값이 된다.
0은 하드웨어가 나타낼수 있는 가장 작은 단위인데, 1과 별반 차이가 없다.

GDI오브젝트를 생성했으면 그 오브젝트를 DC에 선태해서 넣으면된다.
이때 CDC의 SelectObject함수를 이용한다.
이넘은 GDI오브젝트를 DC에 선택하는 함수라 DC가 가진 GDI의 포인터를 돌려준다.
즉, 새로운 브러시를 선택을 하게되면, 이전의 브러시 포인터를 리턴한다.
이함수에는

CPen* CDC::SelectObject(CPen* pPen);
CBrush* CDC::SelectObject(CBrush* pBrush);
CBitmap* CDC::SelectObject(CBitmap* pBitmap);

함수가 오버로딩 되어있다.

DC에 오브젝트를 선택해 넣었으면, 그리기를 하면된다.
이후에는 다시 SelectObject를 이용 GDI오브젝트를 원상 복구한다.

사용자 삽입 이미지