TN040: MFC/OLE 내부 크기 조정 및 확대/축소

참고 항목

다음 기술 노트는 온라인 설명서에 먼저 포함되어 있었으므로 업데이트되지 않았습니다. 따라서 일부 절차 및 항목은 만료되거나 올바르지 않을 수 있습니다. 최신 정보를 보려면 온라인 설명서 색인에서 관심 있는 항목을 검색하는 것이 좋습니다.

이 참고에서는 현재 위치 편집과 관련된 문제 및 서버에서 올바른 확대/축소 및 현재 위치 크기 조정을 수행하는 방법에 대해 설명합니다. 현재 위치 정품 인증을 사용하면 컨테이너와 서버가 서로 협력하고 특히 OLE 사양을 거의 동일한 방식으로 해석한다는 측면에서 WYSIWYG 개념은 한 단계 더 발전합니다.

현재 위치 정품 인증을 지원하는 컨테이너와 서버 간의 긴밀한 상호 작용으로 인해 최종 사용자에게는 다음과 기본 많은 기대가 있습니다.

  • 프레젠테이션 표시(재정의에 COleServerItem::OnDraw 그려진 메타파일)는 편집용으로 그릴 때와 똑같아야 합니다(편집 도구가 표시되지 않음 제외).

  • 컨테이너가 확대/축소되면 서버 창도 확대되어야 합니다.

  • 컨테이너와 서버 모두 동일한 메트릭을 사용하여 편집할 개체를 표시해야 합니다. 즉, 디스플레이 디바이스에서 렌더링할 때 인치당 실제 픽셀이 아닌 인치당 논리적 픽셀 수에 따라 매핑 모드를 사용합니다.

참고 항목

현재 위치 활성화는 포함된 항목(연결되지 않음)에만 적용되므로 확대/축소는 포함된 개체에만 적용됩니다. 확대/축소에 사용되는 API가 둘 다 COleServerDocCOleServerItem 표시됩니다. 이 이분법의 이유는 연결된 항목과 포함된 항목 COleServerItem 모두에 유효한 함수만 있고(이를 통해 공통 구현을 수행할 수 있음) 포함된 개체에 대해서만 유효한 함수가 클래스에 COleServerDoc 있기 때문입니다(서버의 관점에서 볼 때 포함된 문서 임).

서버에서 컨테이너의 확대/축소 요소를 인식하고 편집 인터페이스를 적절하게 수정해야 하므로 대부분의 부담은 서버 구현자에 있습니다. 그러나 서버에서 컨테이너가 사용하는 확대/축소 비율은 어떻게 결정하나요?

확대/축소에 대한 MFC 지원

현재 확대/축소 비율은 호출 COleServerDoc::GetZoomFactor하여 확인할 수 있습니다. 문서가 현재 위치에 있지 않을 때 이를 호출하면 항상 100% 확대/축소 비율(또는 1:1 비율)이 발생합니다. 현재 위치 활성 상태에서 호출하면 100% 이외의 항목이 반환할 수 있습니다.

올바르게 확대/축소하는 예제는 MFC OLE 샘플 HIERSVR을 참조하세요. HIERSVR의 확대는 텍스트를 표시하고 텍스트는 일반적으로 선형 방식으로 확장되지 않는다는 사실에 의해 복잡합니다(힌트, 입력 규칙, 디자인 너비 및 높이는 모두 문제를 복잡하게 만듭니다). 그러나 HIERSVR은 확대/축소를 올바르게 구현하기 위한 적절한 참조이며 MFC 자습서 SCRIBBLE (7단계)도 마찬가지입니다.

COleServerDoc::GetZoomFactor는 컨테이너 또는 사용자 및 COleServerDoc 클래스의 구현 COleServerItem 에서 사용할 수 있는 다양한 메트릭을 기반으로 확대/축소 인수를 결정합니다. 즉, 현재 확대/축소 비율은 다음 수식에 따라 결정됩니다.

Position Rectangle (PR) / Container Extent (CE)

POSITION RECTANGLE은 컨테이너에 의해 결정됩니다. 호출되는 경우 현재 위치 활성화 중에 서버로 반환되며 컨테이너가 서버를 COleServerDoc::OnSetItemRects 호출할 때COleClientItem::OnGetItemPosition(호출을 사용하여COleClientItem::SetItemRects) 업데이트됩니다.

CONTAINER EXTENT는 계산하기 위해 약간 더 복잡합니다. 컨테이너가 호출 COleServerItem::OnSetExtent 된 경우(호출을 사용하여 COleClientItem::SetExtent) CONTAINER EXTENT는 논리 인치당 픽셀 수에 따라 픽셀로 변환되는 값입니다. 컨테이너가 SetExtent(일반적으로 해당)를 호출하지 않은 경우 CONTAINER EXTENT는 반환되는 COleServerItem::OnGetExtent크기입니다. 따라서 컨테이너가 SetExtent를 호출하지 않은 경우 프레임워크는 컨테이너가 호출한 경우 자연 범위의 100%(반환된 COleServerItem::GetExtent값)로 호출했을 것이라고 가정합니다. 또 다른 방법으로 프레임워크는 컨테이너가 항목의 100%(더 이상 더 이상 표시되지 않음)를 표시한다고 가정합니다.

이름이 비슷하지만 COleServerItem::OnSetExtentCOleServerItem::OnGetExtent 항목의 동일한 특성을 조작하지는 않는다는 점에 유의해야 합니다. OnSetExtent 는 확대/축소 비율에 관계없이 컨테이너에 표시되는 개체의 양을 서버에 알리기 위해 호출되며 OnGetExtent 개체의 이상적인 크기를 결정하기 위해 컨테이너에서 호출됩니다.

관련된 각 API를 살펴보면 더 명확한 그림을 얻을 수 있습니다.

COleServerItem::OnGetExtent

이 함수는 항목의 HIMETRIC 단위로 "자연 크기"를 반환해야 합니다. "자연 크기"를 생각하는 가장 좋은 방법은 인쇄 시 나타날 수 있는 크기로 정의하는 것입니다. 여기에 반환되는 크기는 특정 항목 내용에 대한 상수입니다(메타파일과 유사하며 특정 항목에 대한 상수임). 확대/축소가 항목에 적용될 때는 이 크기가 변경되지 않습니다. 컨테이너가 항목을 호출 OnSetExtent하여 더 많거나 적은 공간을 제공하는 경우 일반적으로 변경되지 않습니다. 변경의 예는 컨테이너에서 보낸 마지막 익스텐트를 기반으로 텍스트를 래핑하는 "여백" 기능이 없는 간단한 텍스트 편집기일 수 있습니다. 서버가 변경되는 경우 서버는 시스템 레지스트리에서 OLEMISC_RECOMPOSEONRESIZE 비트를 설정해야 합니다(이 옵션에 대한 자세한 내용은 OLE SDK 설명서 참조).

COleServerItem::OnSetExtent

이 함수는 컨테이너에 개체의 "더 많거나 적은"이 표시되면 호출됩니다. 대부분의 컨테이너는 이를 전혀 호출하지 않습니다. 기본 구현은 컨테이너에서 받은 마지막 값을 'm_sizeExtent'에 저장합니다. 이 값은 위에서 설명한 CONTAINER EXTENT 값을 계산할 때 사용됩니다 COleServerDoc::GetZoomFactor .

COleServerDoc::OnSetItemRects

이 함수는 문서가 현재 위치 활성 상태인 경우에만 호출됩니다. 컨테이너가 항목의 위치 또는 항목에 적용된 클리핑을 업데이트할 때 호출됩니다. 위에서 설명한 것처럼 POSITION RECTANGLE은 확대/축소 비율 계산을 위한 숫자기를 제공합니다. 서버는 호출 COleServerDoc::RequestPositionChange을 통해 항목 위치 변경을 요청할 수 있습니다. 컨테이너는 호출 OnSetItemRectsCOleServerItem::SetItemRects사용하여 이 요청에 응답하거나 응답하지 않을 수 있습니다.

COleServerDoc::OnDraw

현재 확대/축소 비율에 관계없이 생성을 재정의 COleServerItem::OnDraw 하여 만든 메타파일이 정확히 동일한 메타파일을 생성한다는 것을 깨닫는 것이 중요합니다. 컨테이너는 메타파일의 크기를 적절하게 조정합니다. 이는 보기 OnDraw 와 서버 항목 간의 중요한 차이점입니다 OnDraw. 보기는 확대/축소를 처리하고 항목은 확대/축소 가능한 메타파일만 만들고 컨테이너에 그대로 두어 적절한 확대/축소를 수행합니다.

서버가 올바르게 동작하도록 보장하는 가장 좋은 방법은 문서가 현재 위치 활성 상태인지의 COleServerDoc::GetZoomFactor 구현을 사용하는 것입니다.

현재 위치 크기 조정에 대한 MFC 지원

MFC는 OLE 2 사양에 설명된 대로 현재 위치 크기 조정 인터페이스를 완전히 구현합니다. 사용자 인터페이스는 클래스, 사용자 지정 메시지 WM_SIZECHILD 및 이 메시지의 특수 처리에서 COleIPFrameWnd지원 COleResizeBar 됩니다.

프레임워크에서 제공하는 것과는 다른 이 메시지 처리를 구현할 수 있습니다. 위에서 설명한 대로 프레임워크는 컨테이너까지 현재 위치 크기 조정의 결과를 남깁니다. 서버는 확대/축소 비율의 변경에 응답합니다. 컨테이너가 컨테이너를 처리하는 COleClientItem::OnChangeItemPosition 동안 컨테이너 EXTENT 및 POSITION RECTANGLE을 모두 설정하여 반응하는 경우(호출 COleServerDoc::RequestPositionChange의 결과로 호출됨) 내부 크기 조정으로 인해 편집 창에 항목의 "더 많거나 적은"이 표시됩니다. 컨테이너가 처리 COleClientItem::OnChangeItemPosition중에 POSITION RECTANGLE을 설정하여 반응하는 경우 확대/축소 인수가 변경되고 항목이 "확대/축소됨"으로 표시됩니다.

서버는 이 협상 중에 발생하는 작업을 어느 정도 제어할 수 있습니다. 예를 들어 스프레드시트는 사용자가 현재 위치에서 항목을 편집하는 동안 창의 크기를 조정할 때 더 많거나 적은 셀을 표시하도록 선택할 수 있습니다. 워드 프로세서는 창과 같도록 "페이지 여백"을 변경하고 텍스트를 새 여백으로 다시 래프하도록 선택할 수 있습니다. 서버는 크기 조정이 완료되면 자연 익스텐트(반환된 COleServerItem::OnGetExtent크기)를 변경하여 이를 구현합니다. 이렇게 하면 POSITION RECTANGLE과 CONTAINER EXTENT가 동일한 양만큼 변경되어 확대/축소 계수는 같지만 보기 영역은 더 크거나 작습니다. 또한 문서에 의해 생성된 OnDraw메타파일에서 더 많거나 적은 수의 문서가 표시됩니다. 이 경우 사용자가 보기 영역이 아닌 항목의 크기를 조정할 때 문서 자체가 변경됩니다.

사용자 지정 크기 조정을 구현하고 클래스에서 WM_SIZECHILD 메시지를 재정의하여 제공된 COleResizeBar 사용자 인터페이스를 계속 활용할 수 있습니다 COleIPFrameWnd . WM_SIZECHILD 세부 사항에 대한 자세한 내용은 Technical Note 24를 참조하세요.

참고 항목

번호별 기술 참고 사항
범주별 기술 참고 사항