TN040: MFC/OLE in-loco redimensionamento e Zooming

Esta anotação irá discutir as questões relativas à edição de local e como um servidor deve realizar zoom correto e in loco redimensionamento. Com a ativação in-loco, o conceito WYSIWYG é levado um passo adiante em que recipientes e servidores cooperarem uns com os outros e em particular interpretam a especificação de OLE em muito da mesma maneira.

Por causa da forte interação entre um contêiner e um servidor de suporte para ativação no local há um certo número de expectativas do usuário final que deve ser mantido:

&Notanbsp;  Porque ativação in-loco só se aplica a itens que são incorporados (não ligados), zoom só se aplica aos objetos incorporados. Você verá em COleServerItem e COleServerDoc são APIs usadas para zoom. A razão para esta 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 classe COleServerDoc (da perspectiva do servidor, é o documento que está incorporado).

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

Suporte do MFC para zoom

O fator de zoom atual pode ser determinado por chamado COleServerDoc::GetZoomFactor. Chamando isto 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 no ativo local pode retornar algo diferente de 100 %.

Para obter um exemplo do zoom corretamente, consulte o MFC OLE exemplo HIERSVR. Zoom em HIERSVR é complicado pelo fato de que ele exibe texto — e texto, em geral, não se adapta de forma linear (dicas, convenções tipográficas, design de larguras e alturas todos complicam o assunto). Ainda assim, HIERSVR é uma referência razoável para aplicar zoom corretamente e, portanto o Tutorial do MFC Rabisco (etapa 7).

COleServerDoc::GetZoomFactor determina o fator de zoom com base em um número de métricas diferentes disponíveis do contêiner ou da implementação de suas classes de COleServerItem e COleServerDoc . Em suma, o fator de zoom atual é determinado pela seguinte fórmula

Retângulo (PR) posição / medida do recipiente (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 é atualizada quando o contêiner chama COleServerDoc::OnSetItemRects do servidor (com uma chamada para COleClientItem::SetItemRects).

Na medida do recipiente é ligeiramente mais complexa para calcular. Se o contêiner foi chamado COleServerItem::OnSetExtent (com uma chamada para COleClientItem::SetExtent), em seguida, na medida do recipiente é esse valor convertido em pixels com base no número de pixels por polegada lógica. Se o contêiner não tiver chamado SetExtent (que é geralmente o caso), na medida do recipiente é o tamanho retornado de COleServerItem::OnGetExtent. Assim, se o contêiner não tiver chamado SetExtent, quadro pressupõe que se fêz o contêiner teria chamado ele com 100% da extensão natural (o valor retornado do COleServerItem::GetExtent). Ou dito de outra maneira, o quadro pressupõe que o contêiner está exibindo 100% (nem mais, nem menos) do item.

É importante observar que, apesar de COleServerItem::OnSetExtent e COleServerItem::OnGetExtent têm nomes semelhantes, eles não manipulam o mesmo atributo do item. OnSetExtent é chamado para permitir que o servidor sabe quanto o objeto está visível no contêiner (independentemente do fator de zoom) e OnGetExtent é chamado pelo contêiner para determinar o tamanho ideal do objeto.

Olhando para cada uma das APIs envolvidos aqui você pode obter uma imagem mais clara:

COleServerItem::OnGetExtent

Esta função deve retornar o tamanho"natural" em HIMÉTRICAS unidades 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 (muito parecido com o metarquivo, que é constante para um item em particular). Este tamanho não se altera quando o zoom é aplicado ao item. Ele geralmente não se altera quando o contêiner dá o item mais ou menos espaço, chamando OnSetExtent. Um exemplo de mudança pode ser o de um editor de texto simples com nenhum recurso de "margem" encapsulada texto baseado na última extensão enviada pelo contêiner. Se um servidor for alterado, o servidor provavelmente deve definir OLEMISC_RECOMPOSEONRESIZE bit no registro do sistema (consulte a documentação de OLE SDK para obter mais informações sobre esta opção).

COleServerItem::OnSetExtent

Essa função é chamada quando o contêiner mostra "mais ou menos" do objeto. A maioria dos recipientes não irão chamar isso de todo. 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 medida de contêiner descrito acima.

COleServerDoc::OnSetItemRects

Essa função é chamado somente quando o documento está ativo no local. É chamado quando o 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 ser alterados por chamado COleServerDoc::RequestPositionChange. O contêiner pode ou não pode responder a este pedido 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 metarquivo do mesmo, independentemente do fator de zoom atual. O contêiner será escala o metarquivo conforme apropriado. Esta é uma distinção importante entre a exibição OnDraw e do item servidor OnDraw. As alças de exibição Zoom, o item apenas cria um zoomable metarquivo e deixa-lo até ao recipiente para fazer o 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 do MFC para In loco redimensionamento

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

Você pode querer implementar manipulação diferente desta mensagem do que o que é fornecido pela estrutura. Como descrito acima, o quadro deixa os resultados in loco redimensionamento até ao recipiente — o servidor responde a alterações no fator de zoom. Se o contêiner reage, definindo a extensão ambos Contêiner e retângulo posição durante o processamento da sua COleClientItem::OnChangeItemPosition (chamado de uma chamada para COleServerDoc::RequestPositionChange), então o lugar redimensionar resultará em mostrando "mais ou menos" do item na janela de edição. Se o contêiner reage, definindo apenas o retângulo posição durante o processamento de COleClientItem::OnChangeItemPosition, o fator de zoom vai mudar e o item será mostrado "zoom in ou out."

Um servidor pode controlar (até certo ponto) o que acontece durante essa negociação. Por exemplo uma folha de cálculo, pode eleger para 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 o mesmo que a janela e reajustar o texto para a nova margem. Servidores de implementam isso, alterando a extensão natural (o tamanho retornado de COleServerItem::OnGetExtent) quando o redimensionamento é feito. Isso fará com que o retângulo posição e na medida do Contêiner alterar pelo mesmo montante, resultando no mesmo fator de zoom, mas um maior ou menor área de visualização. Além disso, mais ou menos do documento será visível no metarquivo gerado pelo OnDraw. Neste caso, o próprio documento está mudando quando o usuário redimensiona o item, em vez de apenas a área de visualização.

Você pode implementar personalizadas redimensionamento e ainda aproveitar a interface de usuário fornecida pelo COleResizeBar , substituindo a mensagem WM_SIZECHILD em sua classe de COleIPFrameWnd . Para obter mais informações sobre as especificações de WM_SIZECHILD, consulte técnico Anotação 24.

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index