Поделиться через


TN040: В- Размещение MFC/OLE изменения размеров и увелича

ПримечаниеПримечание

Следующая техническая заметка не была обновлена со времени сначала была включена в подключенной документации.В результате некоторые процедуры и разделы могут оказаться устаревшей или неверны.Последние новости, рекомендуется поиск раздела процента в подключенном индексу документации.

Эта заметка будет согласовывать проблемы, связанные с редактирования на месте и как сервер должен выполнить правильное увеличение и размер на месте.С помощью встроенной активацией, понятию режим WYSIWYG предпринимают меры один более дальнейший в том, что контейнеры и серверы кооперируют друг с другом и, в частности интерпретирует спецификация OLE в основном так же способом.

Из-за ближайшего взаимодействия между контейнером и встроенной активацией сервера, поддерживающий несколько ожиданностей от пользователя, который должен быть поддерживается:

  • Отображение представления (метафайл, нарисованный в переопределенном методе COleServerItem::OnDraw ) должен выглядеть в точности так же, как когда оно будет отображается для редактирования (за исключением того, что изменения не виден tools).

  • Если контейнер может увеличиваться, окно сервера слишком!

  • Является и контейнером, и сервер должны отображать объекты для редактирования, используя такие же показатели.Это означает использование режима сопоставления, основанный на количестве логически пикселей на дюйм — физических точек на дюйм отрисовки на устройстве отображения.

ПримечаниеПримечание

Так как встроенная активация применяется только к элементам, которые внедрены (не связана), увеличащ применяется только к внедренным объектам.Вы получат API в обоих COleServerDoc и COleServerItem, которые используются для увеличения.Причина этой дихотомии, что только функции, допустимые для связанных и внедренных элементов в COleServerItem (это позволяет иметь общую реализацию) и функциях, допустимо только для внедренных объектов находятся в классе COleServerDoc (с точки зрения сервера это document, которое внедрено).

Большая часть тяготы размещена на разработчик сервера, в котором сервера необходимо знать о фактора масштаба контейнера и изменяет его интерфейс редактирования.Но, как сервер определяет коэффициент масштабирования, что контейнер использует?

Поддержка MFC для увеличения

Текущий коэффициент масштабирования можно определить путем вызова COleServerDoc::GetZoomFactor.При вызове этого, если документ не является активным на месте всегда приводит к появлению факторе масштаба 100% (отношение 1:1).Извлечение мая вызывать его во время активного встроенного значение, отличное от 100%.

Пример увеличить правильно см. в примере MFC GlobalUnlock OLE.Увеличить HIERSVR осложнял факт, который отображает текст и текст, как правило, не масштабируется в линейном способом (подсказки, типографские соглашения, ширины и высоты всех конструкций осложняют дело).Тем не менее, HIERSVR рациональная ссылку для реализации увеличить правильно, и поэтому MFC (учебника по РИСОВАННАЯ КРИВАЯ шаге 7).

COleServerDoc::GetZoomFactor задает коэффициент масштабирования на основе несколько метрик или другого доступного из контейнера или от реализации собственных классов COleServerItem и COleServerDoc.Иными словами, текущий коэффициент масштабирования задается следующей формулой:

Position Rectangle (PR) / Container Extent (CE)

ПРЯМОУГОЛЬНИК ПОЗИЦИИ указанным контейнером.Возвращения на сервер в ходе встроенной активации, если COleClientItem::OnGetItemPosition вызывается и обновляется, когда контейнер вызовет COleServerDoc::OnSetItemRects сервера (с вызовом COleClientItem::SetItemRects).

Экстент КОНТЕЙНЕРА немного более сложна для вычисления.Если контейнер, называемого COleServerItem::OnSetExtent (с вызовом COleClientItem::SetExtent), то экстент КОНТЕЙНЕРА это значение, преобразованное с точками на основе количества точек на дюйм логические.Если контейнер не вызвал SetExtent (который обычно регистра), то экстент КОНТЕЙНЕРА размер, возвращенный из COleServerItem::OnGetExtent.Поэтому, если контейнер не вызвал SetExtent, то границы предполагают, если они делают, то контейнер, называемого его с 100% естественной области памяти (значения, получаемого из COleServerItem::GetExtent).Заявил различными способами, структура предполагается, что контейнер отображается 100% (не менее, нет) из элемента.

Важно отметить, что хотя COleServerItem::OnSetExtent и COleServerItem::OnGetExtent имеют аналогичные имена, они не обрабатывают тот же атрибут элемента.OnSetExtent вызывается, чтобы сервер знать, сколько из объекта отображаются в контейнере (независимо от масштабирования фактора) и OnGetExtent называется контейнером для определения оптимального размера объекта.

Каждый из API, просмотрев включен, можно получить более четкое изображение.

COleServerItem::OnGetExtent

Эта функция должна возвращать «естественный размер в единицах HIMETRIC элемента.Лучшим способом представить «естественных size» определить его в качестве размера оно может появиться при печати.Размер возвращенный здесь константу для содержимого элемента частности (подобно метафайл, являются константами для указанного элемента).Этот размер не изменяет увелича применяет к элементу.Обычно он не изменяется, когда контейнер предоставляет элемент больше или меньше места путем вызова OnSetExtent.Пример изменения может быть одним из простого текстового редактора без возможности «поля», которая создавала программу-оболочку текста на основе последней отправленной области памяти контейнером.Если сервер изменяется, сервер должен установить бит, скорее всего OLEMISC_RECOMPOSEONRESIZE в системном реестре (см. ЯВЛЯЕТСЯ документации пакета SDK для получения дополнительных сведений об этом параметре).

COleServerItem::OnSetExtent

Эта функция вызывается, когда контейнер означает «больше» или из объекта.Для большинства контейнеров, не вызывают это вообще.Реализация по умолчанию сохраняет последнее значение, полученное из контейнера «m_sizeExtent», который используется в COleServerDoc::GetZoomFactor вычислении значения ОБЛАСТИ КОНТЕЙНЕРА, описанной выше.

COleServerDoc::OnSetItemRects

Эта функция вызывается, только если активный документ на месте.Она вызывается, когда контейнер обновляет любые положения или отсечение элемента, применяемые к элементу.ПРЯМОУГОЛЬНИК ПОЗИЦИИ, как описано выше, обеспечивает числитель для вычисления фактора увеличения.Сервер может запросить положение элемента изменялась путем вызова COleServerDoc::RequestPositionChange.Контейнер может и не может ответить на запрос путем вызова данного OnSetItemRects (с вызовом COleServerItem::SetItemRects).

COleServerDoc::OnDraw

Важно понимать, что метафайл, созданный путем переопределения COleServerItem::OnDraw создает один и тот же метафайла, независимо от того, какой фактора увеличения.Контейнер масштабирует метафайл.Это важное различие между OnDraw представления и OnDraw элемента сервера.Представление обрабатывает увеличить элемент просто создает zoomable метафайл и оставляет его до контейнера, чтобы сделать соответствующий увеличить.

Лучший способ гарантировать, что сервер работает правильно использовать реализацию COleServerDoc::GetZoomFactor если документ активный на месте.

Поддержка MFC для изменения размеров на месте

MFC полностью реализует интерфейс на месте изменения размеров, как описано в спецификации OLE 2.Интерфейс пользователя поддерживается классом COleResizeBar, сообщением WM_SIZECHILD пользовательские и специальным обработку этого сообщения в COleIPFrameWnd.

Можно реализовать обработку этого сообщения, чем другой, что предоставлен средой выполнения.Как описано выше, границы отображаются результаты на месте до изменения размеров контейнера — сервер реагирует на изменения в факторе увеличения.Если контейнер реагирует путем установки и экстент КОНТЕЙНЕРА и ПРЯМОУГОЛЬНИК ПОЗИЦИИ во время обработки его COleClientItem::OnChangeItemPosition (вызванного в результате вызова метода COleServerDoc::RequestPositionChange), то размер по месту приведет к отображению «или» из нескольких элементов в окне редактирования.Если контейнер реагирует только устанавливать ПРЯМОУГОЛЬНИК ПОЗИЦИИ во время обработки, то коэффициент масштабирования COleClientItem::OnChangeItemPosition изменится и будет отображаться элемент «увеличить или out».

Сервер может отслеживать (в некоторой степени), что происходит во время этих согласования.Электронная таблица, например можно избрать, чтобы показать больше или меньше ячеек, когда пользователь изменяет размер окна во время редактирования на месте элемента.Текстовый редактор может избрать, чтобы изменить «поля страницы» поэтому они совпадают, как окна и rewrap текст с новыми полями.Серверы, реализующие данное изменение естественная область памяти (размер, возвращенный из COleServerItem::OnGetExtent), если размер организуется.Это вызовет и ПРЯМОУГОЛЬНИК ПОЗИЦИИ и экстент КОНТЕЙНЕРА изменить то же величину, что приводит к тому, что один и тот же факторе масштаба, однако большую или меньшую область обзора.Кроме того, больше или из документа будут отображены в созданном OnDraw метафайле.В этом случае сам документ изменяется, когда пользователь изменяет размер элемента, а не просто области просмотра.

Можно реализовать пользовательский изменения размеров и по-прежнему использовать пользовательский интерфейс, предоставляемый COleResizeBar путем переопределения сообщение WM_SIZECHILD в классе COleIPFrameWnd.Дополнительные сведения об особенностях WM_SIZECHILD см. в разделе Техническая примечание 24.

См. также

Другие ресурсы

Технические замечания по номеру

Технические замечания по категориям