뷰에 그리기
애플리케이션의 거의 모든 그리기가 뷰의 멤버 함수에서 발생하므로 뷰 클래스에서 재정의 OnDraw
해야 합니다. (예외는 에 설명된 마우스 그리기입니다 .보기를 통해 사용자 입력 해석.) 재정의 OnDraw
:
제공하는 문서 멤버 함수를 호출하여 데이터를 가져옵니다.
프레임워크가 전달하는 디바이스 컨텍스트 개체의 멤버 함수를 호출하여 데이터를 표시합니다
OnDraw
.
문서의 데이터가 어떤 식으로든 변경되면 변경 내용을 반영하도록 뷰를 다시 그려야 합니다. 일반적으로 이 문제는 사용자가 문서의 보기를 통해 변경할 때 발생합니다. 이 경우 뷰는 문서의 UpdateAllViews 멤버 함수를 호출하여 동일한 문서의 모든 보기에 자신을 업데이트하도록 알립니다. UpdateAllViews
는 각 보기의 OnUpdate 멤버 함수를 호출합니다 . 기본 구현은 OnUpdate
뷰의 전체 클라이언트 영역을 무효화합니다. 문서의 수정된 부분에 매핑되는 클라이언트 영역의 영역만 무효화하도록 재정의할 수 있습니다.
UpdateAllViews
클래스 CDocument
의 멤버 함수와 OnUpdate
클래스 CView
의 멤버 함수를 사용하면 문서의 수정된 부분을 설명하는 정보를 전달할 수 있습니다. 이 "힌트" 메커니즘을 사용하면 뷰를 다시 그려야 하는 영역을 제한할 수 있습니다. OnUpdate
는 두 개의 "힌트" 인수를 사용합니다. LPARAM 형식의 첫 번째 lHint를 사용하면 원하는 모든 데이터를 전달할 수 있으며, *형식CObject
의 두 번째 pHint에서는 파생된 CObject
개체에 대한 포인터를 전달할 수 있습니다.
보기가 잘못되면 Windows에서 WM_PAINT 메시지를 보냅니다. 뷰의 On그림판 처리기 함수는 C그림판DC 클래스의 디바이스 컨텍스트 개체를 만들어 메시지에 응답하고 뷰의 OnDraw
멤버 함수를 호출합니다. 일반적으로 재정 OnPaint
의 처리기 함수를 작성할 필요가 없습니다.
디바이스 컨텍스트는 디스플레이 또는 프린터와 같은 디바이스의 그리기 특성에 대한 정보를 포함하는 Windows 데이터 구조입니다. 모든 그리기 호출은 디바이스 컨텍스트 개체를 통해 이루어집니다. 화면에 OnDraw
그리기 위해 개체가 CPaintDC
전달됩니다. 프린터에서 그리기 위해 현재 프린터에 대해 설정된 CDC 개체를 전달합니다.
뷰에서 그리기 코드는 먼저 문서에 대한 포인터를 검색한 다음 디바이스 컨텍스트를 통해 그리기 호출을 합니다. 다음 간단한 OnDraw
예제에서는 프로세스를 보여 줍니다.
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString s = pDoc->GetData(); // Returns a CString
CRect rect;
GetClientRect(&rect);
pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
}
이 예제에서는 함수를 GetData
파생 문서 클래스의 멤버로 정의합니다.
이 예제에서는 문서에서 가져오는 문자열을 보기 가운데에 인쇄합니다. 화면 그리기를 호출하는 OnDraw
경우 pDC에 전달된 개체는 생성자가 이미 호출BeginPaint
한 개체입니다CPaintDC
.CDC
그리기 함수에 대한 호출은 디바이스 컨텍스트 포인터를 통해 이루어집니다. 디바이스 컨텍스트 및 그리기 호출에 대한 자세한 내용은 MFC 참조 및 창 개체 작업에서 클래스 CDC를 참조하세요.
작성하는 OnDraw
방법에 대한 자세한 예제는 MFC 샘플을 참조 하세요.