TN040: MFC/OLE en el lugar el tamaño y zoom

Esta nota se discutirán las cuestiones relativas a la para edición en el lugar y cómo un servidor debe lograr acercamiento correcto y el tamaño del lugar. Con la activación en el lugar, el concepto WYSIWYG es tomado un paso más en esa contenedores y servidores cooperarán entre sí y en particular interpretan la especificación OLE en gran parte de la misma manera.

Debido a la estrecha interacción entre un contenedor y un servidor que admita la activación en el lugar hay una serie de expectativas de los usuarios finales que deben mantenerse:

&Notanbsp;  Porque en lugar activación sólo se aplica a los elementos que están incrustados (no vinculados), sólo zoom se aplica a objetos incrustados. Verá API en COleServerDoc y COleServerItem que sirven para hacer zoom. La razón de esta dicotomía es que sólo las funciones que son válidas para los elementos vinculados e incrustados en COleServerItem (esto le permite tener una implementación común) y funciones que son válidas sólo para objetos incrustados se ubican en la clase COleServerDoc (desde la perspectiva del servidor, es el documento que está incrustado).

¿La mayoría de la carga se coloca en el implementador de servidor, el servidor debe ser conscientes del factor de zoom del contenedor y modificar su interfaz de edición según corresponda. Pero ¿cómo determina el factor de zoom que el contenedor está utilizando el servidor?

Compatibilidad con MFC para zoom

El factor de zoom actual puede determinarse mediante una llamada a COleServerDoc::GetZoomFactor. Llamar a esto cuando el documento no está activo en el lugar siempre resultará en un factor de zoom del 100% (o proporción 1:1). Llamándola mientras que en el lugar activo puede devolver algo diferente del 100 %.

Un ejemplo de zoom correctamente, vea el ejemplo de MFC OLE HIERSVR. Zoom en HIERSVR es complicado por el hecho de que muestra texto — y texto, en general, no escalar de manera lineal (consejos, convenciones tipográficas, diseño de alturas y anchos de complican el asunto). Aún, HIERSVR es una referencia razonable para aplicar zoom correctamente, y por eso el Tutorial de MFC a mano alzada (paso 7).

COleServerDoc::GetZoomFactor determina el factor de zoom basándose en un número de diferentes métricas disponibles desde el contenedor o la aplicación de las clases COleServerItem y COleServerDoc . En definitiva, el factor de zoom actual se determina mediante la siguiente fórmula

Posición rectángulo (PR) y medida de contenedor (CE)

El RECTÁNGULO de posición está determinado por el contenedor. Se devuelve al servidor durante la activación en el lugar cuando OnGetItemPosition se llama y se actualiza cuando el contenedor llama COleServerDoc::OnSetItemRects del servidor (con una llamada a COleClientItem::SetItemRects).

La medida del contenedor es ligeramente más compleja para calcular. Si el contenedor ha llamado COleServerItem::OnSetExtent (con una llamada a COleClientItem::SetExtent), entonces la medida del contenedor se convierte este valor en píxeles en función del número de píxeles por pulgada lógica. Si el contenedor no ha llamado SetExtent (que suele ser el caso), la medida del contenedor es el tamaño devuelto por COleServerItem::OnGetExtent. Por lo tanto, si el contenedor no ha llamado SetExtent, el marco se supone que si lo hiciera el contenedor habría llamó con 100% de la extensión natural (es decir, el valor devuelto por COleServerItem::GetExtent). O en otra forma, el marco se asume que el contenedor está mostrando 100% (ni más, ni menos) del elemento.

Es importante señalar que aunque COleServerItem::OnSetExtent y COleServerItem::OnGetExtent tienen nombres similares, no manipular el mismo atributo del elemento. OnSetExtent se denomina para permitir que el servidor sabe cuánto del objeto es visible en el contenedor (independientemente del factor de zoom) y OnGetExtent es el contenedor para determinar el tamaño ideal del objeto.

Mirando cada una de las APIs de aquí puede obtener una imagen más clara:

COleServerItem::OnGetExtent

Esta función debe devolver el "tamaño natural" en las unidades HIMETRIC del tema. La mejor manera de pensar en el "tamaño natural" es definir como el tamaño que puede aparecer cuando se imprima. El tamaño devuelto aquí es constante para un elemento determinado contenido (mucho como metarchivo, que es constante para un artículo concreto). Este tamaño no cambia cuando se aplica el zoom al elemento. Normalmente no cambia cuando el contenedor da el elemento más o menos espacio llamando a OnSetExtent. Un ejemplo de un cambio puede ser un editor de texto simple sin capacidad de "margen" que incluían texto basado en la última medida enviada por el contenedor. Si cambia un servidor, el servidor probablemente debe establecer la OLEMISC_RECOMPOSEONRESIZE de bits en el registro del sistema (consulte la documentación de OLE SDK para obtener más información sobre esta opción).

COleServerItem::OnSetExtent

Esta función se llama cuando el contenedor de muestra "más o menos" del objeto. Más contenedores no llamará esto en absoluto. La implementación predeterminada almacena el último valor recibido desde el contenedor en 'm_sizeExtent', que se utiliza en COleServerDoc::GetZoomFactor al calcular el valor de medida de contenedor descrito.

COleServerDoc::OnSetItemRects

Esta función se llama sólo cuando el documento activo en el lugar. Se llama cuando el contenedor actualiza la posición del elemento o el recorte aplicado al elemento. El RECTÁNGULO de posición, como se señaló anteriormente, proporciona el numerador para el cálculo del factor de zoom. Un servidor puede solicitar que se cambió la posición del elemento llamando a COleServerDoc::RequestPositionChange. El contenedor puede o no puede responder a esta solicitud llamando a OnSetItemRects (con una llamada a COleServerItem::SetItemRects).

COleServerDoc::OnDraw

Es importante darse cuenta de que el metarchivo creado mediante el reemplazo de COleServerItem::OnDraw produce exactamente el mismo metarchivo, independientemente de que el factor de zoom actual. El contenedor escalará el metarchivo según corresponda. Se trata de una distinción importante entre la vista OnDraw y del elemento del servidor OnDraw. Los controles de vista zoom, sólo crea el elemento un ampliable metarchivo y deja hasta el contenedor para hacer el zoom adecuado.

La mejor manera de asegurar que el servidor se comporta correctamente es utilizar la aplicación de COleServerDoc::GetZoomFactor si su documento es activo en el lugar.

Compatibilidad con MFC para cambiar el tamaño en el lugar

MFC plenamente implementa la interfaz de cambio de tamaño de in situ como se describe en la especificación OLE 2. La interfaz de usuario es apoyada por la clase COleResizeBar , un mensaje personalizado WM_SIZECHILDy tratamiento especial de este mensaje en COleIPFrameWnd.

Puede que desee implementar diferente manejo de este mensaje que lo previsto por el marco. Como se describió anteriormente, el marco deja los resultados de cambio de tamaño en el lugar hasta el contenedor, el servidor responde al cambio en el factor de zoom. Si el contenedor reacciona mediante el establecimiento de la medida de contenedor de ambos y redimensionar el RECTÁNGULO de posición durante el procesamiento de su IOleObject (llamado como resultado de una llamada a COleServerDoc::RequestPositionChange) y luego el lugar dará lugar a mostrar "más o menos" del elemento en la ventana de edición. Si el contenedor reacciona estableciendo sólo el RECTÁNGULO de posición durante el procesamiento de IOleObject, el factor de zoom cambiará y se mostrará el elemento "acercar o alejar".

Un servidor puede controlar (hasta cierto punto) lo que ocurre durante esta negociación. Por ejemplo una hoja de cálculo, puede elegir Mostrar celdas más o menos cuando el usuario cambia el tamaño de la ventana mientras se edita el elemento en el lugar. Un espaciado puede optar por cambiar los "márgenes de página", por lo que son las mismas que la ventana y reajustar el texto para el nuevo margen. Servidores implementan esto cambiando la medida natural (el tamaño devuelto desde COleServerItem::OnGetExtent) cuando se realiza el cambio de tamaño. Esto hará que el RECTÁNGULO de la posición y la medida del contenedor cambiar por la misma cantidad, resultando en el mismo factor de zoom, pero un mayor o menor área de visualización. Además, más o menos del documento será visible en el metarchivo generado por OnDraw. En este caso, el propio documento cambia cuando el usuario cambia el tamaño del elemento, en lugar de sólo en el área de visualización.

Puede implementar el tamaño personalizado y todavía aprovechar la interfaz de usuario proporcionada por COleResizeBar reemplazando el mensaje WM_SIZECHILD en la clase COleIPFrameWnd . Para obtener más información sobre las especificaciones de WM_SIZECHILD, ver 24 de nota técnica.

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index