Cette note va discuter les questions relatives à l'édition sur place et comment un serveur doit accomplir un zoom correct et redimensionnement en place. Avec l'activation sur place, le concept de WYSIWYG est pris un peu plus loin dans cette conteneurs et serveurs de coopèrent les uns avec les autres et en particulier interprètent la spécification OLE dans une grande partie de la même manière.
Il y a un certain nombre d'attentes de l'utilisateur final qui doit être maintenu en raison de l'interaction étroite entre un conteneur et le serveur soutenant l'activation sur place:
&Notenbsp ; Parce que l'activation sur place ne s'applique qu'aux éléments qui sont incorporés (non liées), zoom s'applique uniquement aux objets incorporés. Vous verrez des API dans COleServerDoc et de COleServerItem qui est utilisés pour zoomer. La raison de cette dichotomie est que seules les fonctions qui sont valides pour les objets liés et incorporés sont COleServerItem (cela vous permet d'avoir une mise en commun) et les fonctions qui sont valides uniquement pour les objets incorporés sont situées dans la classe COleServerDoc (du point de vue du serveur, c'est le document qui est incorporé).
La plupart de la charge est placé sur la mise en oeuvre de serveur, dans la mesure où le serveur doit être au courant du facteur de zoom du conteneur et modifier son interface d'édition comme il convient. Mais comment le serveur détermine-t-il le facteur de zoom qui utilise le conteneur?
Prise en charge MFC pour zoomer
Le facteur de zoom actuel peut être déterminé en appelant COleServerDoc::GetZoomFactor. Cet appel lorsque le document n'est pas active en place entraînera toujours à un facteur de zoom de 100 % (ou ratio 1:1). Il appelle alors que l'actif en place peut retourner quelque chose autre que 100 %.
Pour obtenir un exemple de zoomer correctement, consultez l'exemple MFC OLE HIERSVR. Zoom dans HIERSVR est compliquée par le fait qu'il affiche le texte — et le texte, en général, ne pas à l'échelle de façon linéaire (conseils, conventions typographiques, conception toutes les largeurs et hauteurs de compliqueraient l'affaire). Encore, HIERSVR est une référence raisonnable pour la mise en œuvre de zoomer correctement, ainsi que le tutoriel MFC GRIFFONNAGE (étape 7).
COleServerDoc::GetZoomFactor détermine le facteur de zoom basé sur un certain nombre de différents paramètres disponibles auprès du conteneur ou de la mise en œuvre de vos classes COleServerItem et COleServerDoc . En bref, le facteur de zoom actuel est déterminé par la formule suivante
Position Rectangle (PR) / récipient mesure (CE)
Le RECTANGLE de la POSITION est déterminé par le conteneur. Il est retourné au serveur pendant l'activation sur place lorsque COleClientItem::OnGetItemPosition est appelée et est mis à jour lorsque le conteneur appelle COleServerDoc::OnSetItemRects du serveur (avec un appel à COleClientItem::SetItemRects).
CE conteneur est légèrement plus complexe à calculer. Si le conteneur a appelé COleServerItem::OnSetExtent (avec un appel à COleClientItem::SetExtent), puis la mesure contenant cette valeur est convertie en pixels selon le nombre de pixels par pouce logique. Si le conteneur n'a pas appelé SetExtent (qui est généralement le cas), la mesure du conteneur est la taille retournée par COleServerItem::OnGetExtent. Ainsi, si le conteneur n'a pas appelé SetExtent, le cadre suppose que si elle l'a fait le conteneur aurait appelé il avec 100 % de l'étendue naturelle (la valeur retournée par COleServerItem::GetExtent). Ou autrement dit, le cadre suppose que le conteneur affiche 100 % (pas plus, pas moins) de l'élément.
Il est important de noter que, bien que COleServerItem::OnSetExtent et COleServerItem::OnGetExtent ont des noms semblables, ils manipuler pas le même attribut de l'élément. OnSetExtent est appelé pour informer le serveur combien de l'objet est visible dans le conteneur (indépendamment du facteur de zoom) et OnGetExtent est appelé par le conteneur afin de déterminer la taille idéale de l'objet.
En examinant chacun des API en cause ici, vous pouvez obtenir une image plus claire:
COleServerItem::OnGetExtent
Cette fonction doit renvoyer la « taille naturelle » en unités HIMETRIC de l'élément. La meilleure façon de penser de la taille du « naturelle » est de le définir comme la taille, qu'il peut apparaître lors de l'impression. La taille retournée est ici constante pour le contenu d'un élément particulier (un peu comme le métafichier, qui est constant pour un élément particulier). Cette taille ne change pas lorsque le zoom est appliqué à l'élément. Il ne modifie généralement pas le lorsque le conteneur donne le point de l'espace plus ou moins en appelant OnSetExtent. Un exemple d'un changement pourrait être celle d'un éditeur de texte simple avec aucune capacité de « marge » encapsulé texte basé sur la dernière mesure envoyée par le conteneur. Si un serveur ne change pas, le serveur doit définir probablement le OLEMISC_RECOMPOSEONRESIZE bit dans le Registre système (voir la documentation du SDK OLE pour plus d'informations sur cette option).
COleServerItem::OnSetExtent
Cette fonction est appelée lorsque le conteneur montre « plus ou moins » de l'objet. Plupart des conteneurs pas appelle cela du tout. L'implémentation par défaut enregistre la dernière valeur reçue du conteneur dans « m_sizeExtent », qui est utilisé en COleServerDoc::GetZoomFactor lors du calcul de la valeur de mesure de conteneur décrite ci-dessus.
COleServerDoc::OnSetItemRects
Cette fonction est appelée uniquement lorsque le document est actif sur place. Elle est appelée lorsque le conteneur met à jour la position de l'élément ou le détourage appliqué à l'élément. Le RECTANGLE de POSITION, comme nous l'avons vu, prévoit le numérateur pour le calcul de facteur de zoom. Un serveur peut demander que la position de l'élément soit changé en appelant COleServerDoc::RequestPositionChange. Le conteneur peut ou peut ne pas répondre à cette demande en appelant OnSetItemRects (avec un appel à COleServerItem::SetItemRects).
COleServerDoc::OnDraw
Il est important de réaliser que le métafichier créé par substitution de COleServerItem::OnDraw produit exactement le même métafichier, peu importe du facteur de zoom actuel. Le conteneur sera à l'échelle le métafichier comme il convient. Il s'agit d'une distinction importante entre la vue OnDraw et l'élément serveur OnDraw. Les poignées de vue Zoom, l'élément crée juste une zoomable metafile et laisse le récipient pour faire le zoom approprié.
La meilleure façon de s'assurer que votre serveur se comporte correctement est d'utiliser la mise en œuvre de COleServerDoc::GetZoomFactor si votre document est actif sur place.
Prise en charge MFC pour redimensionner en Place
MFC implémente entièrement l'interface de redimensionnement en place tel que décrit dans la spécification OLE 2. L'interface utilisateur est pris en charge par la classe COleResizeBar , un message personnalisé WM_SIZECHILDet spéciale de ce message de COleIPFrameWnd.
Vous pouvez mettre en œuvre différent traitement de ce message que ce qui est fourni par le framework. Comme décrit ci-dessus, le cadre laisse les résultats en place redimensionnement jusqu'au conteneur — le serveur répond au changement du facteur de zoom. Si le conteneur réagit en définissant les deux mesure de conteneur et RECTANGLE de POSITION au cours du traitement de ses COleClientItem::OnChangeItemPosition (appelé d'un appel à COleServerDoc::RequestPositionChange) puis la place redimensionner entraînera montrant "plus ou moins" de l'élément dans la fenêtre d'édition. Si le conteneur réagit en définissant simplement le RECTANGLE de POSITION au cours du traitement de COleClientItem::OnChangeItemPosition, le facteur de zoom va changer et que l'élément sera affiché « zoomée dans ou à l'extérieur. »
Un serveur peut contrôler (dans une certaine mesure) ce qui se passe au cours de cette négociation. Par exemple, une feuille de calcul, pourrait choisir de montrer les cellules plus ou moins lorsque l'utilisateur redimensionne la fenêtre lors de la modification de l'élément en place. Un faut pourrait choisir de changer les « marges de la page » ils sont les mêmes que la fenêtre et réajuste le texte de la nouvelle marge. Serveurs implémentent cela en changeant la mesure naturelle (la taille retournée à partir de COleServerItem::OnGetExtent) quand le redimensionnement est terminée. Cela entraînera le RECTANGLE de la POSITION et l'étendue du conteneur de changer par la même quantité, ce qui a entraîné le même facteur de zoom, mais une plus grande ou plus petite zone d'affichage. En outre, plus ou moins du document sera visible dans le métafichier généré par OnDraw. Dans ce cas, le document lui-même change lorsque l'utilisateur redimensionne le point, au lieu de simplement la zone d'affichage.
Vous pouvez appliquer le redimensionnement personnalisé et toujours tirer parti de l'interface utilisateur fournie par COleResizeBar en substituant le message WM_SIZECHILD dans votre classe de COleIPFrameWnd . Pour plus d'informations sur les spécificités de la WM_SIZECHILD, consultez Technical Note 24.
&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie