TN040: MFC/OLE на месте изменения размера и масштаба

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

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

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

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

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

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

Пример масштабирования неправильно содержится пример MFC OLE HIERSVR. Масштабирование в HIERSVR осложняется тем, что он отображает текст, и текст, в общем, не масштабируется линейно (подсказки, типографские соглашения, дизайн, ширина и высота осложнить вопрос). Тем не менее, HIERSVR является разумной отправной точкой для реализации масштабирование правильно, и поэтому учебник MFC КАРАКУЛИ (шаг 7).

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

Положение прямоугольника (PR) / контейнер степени (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 пункта. Лучший способ думать о «естественной размер» должен определить его как размер, который может показаться при печати. Возвращенный размер здесь постоянно для конкретного элемента содержимого (так же, как метафайла, который является константой для конкретного элемента). Этот размер не изменяется, когда масштабирование применяется к элементу. Она обычно не изменяет когда контейнер элемента более или менее пространства путем вызова OnSetExtent. В качестве примера изменения может быть простой текстовый редактор с не «маржа» возможностями, которые завернуты текст, основанный на последней степени, посланные в контейнере. Если изменить сервер, сервер возможно установить OLEMISC_RECOMPOSEONRESIZE бит в системном реестре (см. документацию OLE 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.

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

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

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

Технические примечания по номеру |nbsp; Технические примечания по категориям

Index