-
매핑 모드
- 쉽게 생각해 화면의 폭과 높이를 변경해 출력되도록 해주는 것
- 화면 확대 축소 구현 가능
- 축소 시 렌더링 결과가 소위 깨져 보일 수 있음 - 매핑 모드에 따라 화면 좌표계가 달라짐
- 기준 좌표의 위치를 조정해 변경할 수 있음
- 마이너스 위치에 렌더링 가능
- 스크롤 윈도우와 조합해 사용
화면은 사실 물리적인 모니터를 통해 보여지고, 논리적으로 보면 코드를 통해 보여진다.
매핑모드는 MM_TEXT모드가 기본이다.
로지컬한 부분과 피지컬한 부분으로 나뉜다.
Viewport는 눈에 보이는 영역
void CImgSampleView::OnPaint() { CPaintDC dc(this); // device context for painting CImageList list; list.Create(128, 128, ILC_COLOR32, 3, 0); list.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME)); list.Draw(&dc, 0, CPoint(50, 50), ILD_TRANSPARENT); CPoint ptTest(10, 10); dc.LPtoDP(&ptTest); //Logical 포인트를 디바이스포인트로 변환 CString tmp; tmp.Format(_T("X:%dm Y:%d"), ptTest.x, ptTest.y); dc.TextOut(30, 10, tmp); CPen penBlack(PS_SOLID, 3, RGB(0, 0, 0)); dc.SelectObject(&penBlack); dc.MoveTo(-1024, 0); dc.LineTo(1024, 0); dc.MoveTo(0, -768); dc.LineTo(0, 768); CPen penGray(PS_SOLID, 1, RGB(192, 192, 192)); dc.SelectObject(&penGray); dc.MoveTo(-1024 / 2, 10); dc.LineTo(1024 / 2, 10); dc.MoveTo(10, -768 / 2); dc.LineTo(10, 768 / 2); CPen pen(PS_SOLID, 5, RGB(192, 0, 0)); dc.SelectObject(&pen); dc.MoveTo(0,0); dc.LineTo(200, 200); }
dc.LPtoDP는 논리좌표를 장치좌표로 변환하는 것인데 MapMode를 설정하지않았기때문에 결과는 1:1매핑으로 동일하다.
검정선은 x축 -1024 ~ 1024까지, y축 -768 ~ 768 까지 긋는다.
dc.SetMapMode(MM_ANISOTROPIC); // 논리적 크기 dc.SetWindowExt(1024, 768); // 물리적 크기 dc.SetViewportExt(1024 * 2, 768 * 2);
SetMapMode 함수는 논리 좌표계와 장치 좌표계를 다르게 쓰겠다는것을 의미한다.
SetWindowExt는 논리 좌표계의 범위를 지정한 것으로, (1024 * 768)의 논리 좌표계를 쓴다는 것을 의미한다.
SetViewportExt는 장치 좌표계에서 얼마만큼의 크기로 보여줄 건지 설정하는것이다.
윈도우 영역
- DC의 기본 설정은 윈도우 크기와 영역 크기가 일치
- 영역을 벗어난 그리기는 모두 무시
- 이 특징을 이용해 고급 UI개발 가능
- Syntax coloring editor 개발 시 유용 - 최상위 프레임 윈도우의 영역을 변경할 경우 윈도우 모양이 달라질 수 있음
윈도우 영역은 객체화 돼있는데, MFC의 CRGN 클래스이다.
CRect 클래스를 이용해 사각형 두개를 왼쪽과 오른쪽으로 구분하여 만들었다.
CRgn은 영역을 구분하는 클래스이고, SelectClipRgn() 함수를 사용하면 지정된 영역 안에서만 글씨를 출력할 수 있다.
깜빡임 방지
- WM_ERASEBKGND 메시지 발생 시 배경을 덮어쓰며 이어지는 WM_PAINT 메시지 처리 시 새로 덧입혀지는 구조
- WM_ERASEBKGND 메시지 발생 시 기본 렌더링을 하지 않도록 변경해 개선 (return true) - 더블 버퍼링 기법을 적용해 손쉽게 해결 가능
- CBufferDC를 개발해 기존 CPaintDC를 대체
이미지를 처리해야할 양이 많아지면 깜박임 현상이 일어난다. 깜빡임 현상이 일어나는 이유는 화면을 갱신할때 배경을 먼저 지우고 이미지나 텍스트를 다시 그리기 때문이다. 더블 버퍼링은 메모리 DC에 그림을 다 그린다음 한번에 화면 DC에 블릿하는 것이다. 이러면 사용자는 중간 상태를 볼 수 없어서 깜빡임이 발생하지 않는다.
'MFC' 카테고리의 다른 글
사용자 입력 이벤트 처리 (0) 2025.04.18 GDI+ (0) 2025.04.17 비트맵 리소스 다루기 (0) 2025.04.15 글꼴과 문자열 출력 (0) 2025.04.14 렌더링 시점과 DC에 대한 이해 , RGB컬러 (0) 2025.04.14 - 쉽게 생각해 화면의 폭과 높이를 변경해 출력되도록 해주는 것