TN040: MFC/OLE no local redimensionamento e zoom

Observação:

A seguinte nota técnica não foi atualizada desde que foi incluída pela primeira vez na documentação online.sistema autônomo resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.Para obter informações mais recentes, é recomendável que você procurar o tópico de interesse no índice de documentação online.

Esta nota aborda os problemas relacionados à edição in-loco e como um servidor deve fazer zoom correto e redimensionamento no local.Com a ativação in-loco, o conceito WYSIWYG será realizado uma etapa posterior em que recipientes e cooperam uns com os outros servidores e em particular interpretam a especificação de OLE em grande parte da mesma forma.

Devido a estreita interação entre um contêiner e o servidor que ofereça suporte a ativação in-loco há um número das expectativas do usuário participante que deve ser mantida:

  • A exibição de apresentação (o metarquivo desenhado no COleServerItem::OnDraw Substituir) deve exatamente a mesma aparência sistema autônomo ele é desenhado para edição (exceto que ferramentas de edição não estejam visíveis).

  • Quando aplica zoom no contêiner, a janela do servidor deve muito!

  • O contêiner e o servidor devem exibir objetos para edição usando as métricas do mesmas.Isso significa usar um modo de mapeamento de acordo com o número de lógica pixels por mover-se pouco a pouco — não físicas pixels por mover-se pouco a pouco, durante a renderização no dispositivo de vídeo.

Observação:

Como a ativação no local aplica-se apenas a itens que são incorporados (vinculados), aplicando zoom só se aplica aos objetos incorporados.Você verá APIs em ambos COleServerDoc e COleServerItem que são usados para aumentar o zoom. A razão para este dicotomia é que apenas as funções que são válidas para os itens vinculados e incorporados estão em COleServerItem (Isso permite que você possui uma implementação comum) e funções que são válidas somente para objetos incorporados estão localizadas na COleServerDoc classe (da perspectiva do servidor, ele é o document qual é incorporado).

A maioria da carga é colocada no implementador de servidor em que o servidor deve estar ciente de fator de aplicar aplicar zoom do contêiner e modificar sua interface de edição conforme apropriado.Mas como o servidor determina o fator de aplicar aplicar zoom que o contêiner está usando?

Suporte a MFC para zoom

O fator de aplicar aplicar zoom corrente pode ser determinado chamando COleServerDoc::GetZoomFactor. Chamar isso quando o documento não está ativo no local sempre resultará em um fator de aplicar aplicar zoom de 100 % (ou proporção de 1: 1).Chamá-lo enquanto ativo no local pode retornar algo diferente de 100 %.

Para obter um exemplo do zoom corretamente, consulte o MFC OLE amostra HIERSVR.Aumentar o zoom HIERSVR é complicado pelo fato de que exibe texto e texto, em geral, não é dimensionado de maneira linear (dicas, convenções tipográficas, design larguras e alturas complicar a questão).Ainda assim, HIERSVR é uma referência razoável para a implementação de zoom corretamente, podendo assim ser o tutorial do MFC RABISCO (etapa 7).

COleServerDoc::GetZoomFactor Determina o fator de aplicar aplicar zoom de acordo com um número de métricas diferentes disponível a partir do contêiner ou da implementação de seu COleServerItem e COleServerDoc classes. Em resumo, o fator de aplicar aplicar zoom corrente é determinado pela seguinte fórmula:

Position Rectangle (PR) / Container Extent (CE)

O retângulo POSITION é determinado pelo contêiner.É retornado para o servidor durante a ativação in-loco quando COleClientItem::OnGetItemPosition é chamado e é atualizado quando o contêiner chama o servidor COleServerDoc::OnSetItemRects (com uma telefonar para COleClientItem::SetItemRects).

A extensão de contêiner é um pouco mais complexa para calcular.Se o contêiner tiver chamado COleServerItem::OnSetExtent (com uma telefonar para COleClientItem::SetExtent), então a extensão de contêiner é esse valor convertida em pixels com base no número de pixels por mover-se pouco a pouco lógica. Se o contêiner não tiver chamado SetExtent (que é geralmente o caso), a extensão de contêiner é o dimensionar retornado de COleServerItem::OnGetExtent. Portanto, se o contêiner não tiver chamado SetExtent, a estrutura pressupõe que se tinha o contêiner seria ter chamado-lo com 100 % da extensão natural (o valor retornado de COleServerItem::GetExtent).Declarado de outra forma, a estrutura pressupõe que o contêiner está exibindo 100 % (sem mais, inferior) do item.

É importante observar que, embora COleServerItem::OnSetExtent e COleServerItem::OnGetExtent tenham nomes semelhantes, eles não manipular o mesmo atributo do item. OnSetExtent chamado para permitir que o servidor sabe quanto do objeto é visível no recipiente (independentemente do fator de aplicar aplicar zoom) e OnGetExtent é chamado pelo contêiner para determinar o dimensionar ideal do objeto.

Ao examinar cada uma das APIs envolvidas, você pode obter uma imagem mais clara:

COleServerItem::OnGetExtent

Esta função deve retornar "dimensionar natural" em HIMETRIC unidades do item.A melhor maneira de "dimensionar natural" é para defini-lo sistema autônomo o dimensionar pode aparecer quando impresso.O dimensionar retornado aqui é constante para um determinado item Sumário (muito como metarquivo, que é constante para um item específico).Esse dimensionar não alterar quando a ampliação é aplicada ao item.Ele geralmente não alterar quando o contêiner oferece o item mais ou menos espaço chamando OnSetExtent. Um exemplo de uma alterar pode ser que um editor de texto simples, sem recurso de "margem" disposto o texto com base na última extensão enviada pelo contêiner.Se um servidor alterar, o servidor provavelmente deve conjunto OLEMISC_RECOMPOSEONRESIZE bit no registro do sistema (consulte a documentação do OLE SDK para obter mais informações sobre essa opção).

COleServerItem::OnSetExtent

Esta função é chamada quando o contêiner mostra "mais ou menos" do objeto.A maioria dos recipientes não chamará isso em todos os.A implementação padrão armazena o último valor recebido do contêiner em 'm_sizeExtent', que é usado em COleServerDoc::GetZoomFactor ao calcular o valor de extensão de CONTAINER descrito acima.

COleServerDoc::OnSetItemRects

Essa função é chamada somente quando o documento estiver ativo no local.Ele é chamado quando o contêiner atualiza a posição do item ou recorte aplicado ao item.RETÂNGULO POSITION, sistema autônomo discutido acima, fornece o numerador para o cálculo do fator de aplicar aplicar zoom.Um servidor pode solicitar que a posição do item seja alterado chamando COleServerDoc::RequestPositionChange. O contêiner pode ou não pode responder a essa solicitação chamando OnSetItemRects (com uma telefonar para COleServerItem::SetItemRects).

COleServerDoc::OnDraw

É importante perceber que o metarquivo criado pela substituição de COleServerItem::OnDraw produz exatamente o mesmo metarquivo, independentemente do fator de aplicar aplicar zoom corrente. O contêiner dimensionará o metarquivo sistema autônomo apropriado.Esta é uma distinção importante entre OnDraw e o item de servidor OnDraw. As alças de modo de exibição de zoom, o item apenas cria um zoomable metarquivo e deixa-a até o contêiner para fazer zoom apropriado.

A melhor maneira de garantir que seu servidor se comportará corretamente é usar a implementação de COleServerDoc::GetZoomFactor Se o documento estiver ativo no local.

Suporte a MFC para redimensionamento no local

MFC totalmente implementa a interface de redimensionamento no local conforme descrito na especificação OLE 2.A interface do usuário é suportada pelo COleResizeBar classe, uma mensagem personalizada WM_SIZECHILDe tratamento especial desta mensagem em COleIPFrameWnd.

É aconselhável implementar diferente tratar essa mensagem diferente do que é fornecido pela estrutura.Conforme descrito acima, a estrutura deixa sistema autônomo resultados de redimensionamento no local até o contêiner — o servidor responde a alterar no fator de aplicar aplicar zoom.Se o contêiner reage por configuração o tanto contêiner extensão POSITION retângulo durante o processamento de sua COleClientItem::OnChangeItemPosition (chamado sistema autônomo resultado de uma telefonar para COleServerDoc::RequestPositionChange) e, em seguida, redimensionar in-loco resultará em mostrando "mais ou menos" do item na janela de edição. Se o contêiner reage definindo apenas o retângulo POSITION durante o processamento de COleClientItem::OnChangeItemPosition, o fator de aplicar aplicar zoom será alterado e será mostrado o item "ampliado check-in ou check-out".

Um servidor pode controlar (em algum grau), o que acontece durante essa negociação.Por exemplo, uma planilha, pode decidir mostrar mais ou menos células quando o usuário redimensiona a janela ao editar o item no local.Um processador de texto pode optar por alterar "sistema autônomo margens da página" para que são o mesmo que a janela e quebrar o texto para a nova margem.Implementar servidores isso alterando a extensão natural (o dimensionar retornado de COleServerItem::OnGetExtent) quando o redimensionamento é concluído. Isso fará com que o retângulo POSITION e extensão contêiner para alterar o mesmo valor, resultando no mesmo fator de aplicar aplicar zoom, mas um maior ou menor área de visualização.Além disso, mais ou menos do documento ficará visível no metarquivo gerado por OnDraw. Nesse caso, o próprio documento está sendo alterado quando o usuário redimensiona o item, em vez de apenas a área de visualização.

Você pode implementar redimensionamento personalizado e ainda aproveitar a interface do usuário fornecida pelo COleResizeBar substituindo o WM_SIZECHILD mensagem no seu COleIPFrameWnd classe. Para obter mais informações sobre as especificidades de WM_SIZECHILD, see Observação técnica 24.

Consulte também

Outros recursos

Notas técnicas por número

Notas técnicas por categoria