이번엔 펜 관련 특화 글. 좀 길다.
지금까지 해왔듯이 이번에는 프로젝트명을 PenBrushDemo로 해서 만든다.
WM_PAINT 메시지 핸들러 함수인 OnPaint() 를 등록하고 다음과 같이 코딩한다.
/////////////////////////////////////////
//////////////////////////////////////////////
이렇게 코딩을 하고 출력을 하면
같은 위치에 굵기와 색이 다른 두 선이 그어진다.
또한 기본적으로 선 끝이 둥글게 설정되어 있으므로 출력 화면이 다음과 같이 나온다.
자주 쓰이는 CPen() 함수의 원형을 보면 3가지로 다중정의 되어있는데 이걸 보면.
가장 많이 사용되는 함수는 두번째 원형이다.
하지만 두번째의 경우 펜 스타일을 자동으로 코스메틱 펜스타일로 적용하기때문에 일부 펜 스타일을 적용해도 반영이 되지 않곤 한다.
다음열거된 스타일들은 두번째 원형 에서 반영이 되는 스타일들 이다.
선의 끝부분 처리에 따른 스타일들[ 이 부분을 사용하려면 지오메트릭 펜 스타일을 설정하여 펜 객체를 생성해야 한다. ]
볼 것도 다 봤으니. 이제 해당 속성들을 보고 코딩을 해보자.
/////////////////////////////////////////////////////
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가지 속성[선 끝 처리] 의 구별을 확연히 알 수 있으며
보이지 않는 선 [굵은선이지만 안보임. 마음의 눈으로 봐도 안보임] + 기본선
처리가 마지막 줄에 추가되어있다.[책에는 없음]
//////////////////////////////////////////////////////
여기까지의 코드 업로드[프로젝트 속에는 위와 아래의 선 긋기 코드가 다르므로 위의 코드는 주석처리 되어있다.]
'공부 > MFC' 카테고리의 다른 글
Visual C++ 2008 MFC Chapter 7 GDI - 5 도형 그리기 (2) | 2011.12.02 |
---|---|
Visual C++ 2008 MFC Chapter 7 GDI - 4 사용자 정의 선과 브러쉬 (0) | 2011.12.01 |
Visual C++ 2008 MFC Chapter 7 GDI - 2 (0) | 2011.12.01 |
Visual C++ 2008 MFC Chapter 7 GDI - 1 (0) | 2011.12.01 |
Visual C++ 2008 MFC Chapter 6 마우스 입력 - 3 (4) | 2011.11.30 |