본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 7 GDI - 4 사용자 정의 선과 브러쉬


이번엔 사용자 정의 스타일의 선을 그어보는 순서.

 
기존의 코드를 좀 삭제하고 아래와 같이 코딩한다.

void CPenBrushDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
DWORD style[] = {6,3};
LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(255,0,0);


CPen NewPen;
NewPen.CreatePen(PS_GEOMETRIC | PS_USERSTYLE | PS_ENDCAP_FLAT, 10, &lb, 2, style);
CPen* pOldPen = dc.SelectObject(&NewPen);

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


dc.SelectObject(pOldPen);


}

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

이렇게 하면 6픽셀만큼 선이 그어지다가 3픽셀만큼 선이 그어지지 않는 사용자 정의의 선을 그을 수 있다.

 출력화면은 다음과 같다.



여기서 스타일 배열의 값을 바꾸어


DWORD style[] = {3, 6, 9}; 로 바꾸고

NewPen.CreatePen(PS_GEOMETRIC | PS_USERSTYLE | PS_ENDCAP_FLAT, 20, &lb, 3, style);

처럼 스타일 배열 적용 수를 3으로 바꾸어주면[선의 굵기가 얇아서 보기 힘드므로 굵기도 20으로 증가]




이런 식으로 출력되게 할 수도 있다.

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


다음으로 브러쉬에 관하여 알아보면


지금까지 그렸던 것 관련된 코드를 또 삭제[혹은 주석처리]하고 다음과 같이 코딩하여본다.




void CPenBrushDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting

CBrush NewBrush(HS_CROSS,RGB(192,0,0));               //브러쉬를 설정한다[빨간색 + 크로스 속성]
CBrush* pOldBrush = dc.SelectObject(&NewBrush);     //브러쉬를 적용시킨다.

dc.Rectangle(20,20,140,140); //브러쉬를 정한 후에 사각형 그리기

dc.SelectObject(pOldBrush);      //적용시켰던 브러쉬 위에 기본 브러쉬 상태를 덧씌운다.

dc.Rectangle(20,160,140,280); //브러쉬 오브젝트를 기본값으로 돌린 후에 사각형 그리기.


}

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

해석은 주석에 다 첨부되어있으므로 출력을 보자.

 

 

이렇게 기본 브러쉬는 아무것도 적용되지 않은 상태[채우는 방식이 없으므로 아무것도 속에 그려지지 않는 것]

인 것과 새 브러쉬를 적용한 것으로 출력된다.

이와같은 해치 브러시들은 다음과 같은 인덱스를 가진다. 라고 하려는데

속성마다 다 찍어줘야하는 불편함!




=====================================================================

이번에는 비트맵 파일을 이용한 패턴 브러시의 사용 법이다.

먼저 코드부터 보자.

void CPenBrushDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting


CBrush NewBrush; //비트맵 클래스 객체를 선언하여 비트맵 리소스 로딩

CBitmap Bmp;
Bmp.LoadBitmap(IDB_BITMAP1);
NewBrush.CreatePatternBrush(&Bmp);//로딩된 비트맵 리소스로 패턴 브러시 생성
CBrush* pOldBrush = dc.SelectObject(&NewBrush);

//클라이언트 뷰 클래스의 클라이언트 영역 크기를 알아내고 크기에 해당하는 네모를 그림

CRect Rect;
GetClientRect(&Rect);    //윈도우의 클라이언트 영역의 크기를 알아내는 함수
dc.Rectangle(&Rect);

dc.SelectObject(pOldBrush); // GDI 리소스 해제

}

실은 이 코드를 짜기전에 먼저 해야 할 것이 있는데

프로젝트가 속한 폴더의 RES폴더 안에다가 임의의 BMP파일을 집어넣고

리소스 뷰 -> 프로젝트명 우클릭 -> 추가 -> 리소스 -> bitmap 선택 -> 가져오기

를 통해서 이미지 파일을 불러와둬야 한다.

여튼 이렇게 코딩을 하면 

윈도우 내부 화면을 해당 이미지 패턴으로 꽉 채운 윈도우가 뜨게된다.



여기까지의 코딩 파일 업로드.