본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 7 GDI - 3

이번엔 펜 관련 특화 글. 좀 길다.

지금까지 해왔듯이 이번에는 프로젝트명을 PenBrushDemo로 해서 만든다.

 


WM_PAINT 메시지 핸들러 함수인 OnPaint() 를 등록하고 다음과 같이 코딩한다.


/////////////////////////////////////////
void CPenBrushDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
CPen NewPen(PS_SOLID, 20, RGB(192,192,192));
CPen* pOldPen = dc.SelectObject(&NewPen);

//두께가 20픽셀인 선을 긋는다.
dc.MoveTo(40,40);//시작 좌표
dc.LineTo(240,40);// 끝 좌표


dc.SelectObject(pOldPen);   //기존값으로 변경.


//본래의 펜으로 동일한 선을 겹쳐 긋는다.
dc.MoveTo(40,40);//시작 좌표
dc.LineTo(240,40);// 끝 좌표


}

//////////////////////////////////////////////

 이렇게 코딩을 하고 출력을 하면

같은 위치에 굵기와 색이 다른 두 선이 그어진다.

또한 기본적으로 선 끝이 둥글게 설정되어 있으므로 출력 화면이 다음과 같이 나온다. 






자주 쓰이는 CPen() 함수의 원형을 보면 3가지로 다중정의 되어있는데 이걸 보면.


가장 많이 사용되는 함수는 두번째 원형이다. 

하지만 두번째의 경우 펜 스타일을 자동으로 코스메틱 펜스타일로 적용하기때문에 일부 펜 스타일을 적용해도 반영이 되지 않곤 한다.

다음열거된 스타일들은 두번째 원형 에서 반영이 되는 스타일들 이다.



선의 끝부분 처리에 따른 스타일들[ 이 부분을 사용하려면 지오메트릭 펜 스타일을 설정하여 펜 객체를 생성해야 한다. ]


볼 것도 다 봤으니. 이제 해당 속성들을 보고 코딩을 해보자.


void CPenBrushDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.

LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(192,192,192);

CPen arNewPen[4];
CPen* pOldPen = NULL;
arNewPen[0].CreatePen(PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_ROUND, 20, &lb);
arNewPen[1].CreatePen(PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_SQUARE, 20, &lb);
arNewPen[2].CreatePen(PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT, 20, &lb);
arNewPen[3].CreatePen(PS_GEOMETRIC | PS_NULL | PS_ENDCAP_ROUND, 20, &lb);
       //굵기는 20이지만 보이지 않는 선 [투명] 이기  때문에 출력화면에는 기본 스타일의 선 만 보이게 된다.


for(int i = 0; i < 4; ++i)
{
pOldPen = dc.SelectObject(&arNewPen[i]);
dc.MoveTo(40,40 * (i+1));
dc.LineTo(240,40 * (i+1)); //속성 변경 후 의 선 긋기 [굵은 선]

dc.SelectObject(pOldPen);

dc.MoveTo(40,40 * (i+1));
dc.LineTo(240,40 * (i+1)); //속성 변경 전 의 선 긋기.[작은 선]

arNewPen[i].DeleteObject(); //작업이 끝나면 정해둔 오브젝트를 삭제. 한다. 
//사용자 정의로 해둔걸 삭제해야 나중에 리소스로 인한 문제가 생기지 않기 때문이다.
}
}

/////////////////////////////////////////////////////

배열과 반복문을 통해 그리는 코드를 줄였음을 알 수 있다.

출력화면을 보자

/////////////////////////////////////////////////


 



/////////////////////////////////////////////////////

3가지 속성[선 끝 처리] 의 구별을 확연히 알 수 있으며

보이지 않는 선 [굵은선이지만 안보임. 마음의 눈으로 봐도 안보임] + 기본선

처리가 마지막 줄에 추가되어있다.[책에는 없음]

//////////////////////////////////////////////////////


여기까지의 코드 업로드[프로젝트 속에는 위와 아래의 선 긋기 코드가 다르므로 위의 코드는 주석처리 되어있다.]