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