TN040: MFC/OLE in-loco 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.Como resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.As informações mais recentes, é recomendável que você procure o tópico de interesse no índice de documentação on-line. |
Esta Observação Abordaremos os problemas relacionados à edição in-loco e como um servidor deve realizar zoom corretos e redimensionamento no lugar.Com a ativação in-loco, conceito WYSIWYG é realizado uma etapa posterior que recipientes e servidores cooperam uns com os outros e interpretam especificamente a especificação OLE praticamente da mesma maneira.
Devido a interação entre um contêiner e um servidor que ofereça suporte a ativação in-loco há um número de expectativas do usuário final que deve ser mantida:
A exibição da apresentação (o metarquivo desenhado na COleServerItem::OnDraw substituir) deve ser exatamente o mesmo como quando ele é desenhado para edição (exceto que ferramentas de edição não são visíveis).
Quando o contêiner zooms, a janela do servidor deve muito!
O contêiner e o servidor devem exibir objetos para edição usando a mesma métrica.Isso significa que usando um modo de mapeamento com base no número de lógica pixels por polegada — não físicas pixels por polegada, quando o dispositivo de exibição de processamento.
Observação |
---|
Porque a ativação in-loco só se aplica a itens que são incorporados (não vinculados), zoom só se aplica aos objetos incorporados.Você verá APIs em ambos os COleServerDoc e COleServerItem que são usados para aumentar o zoom.O motivo dessa dicotomia é que apenas as funções que são válidas para os itens vinculados e incorporados são em COleServerItem (Isso permite que você tenha 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, é o document que está incorporado). |
Maior parte da carga é colocada no implementador de servidor em que o servidor deve estar atento ao fator de zoom do contêiner e modificar sua interface de edição conforme apropriado.Mas como o servidor determinar o fator de zoom usando o contêiner?
Suporte a MFC para zoom
O fator de zoom atual pode ser determinado chamando COleServerDoc::GetZoomFactor.Chamar isso quando o documento não está ativo no local sempre resultará em um fator de zoom de 100% (ou proporção 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 exemplo HIERSVR.O zoom HIERSVR é complicado pelo fato de que exibe texto e texto, em geral, não é dimensionado de forma linear (dicas, convenções tipográficas, design larguras e alturas complicar a questão).Ainda assim, HIERSVR é uma referência razoável para implementar corretamente o zoom, e então é o Tutorial do MFC RABISCO (etapa 7).
COleServerDoc::GetZoomFactorDetermina o fator de zoom com base em um número de métricas diferentes disponíveis do recipiente ou da implementação de seu COleServerItem e COleServerDoc classes.Em suma, o fator de zoom atual é determinado pela seguinte fórmula:
Position Rectangle (PR) / Container Extent (CE)
O retângulo posição é determinado pelo contêiner.Ele é 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 chamada para COleClientItem::SetItemRects).
A extensão do RECIPIENTE é um pouco mais complexa para calcular.Se o recipiente tiver chamado COleServerItem::OnSetExtent (com uma chamada para COleClientItem::SetExtent), e a extensão do CONTÊINER é esse valor convertido em pixels com base no número de pixels por polegada lógica.Se o recipiente não chamado SetExtent (que é geralmente o caso), a extensão do CONTÊINER é o tamanho retornado de COleServerItem::OnGetExtent.Portanto, se o recipiente não tiver chamado SetExtent, a estrutura pressupõe que se fazia no recipiente seria ter chamado com 100% da extensão natural (o valor retornado de COleServerItem::GetExtent).Indicado de outra forma, a estrutura pressupõe que o contêiner está exibindo 100% (não mais, nem menos) do item.
É importante observar que, embora COleServerItem::OnSetExtent e COleServerItem::OnGetExtent tenham nomes semelhantes, eles não manipular o mesmo atributo do item.OnSetExtentchamado para informar o servidor quanto o objeto está visível no recipiente (independentemente do fator de zoom) e OnGetExtent é chamado pelo contêiner para determinar o tamanho ideal do objeto.
Examinando cada uma das APIs envolvidas, você pode obter uma imagem mais nítida:
COleServerItem::OnGetExtent
Esta função deve retornar "tamanho natural" em DÉCIMOS de milímetros do item.A melhor maneira de pensar em "tamanho natural" é defini-lo como o tamanho pode aparecer quando impressa.O tamanho retornado aqui é constante para um conteúdo de item específico (como um metarquivo, que é constante para um determinado item muito).Esse tamanho não é alterado quando o zoom é aplicado ao item.Geralmente não é alterado quando o recipiente fornece o item mais ou menos espaço chamando OnSetExtent.Um exemplo de uma alteração pode ser que um editor de texto simples com nenhum recurso de "margem" recuo de texto com base na extensão na última enviada pelo contêiner.Se alterar um servidor, o servidor provavelmente deve definir o OLEMISC_RECOMPOSEONRESIZE bit no registro do sistema (consulte a documentação do SDK OLE para obter mais informações sobre essa opção).
COleServerItem::OnSetExtent
Essa função é chamada quando contêiner mostra "mais ou menos" do objeto.A maioria dos recipientes não chamará isso todo.A implementação padrão armazena o último valor recebido do contêiner 'm_sizeExtent', que é usado no COleServerDoc::GetZoomFactor ao calcular o valor da extensão do CONTÊINER descrito acima.
COleServerDoc::OnSetItemRects
Essa função é chamada somente quando o documento está ativo no local.Ele é chamado quando contêiner atualiza a posição do item ou o recorte aplicado ao item.O retângulo de posição, como discutido acima, fornece o numerador para o cálculo do fator de zoom.Um servidor pode solicitar que a posição do item alterado chamando COleServerDoc::RequestPositionChange.O contêiner pode ou não pode responder a essa solicitação chamando OnSetItemRects (com uma chamada 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 zoom atual.O contêiner será dimensionado metarquivo conforme apropriado.Esta é uma distinção importante entre o modo de exibição OnDraw e o item de servidor OnDraw.As alças de exibição Zoom, o item apenas cria um zoomable metarquivo e deixa para o recipiente de zoom apropriado.
A melhor maneira de garantir que seu servidor se comporta corretamente é usar a implementação de COleServerDoc::GetZoomFactor se o documento estiver ativo no local.
Suporte a MFC In loco redimensionamento
MFC totalmente implementa a interface de redimensionamento de local, conforme descrito na especificação OLE 2.A interface do usuário é suportada pelo COleResizeBar de classe, uma mensagem personalizada WM_SIZECHILDe tratamento especial desta mensagem em COleIPFrameWnd.
Talvez queira implementar diferente tratar essa mensagem diferente do que é fornecido pela estrutura.Conforme descrito acima, a estrutura deixa os resultados de redimensionamento no local até o recipiente — o servidor responde a alterações no fator de zoom.Se o recipiente reage definindo a ambos extensão do RECIPIENTE e retângulo posição durante o processamento de sua COleClientItem::OnChangeItemPosition (chamado como resultado de uma chamada para COleServerDoc::RequestPositionChange) e redimensionamento no local resultará em mostrando "mais ou menos" do item na janela de edição.Se o recipiente reage definindo apenas o retângulo posição durante o processamento de COleClientItem::OnChangeItemPosition, o fator de zoom será alterado e será mostrado o item "Zoom in ou out."
Um servidor pode controlar (em algum grau), o que acontece durante essa negociação.Por exemplo, uma planilha pode eleger 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 as margens da página"" para que eles são a mesma janela e quebrar o texto para a nova margem.Implementam servidores isso alterando a extensão natural (o tamanho retornado de COleServerItem::OnGetExtent) quando o redimensionamento é feito.Isso fará com que o retângulo de posição e a extensão do RECIPIENTE alterar o mesmo valor, resultando no mesmo fator de 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á mudando quando o usuário redimensiona o item, em vez da área de visualização.
Você pode implementar o redimensionamento personalizado e ainda aproveitar a interface de 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, consulte técnico Observação 24.