- 윈도우 영역
- 윈도우 영역의 구분
- 클라이언트(Client) 영역
- 비클라이언트(Non-client) 영역
- TextRgn 예제
- 별도의 영역 만들기 - CreateRectRgnIndirect()
- 인자로 주어진 RECT 구조체의 정보를 근거로 새로운 윈도우 영역을 생성
- CreateRectRgn()
- CreateRectRgnIndirect()와 동일하지만 RECT 구조체의 주소가 아니라 네 개의 int형 값을 받으며, 각각은 사각형을 그리기 위한 좌표
- SelectClipRgn()
- 인자로 주어진 CRgn 클래스 객체로 윈도우 영역을 변경
- SelectClipRgn() 함수 호출 코드를 수행한 직후에는 특정 영역을 벗어난 그리기 결과는 화면에 출력되지 않음
- SelectClipRgn(NULL) 코드로써 영역해제
- FrameRgn 예제
- 영역을 조합하기 - CombineRgn()
- 두 영역을 조합한다.
- RGN_XOR, RGN_OR, RGN_AND, RGN_DIFF, RGN_COPY 등이 있다.
- SetWindowRgn()
- 윈도우 자체의 영역을 바꾼다.
- 반면에 SelectClipRgn()함수는 CDC 클래스의 멤버로 윈도우 자체의 영역을 변경하는 것이 아니라 그리기 결과가 출력되는 DC의 영역을 일시적으로 변경한다.
- 메인 프레임 윈도우는 응용 프로그램에서 최상위 부모 윈도우가 되므로 이 윈도우의 영역을 변경하면 자식 윈도우들에게도 직접적으로 영향을 주게 된다.
- 그리기(Drawing) 모드
- 펜을 이용한 그리기 코드를 실행할 때 출력 대상인 화면 DC의 이미지와 펜이 그린 이미지를 어떻게 조합할 것인지 설정 - DrawModeDemo 예제
- SetCapture()
- 마우스가 해당 윈도우를 벗어나도 메시지를 받을 수 있다.
- GetCapture()
- 마우스를 캡쳐하고 있는 윈도우의 핸들을 리턴한다.
- 캡쳐하는 윈도우가 없으면 NULL
- ReleaseCapture()
- 캡쳐 해제
- SetROP2()
- DC의 그리기 모드를 변경
- http://www.duncom.co.kr/asp/Function/SetROP2.htm
- 매핑(Mapping) 모드
- 좌표계 변경 - MapModeDemo 예제
- SetMapMode()
- 매핑모드 변경
- 인자로 새 매핑 모드 값을 받고 기존 매핑 모드 값을 반환
- http://www.winapi.co.kr/reference/Function/SetMapMode.htm
- SetWindowExt()
- 윈도우와 연결된 DC의 논리적인 폭과 높이를 설정
- SetViewportExt()
- 뷰포트의 크기를 설정
- SetWindowExt()함수로 DC의 크기를 가로/세로 100으로 설정했는데 뷰포트의 크기를 가로/세로 300으로 했다면 300% 확대하는 이치
- SetViewportOrg()
- 물리적으로 (0, 0)에 해당하는 좌표를 설정
- 기본 값은 (0, 0) (왼쪽 위 구석)
- SetViewportOrg(300, 300)으로 설정했다면 왼쪽 위 구석은 (-300, -300)이 됨
- 프린터 출력
- 기본적으로 모니터 출력과 프린터 출력은 크게 다르지 않다
- MFC의 문서/뷰(Document/View) 구조를 통한 구현
함수명
설명
OnPaint() 모니터 화면에 출력
OnPrint() 프린터에 출력 OnDraw() 모니터 화면과 프린터 모두에 출력
- 프린터 출력과 상관없는 화면 출력은 OnPaint() 함수를 이용하는 것이 MFC가 권고하는 프로그래밍 기법
- 관련 함수들
- IsPrinting()
- CDC 클래스의 메서드로서 DC가 프린터 DC인지 아닌지를 BOOL형으로 반환
- 문서/뷰 구조의 SDI 형식의 프로젝트 생성 시 기본 재정의 함수들
- OnPreparePrinting()
- 프린터 출력에 앞서 인쇄 대화 상자를 출력하기 직전에 호출
- DoPreparePrinting() 함수를 호출하여 인쇄 대화 상자가 화면에 나타남
- 프린터 출력에 앞서 인쇄할 전체 문서의 길이가 얼마나 되는지 계산하는 코드가 주로 들어감
- CPrintInfo 구조체의 멤버 중에 SetMaxPage() 함수를 통해 출력 문서의 전체 길이 설정 가능
- OnBeginPrinting()
- 문서 출력 시작 시점에 호출
- OnEndPrinting()
- 문서 출력 완료 시점에 호출
- MFC의 프린터 출력 구조
void CTextRgnView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
//임의의 두 사각형을
//각기 다른 색상(붉은색과 회색)으로 칠한다.
CRect rectLeft = CRect(50, 50, 250, 150);
CRect rectRight = CRect(250, 50, 450, 150);
dc.FillSolidRect(&rectLeft, RGB(192, 0, 0));
dc.FillSolidRect(&rectRight, RGB(192, 192, 192));
//앞서 만든 두 사각형을 별도의 영역으로 만든다.
CRgn rgnLeft, rgnRight;
rgnLeft.CreateRectRgnIndirect(rectLeft);
rgnRight.CreateRectRgnIndirect(rectRight);
LOGFONT lf;
::ZeroMemory(&lf, sizeof(lf));
lf.lfHeight = 72;
wsprintf(lf.lfFaceName, _T("%s"), _T("Arial Black"));
CFont NewFont;
NewFont.CreateFontIndirect(&lf);
CFont* pOldFont = dc.SelectObject(&NewFont);
dc.SetBkMode(TRANSPARENT);
//dc.TextOut(60, 65, TEXT("TEST STRING"));
//왼쪽 영역을 선택하여 문자열을 출력한다.
dc.SetTextColor(RGB(192, 192, 192));
dc.SelectClipRgn(&rgnLeft);
dc.TextOut(60, 65, TEXT("TEST STRING"));
//오른쪽 영역을 선택하여 문자열을 출력한다.
dc.SetTextColor(RGB(192, 0, 0));
dc.SelectClipRgn(&rgnRight);
dc.TextOut(60, 65, TEXT("TEST STRING"));
//영역해제
dc.SelectClipRgn(NULL);
dc.SelectObject(pOldFont);
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndStatusBar.Create(this))
{
TRACE0("상태 표시줄을 만들지 못했습니다.\n");
return -1; // 만들지 못했습니다.
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
// 두 영역 및 조합된 영역을 주어진 좌표로 생성한다.
m_RgnRect1.CreateRectRgn(0, 0, 100, 100);
m_RgnRect2.CreateRectRgn(70, 70, 170, 170);
// 이 영역은 조합된 결과가 저장될 영역이므로 좌표는 의미가 없다.
m_RgnTotal.CreateRectRgn(0, 0, 0, 0);
// 두 영역을 조합한 새로운 영역을 만든다.
m_RgnTotal.CombineRgn(&m_RgnRect1, &m_RgnRect2, RGN_XOR);
// 조합된 영역이 CMainFrame 윈도우의 영역이 되도록 한다.
SetWindowRgn((HRGN)m_RgnTotal, TRUE);
return 0;
}