Compartilhar via


Como implementar o acompanhamento no código

Para acompanhar um item OLE, você precisa lidar com determinados eventos relacionados ao item, como clicar no item ou atualizar o modo de exibição do documento. Em todos os casos, é suficiente declarar um objeto CRectTracker temporário e manipular o item por meio desse objeto.

Quando um usuário seleciona um item ou insere um objeto com um comando de menu, você precisa inicializar o rastreador com os estilos adequados para representar o estado do item OLE. A tabela a seguir descreve as convenções usadas pelo exemplo OCLIENT. Para obter mais informações sobre esses estilos, confira CRectTracker.

Estilos de contêiner e estados do item OLE

Estilo exibido Estado do item OLE
Borda pontilhada O item está vinculado
Borda sólida O item está inserido no seu documento
{1>Alças de redimensionamento<1} O item está selecionado atualmente
Borda hachurada O item está atualmente ativo no local
Item de sobreposições do padrão de hachura O servidor do item está aberto

Você pode trabalhar essa inicialização facilmente usando um procedimento que verifica o estado do item OLE e define os estilos apropriados. A função SetupTracker encontrada no exemplo OCLIENT demonstra a inicialização do rastreador. Os parâmetros para essa função são o endereço do rastreador, pTracker; um ponteiro para o item do cliente que está relacionado ao rastreador, pItem; e um ponteiro para um retângulo, pTrueRect. Para obter um exemplo mais completo dessa função, consulte o OCLIENT de exemplo OLE do MFC.

O exemplo de código SetupTracker apresenta uma única função; as linhas da função são intercaladas com a discussão dos recursos da função:

void CMainView::SetupTracker(CRectTracker* pTracker, CRectItem* pItem,
   CRect* pTrueRect)

O rastreador é inicializado definindo o tamanho mínimo e limpando o estilo do rastreador.

// set minimum size for our OLE items
pTracker->m_sizeMin.cx = 8;
pTracker->m_sizeMin.cy = 8;

pTracker->m_nStyle = 0;

As linhas a seguir verificam se o item está selecionado no momento e se está vinculado ao documento ou inserido nele. As alças de redimensionamento localizadas no interior da borda são adicionadas ao estilo, indicando que o item está selecionado no momento. Se o item estiver vinculado ao documento, será usado o estilo de borda pontilhada. Uma borda sólida será usada se o item estiver inserido.

// setup resize handles if item is selected
if (pItem == m_pSelection)
pTracker->m_nStyle |= CRectTracker::resizeInside;

// put correct border depending on item type
if (pItem->GetType() == OT_LINK)
pTracker->m_nStyle |= CRectTracker::dottedLine;
else
pTracker->m_nStyle |= CRectTracker::solidLine;

O código a seguir sobrepõe o item com um padrão hachurado se o item estiver aberto no momento.

// put hatching over the item if it is currently open
if (pItem->GetItemState() == COleClientItem::openState ||
   pItem->GetItemState() == COleClientItem::activeUIState)
{
   pTracker->m_nStyle |= CRectTracker::hatchInside;
}

Em seguida, você pode chamar essa função sempre que o rastreador precisar ser exibido. Por exemplo, chame essa função a partir da função OnDraw da classe de exibição. Isso atualiza a aparência do rastreador sempre que o modo de exibição é pintado novamente. Para obter um exemplo completo, consulte a função CMainView::OnDraw do OCLIENT de exemplo OLE do MFC.

No seu aplicativo ocorrerão eventos que exigem o código do rastreador, como redimensionamento, movimentação ou detecção de cliques. Essas ações geralmente indicam que está sendo feita uma tentativa para capturar ou mover o item. Nesses casos, você precisará decidir o que foi capturado: um identificador de redimensionamento ou uma parte da borda entre alças de redimensionamento. O manipulador de mensagens OnLButtonDown é um bom lugar para testar a posição do mouse em relação ao item. Faça uma chamada para CRectTracker::HitTest. Se o teste retornar algo além de CRectTracker::hitOutside, o item estará sendo redimensionado ou movido. Portanto, você deve fazer uma chamada para a função membro Track. Para obter um exemplo completo, consulte a função CMainView::OnLButtonDown localizada no OCLIENT de exemplo OLE do MFC.

A classe CRectTracker fornece várias formas de cursor diferentes usadas para indicar se uma operação de mover, redimensionar ou arrastar está em andamento. Para manipular esse evento, verifique se o item atualmente sob o mouse está selecionado. Se estiver, faça uma chamada para CRectTracker::SetCursor ou chame o manipulador padrão. O exemplo a seguir é do OCLIENT de exemplo OLE do MFC:

BOOL CMainView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
   if (pWnd == this && m_pSelection != NULL)
   {
      // give the tracker for the selection a chance
      CRectTracker tracker;
      SetupTracker(&tracker, m_pSelection);
      if (tracker.SetCursor(this, nHitTest))
         return TRUE;
   }
   return CScrollView::OnSetCursor(pWnd, nHitTest, message);
}

Confira também

Controladores: implementando controladores no aplicativo OLE